Service的使用
Service:
当service未被启动过的情况下被启动时,会执行onCreate和onStartCommand,若已被启动过,则每次启动只执行onStartCommand。
Service的绑定通过在其内部创建一个MyBinder继承Binder,并通过onBind返回实例,这样绑定的活动就能执行MyBinder内部的方法。
而在MyBinder内部写一个获取MyService实例的getService方法,绑定的活动通过该方法获取MyService实例就能调用MyService的公共类。
public class MyService extends Service {
private String TAG = "ServiceLife_service";
private MyBinder myBinder = new MyBinder();
class MyBinder extends Binder{
public void doBinder(){
Log.d(TAG,"doBinder");
}
public MyService getService(){
return MyService.this;
}
}
public MyService() {
}
public void doService(){
Log.d(TAG,"doService");
}
@Override
public IBinder onBind(Intent intent) {
Log.d(TAG,"onBind");
// TODO: Return the communication channel to the service.
return myBinder;
}
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG,"onCreate");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d(TAG,"onStartCommand");
return super.onStartCommand(intent, flags, startId);
}
@Override
public boolean onUnbind(Intent intent) {
Log.d(TAG,"onUnbind");
return super.onUnbind(intent);
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d(TAG,"onDestroy");
}
}
Activity:
首先创建ServiceConnection的匿名类,重写onSericeConnected()和onServiceDisconnected()方法。在onSericeConnected()内向下转型得到MyBinder,在通过MyBinder的getService方法获取Service实例,接下来就能调用Service里的公共方法了。而onServiceDisconnected()则是在断开绑定时将获得的Service实例置空
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.d(TAG,"onServiceConnected");
myBinder = (MyService.MyBinder) service;
myBinder.doBinder();
myService = myBinder.getService();
}
@Override
public void onServiceDisconnected(ComponentName name) {
myService = null;
}
};
绑定并执行Service的公共方法:
case R.id.btn_bindService:
//绑定Service
Intent bindIntent = new Intent(this, MyService.class);
bindService(bindIntent, connection, BIND_AUTO_CREATE);
break;
case R.id.btn_doService:
//执行Service里的公共方法
if (null != myService) {
myService.doService();
}
break;
结果:
Service的生命周期
五个Button分别执行startService,stopService,bindService,unBindService和doService(执行Service的公共方法)。
1.startService→stopService
多次启动Service,onCreate只会执行一次,onStartCommand会多次执行。若在未绑定的情况下解绑Service程序会崩溃,而在未启动的情况下stopService则没关系。
[图片上传中...(image.png-1759dd-1551576698431-0)]
2.bindService→unBindService
解绑后ServiceConnection的onServiceDisconnected并未执行,是因为只有在Service 被破坏了或者被杀死的时候调用,连接正常情况下不会执行。
3.startService→bindService→stopService→unBindService
被启动并绑定的Service只有在被stopService和unbindService的情况下才会被销毁(onDestroy)。只执行unbindService只会解绑(onUnbind),而只执行stopService则没有任何效果。
4.总结
startService
bindService
stopService
unbindService
其他
当Activity被销毁时
https://blog.csdn.net/weixin_40876113/article/details/83750212
BIND_AUTO_CREATE和BIND_WAIVE_PRIORITY
https://blog.csdn.net/pan11115111/article/details/70236354
在4.0之前,Service的优先级被默认视同后台任务,如果设置了BIND_AUTO_CREATE则Service的优先级将等同于宿主进程,也就是调用bindService的进程。
在4.0及以上就完全变了,Service的优先级默认等同于宿主进程,只有设置了BIND_WAIVE_PRIORITY才会使Service的被当做后台任务对待,WAIVE就是放弃的意思嘛。
优先级:https://blog.csdn.net/qpc908694753/article/details/71244334