android本地后台服务示例
在android编写Service入门中介绍了android的两种后台服务,本地和远程的。这里用本地服务做了一个模拟定时后台发短信的技术原型。
启动该示例应用的样子:

选择启动:

启动后,可看到ddms logcat日志:

这是操作:启动、停止和退出应用,显示的调试日志信息。模拟后台服务每5秒钟发送一次短信信息。
主要代码,后台服务SmsService:
package com.easymorse; import android.app.Service; import android.content.Intent; import android.os.Binder; import android.os.IBinder; import android.util.Log; public class SmsService extends Service { private boolean started; private boolean threadDisable; private ServiceBinder serviceBinder = new ServiceBinder(); public class ServiceBinder extends Binder implements ISmsService { @Override public boolean isStarted() { return started; } @Override public void start() { started=true; Log.d(“sms.service”, “sms service started.”); } @Override public void stop() { started=false; Log.d(“sms.service”, “sms service stopped.”); } } @Override public IBinder onBind(Intent intent) { return serviceBinder; } @Override public void onCreate() { super.onCreate(); Thread thread = new Thread() { @Override public void run() { while (!threadDisable) { try { if (started) { Log.d(“sms.service”, “send a sms message.”); } Thread.sleep(1000 * 5); } catch (InterruptedException e) { } } } }; thread.start(); Log.d(“sms.service”, “sms service created.”); } @Override public void onDestroy() { super.onDestroy(); threadDisable = true; Log.d(“sms.service”, “sms service shutdown.”); } }
前台的Actvity代码,SmsServiceOptions:
package com.easymorse; import android.app.TabActivity; import android.content.ComponentName; import android.content.Intent; import android.content.ServiceConnection; import android.os.Bundle; import android.os.IBinder; import android.util.Log; import android.widget.RadioGroup; import android.widget.TabHost; import android.widget.RadioGroup.OnCheckedChangeListener; public class SmsServiceOptions extends TabActivity { private RadioGroup radioGroup; private ISmsService smsService; private ServiceConnection serviceConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { smsService = (ISmsService) service; if (smsService.isStarted()) { radioGroup.check(R.id.radioButtonStart); } else { radioGroup.check(R.id.radioButtonStop); } radioGroup .setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup group, int checkedId) { if (checkedId == R.id.radioButtonStart) { Log.d(“sms.service”, “starting service…”); smsService.start(); } else { Log.d(“sms.service”, “stopping service…”); smsService.stop(); } } }); } @Override public void onServiceDisconnected(ComponentName name) { smsService = null; } }; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); this.setTitle(“短信服务器”); this.bindService(new Intent(“com.easymorse.SmsService”), this.serviceConnection, BIND_AUTO_CREATE); TabHost tabHost = this.getTabHost(); tabHost.setup(); TabHost.TabSpec spec = tabHost.newTabSpec(“服务选项”); spec.setContent(R.id.Option01); spec.setIndicator(“服务选项”); tabHost.addTab(spec); spec = tabHost.newTabSpec(“服务状态”); spec.setContent(R.id.Option02); spec.setIndicator(“服务状态”); tabHost.addTab(spec); radioGroup = (RadioGroup) this.findViewById(R.id.radioGroup01); } @Override protected void onDestroy() { super.onDestroy(); this.unbindService(serviceConnection); } }
另外,不要忘记在配置文件中增加对service的声明,见AndroidManafest.xml:
<?xml version=”1.0″ encoding=”utf-8″?> <manifest xmlns:android=”http://schemas.android.com/apk/res/android” package=”com.easymorse” android:versionCode=”1″ android:versionName=”1.0″> <application android:[email protected]/icon” android:[email protected]/app_name”> <activity android:name=”.SmsServiceOptions” android:[email protected]/app_name”> <intent-filter> <action android:name=”android.intent.action.MAIN” /> <category android:name=”android.intent.category.LAUNCHER” /> </intent-filter> </activity> <service android:name=”.SmsService”> <intent-filter> <action android:name=”com.easymorse.SmsService”></action> </intent-filter> </service> </application> <uses-sdk android:minSdkVersion=”3″ /> </manifest>
1 楼 cdn_mn_mm 2011-09-21
什么时候调用service的onDestroy方法呢
2 楼 ming_fanglin 2011-09-22
stopService 时