1 简介
服务是Android四大组件之一。不过与Activity不同的是,服务不会直接与用户交互,而是摸摸地在后台运行。
有两种方式来启动系统服务。
一种是调用 Context.startService() 方法。
另一种是调用 Context.bindService() 方法。
2 服务的生命周期
下面这张图说明了服务的生命周期。当用户调用Context.startService()或者Context.binService()时,系统会启动服务。
如果服务没有创建,那么系统首先会调用Service类中的onCreate()方法,然后onStart()方法或者onBind()方法将会执行,开启一个服务。
服务会一直默默地在后台进行,调用Context.stopService()或stopSelf()方法,服务中的onDestroy()会执行,销毁服务。
当通过Context.bindService()开启服务后,必须通过Context.unbindService()停止服务。
3 实例
3.1 通过Context.startService()启动服务
首先新建一个类,继承Service类。
public class MyService extends Service{ @Override public IBinder onBind(Intent intent){ return null; } @Override public void onCreate(){ super.onCreate(); Log.d("MyService","onCreate executed!"); } @Override public void onStart(Intent intent, int startId){ super.onStart(); Log.d("MyService","onStart executed!"); } @Override public void onDestroy(){ super.onDestroy(); Log.d("MyService","onDestroy executed!"); } }
然后在活动中通过点击按钮,实现活动的启动或停止。
3.1 通过Context.bindService()启动服务
上面的方式,我们只能通过活动界面的按钮来启动和停止服务。如果服务想要跟活动更多的交流,就需要采用另外一种方式来开启活动。
1、通过Context.bindService()启动服务,我们同样需要继承Service类,重写onBind()方法。
在onBind()方法中我们返回一个Binder对象。Binder类的API定义如下:
下面是具体代码:
public class MyService extends Service { private DownloadBinder mBinder = new DownloadBinder(); DownloadBinder extends Binder { public void startDownload() { Log.d("MyService", "startDownload executed"); } public int getProgress() { Log.d("MyService", "getProgress executed"); return 0; } } @Override public IBinder onBind(Intent intent) { return mBinder; } …… }
可以看到我们定义了一个内部类DownloadBinder继承自Binder,在这个类中我们实现了两个方法,用于启动下载和获取进度。
2、接下来就是在活动中通过Context.bindService()启动服务,并且用上面的DownloadBinder中定义的方法,与服务随时交互。
下面是具体代码
public class MainActivity extends Activity implements OnClickListener { private Button bindService; private Button unbindService; private MyService.DownloadBinder downloadBinder; private ServiceConnection connection = new ServiceConnection() { @Override public void onServiceDisconnected(ComponentName name) { } @Override public void onServiceConnected(ComponentName name, IBinder service) { downloadBinder = (MyService.DownloadBinder) service; downloadBinder.startDownload(); downloadBinder.getProgress(); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); …… bindService = (Button) findViewById(R.id.bind_service); unbindService = (Button) findViewById(R.id.unbind_service); bindService.setOnClickListener(this); unbindService.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.bind_service: Intent bindIntent = new Intent(this, MyService.class); bindService(bindIntent, connection, BIND_AUTO_CREATE); // 绑定服务 break; case R.id.unbind_service: unbindService(connection); // 解绑服务 break; default: break; } } }