Service介绍
Service是android 系统中的四大组件之一,它跟Activity的级别差不多,但不能页面显示只能后台运行,并且可以和其他组件进行交互。
比如:下载、播放音乐等
我们一定要知道的是这里Service的后台运行并不是子线程。Service的运行是在主线程中进行的,只是它没有界面显示而已,它的耗时操作同样需要开启子线程,否者会跟Activity一样出现ANR(application not response–程序没有响应)。
我们要知道的是主线程的内容包括UI和后台。只要程序中的UI或后台其中一个在跑,程序都算是在运行状态。
服务有两种方式启动
Context.startService() 和 Context.bindService()
startService()生命周期分析
(1)启动服务startService : –>onCreate()–> onStart()
(2)停止服务stopService : –>onDestroy()
如果调用者直接退出而没有停止Service,则Service 会一直在后台运行。这里的退出只是关闭了UI界面。
startService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方 法,接着调用onStart()方法。如果调用startService()方法前服务已经被创建,多次调用 startService()方法并不会导致多次创建服务,但会导致多次调用onStart()方法。采用 startService()方法启动的服务,只能调用stopService()方法结束服务,服务结束时 会调用生命周期的onDestroy()方法。
bindService()生命周期分析
(1)绑定bindService : –> onCreate() –> onBind()
(2)解绑unbindService: –>onUnbind()
(3)正常停止程序服务的方法是先解绑unbindService,再停止服务stopService。
(4)如果绑定后调用stopService 方法,这时是不能停止服务的,如果这时再调用解绑unbindService,程序后先解绑,后停止服务。
用bindService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate() 方法,接着调用onBind()方法。这个时候调用者和服务绑定在一起,
调用者退出了,系统就会先调用服务的onUnbind()方法,接着调用onDestroy()方法。如果调用bindService()方法前服务已经被绑定,多次调用bindService()方法并不会导致多次创建服务及绑定(也就是说 onCreate()和onBind()方法并不会被多次调用)。如果调用者希望与正在绑定的服务解除绑 定,可以调用unbindService()方法,调用该方法也会导致系统调用服务的onUnbind()->onDestroy()方法。
第二种方式启动
public class MyService extends Service {
public MyService() {
}
@Override
public IBinder onBind(Intent intent) {
return new MyBinder();
}
@Override
public void onCreate() {
super.onCreate();
Log.i("tag", "onCreate: 服务");
}
public class MyBinder extends Binder {
public MyService getMyserver(){
return MyService.this;
}
}
public void time(){
Toast.makeText(this, "你好世界", Toast.LENGTH_SHORT).show();
}
}
清单文件
<service
android:name=".server.MyService"
android:enabled="true"
android:exported="true"></service>
绑定
public class DataFragment extends BaseFragment {
private MyService myserver;
private ServiceConnection serviceConnection;
private Button btn;
@Override
public int layoutId() {
return R.layout.fragment_data;
}
@Override
public void initView() {
//1.绑定服务
Intent intent = new Intent(getActivity(), MyService.class);
//绑定服务连接
serviceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
MyService.MyBinder myBinder = (MyService.MyBinder) service;
myserver = myBinder.getMyserver();
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
//参数一:intent意图 参数二:绑定服务连接 参数三:flag标记BIND_AUTO_CREATE 绑定的时候自动创建服务
getActivity().bindService(intent, serviceConnection, Service.BIND_AUTO_CREATE);
btn = (Button) findViewById(R.id.btn);
}
@Override
public void initData() {
//调用服务方法
btn.setOnClickListener(v ->{
myserver.time();
});
}
@Override
public void onDestroy() {
super.onDestroy();
//解除绑定
getActivity().unbindService(serviceConnection);
}
}