Service是安卓的四大组件之一,是一个可以在后台执行长时间运行操作而不使用用户界面的应用组件。一旦service启动了,它就具备了自己的生命周期。
1.定义Service
新建MyService类。
public class MyService extends Service{
@Nullable
@Override
//唯一的一个抽象方法,必须要实现
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
}
@Override
public void onDestroy() {
super.onDestroy();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}
@Override
public boolean onUnbind(Intent intent) {
return super.onUnbind(intent);
}
}
注意和activity一样,service也需要进行注册。同时也可以为service指定过滤器进行启动。
<service android:name=".MyService">
<intent-filter>
<action android:name="xxxxx"
</intent-filter>
</service>
2.service的运行方式
2.1 启动–通过startService()方法
通过这种启动方式,即使启动服务的组件已经销毁,服务也能继续在后台进行运行。想要停止这项服务只能通过调用stopself()或者stopService()方法。另外这种方式下调用者启动服务之后,服务就开始运行服务和调用方没有信息的通信。
这种情况下service的启动停止和activity很是相似也十分简单:
启动service:
Intent intent = new Intent(this,MyService.class);
startService(intent);
停止service:
Intent intent = new Intent(this,MyService.class);
stopService(intent);
2.2 绑定–通过bindService()方法
通过这种方式,启动服务的组件和服务进行了绑定,两者之间能够进行信息的交互。一个服务可以绑定到多个组件上,当服务与所有绑定的调用组件解绑之后,服务被销毁。
我们前面提到这种方式下服务可以和与之绑定的组件进行通信,但是如何进行呢?这就会用到前面的onBind()方法。onBind()方法会返回一个Ibind对象给ServiceConnection对象的 public void onServiceConnected(ComponentName name, IBinder service)方法中的service参数,这样绑定的组件就能通过Ibinder对象和服务进行通信。
修改Myservice如下:
public class MyService extends Service{
private MyBinder myBinder = new MyBinder();
private int count;
class MyBinder extends Binder
{
// do something here: send data to activity
public int getCount()
{
return count;
}
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return myBinder;
}
}
我们在service中创建了继承自binder的内部类MyBinder,同时创建了一个它的一个实例通过onBinder()发送给绑定的组件来作为信使来传递service中的数据,接下来我们就在主活动中接收我们发送的MyBinder实例:
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private MyService.MyBinder myBinder;
private Button bind;
private Button unbind;
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//接收传递过来的MyBinder实例
myBinder = (MyService.MyBinder)service;
//Do something here: to communicate with service.
//myBinder.getCount();
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
public void onClick(View v) {
Intent intent = new Intent(this,MyService.class);
switch (v.getId())
{
case R.id.bind_service:
bindService(intent,connection,BIND_AUTO_CREATE);
break;
case R.id.unbind_service:
unbindService(connection);
break;
default:
break;
}
}
}
3.生命周期
虽然服务是在后台运行,但是一旦启动它也有自己的生命周期:
- 对于2.1方式来讲,生命周期是图片左半部分所述。当第一次启动服务或者是停止服务后重新启动服务时会依次调用onCreate()和onStartCommand()方法,否则每次启动服务只会调用onStartCommand()方法。停止服务时会调用onDestroy()方法。
- 对于2.2方式,生命周期是右半部分所述。第一次启动服务会调用onCreate()和onBind()方法,当onBind()方法调用之后就会创建一个持久的连接(这个方法在未解绑之前只会调用一次),后续调用unBinder()方法后才会回调onDestroy()方法,至此服务才正式消亡。
特别的地方
虽然我们把两种启动服务的方式分开来讲,但是并不意味着这两种方式不能同时存在。我们完全可以再调用了2.1的startService后在调用bindService方法,或者两者交换。在这种情况下如何销毁一个服务呢?具体方式如下:
本文使用 小书匠编辑器发布。