public class MyService extends Service { @Nullable @Override public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { super.onCreate(); Log.i("msg","onCreate"); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.i("msg","onStartCommand"); return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy() { Log.i("msg","onDestroy"); super.onDestroy(); } }
现在有两个activity,MainActivity、UselessActivity,MainActivity有个按钮启动UselessActivity,UselessActivity启动MyServier
1.MainActivity启动UselessActivity后,UselessActivity启动MyService,StartService(Intent)。
Log.i=msg: onCreate msg: onStartCommand
①如果UselessActivity中不调用stopService(Intent):
按返回到MainActivity,并不会打出Log.i=msg: onDestroy. ★服务不会随着启动它的Activity一起销毁。★
再按返回退出程序,再打开程序,启动service,打出Log.i=onStartCommand.而没有打出msg: onCreate,说明service还在 ★服务不会随着启动它的程序退出被销毁。★
再按返回退出程序,并在手机的程序列表里把程序给删除掉,再打开程序,启动service,打出Log.i=onStartCommand.而没有打出msg: onCreate,说明service还在 ★服务不会因为启动它的程序被销毁而销毁。★
②如果在UselessActivity中的onDestroy调用stopService(Intent):
UselessActivity:
@Override protected void onDestroy() { super.onDestroy(); stopService(intent); }
按返回到MainActivity,打出Log.i=msg: onDestroy. ★需要调用stopService(Intent),service才会被销毁。★
-----------------------------------------------------------完美分割线----------------------------------------------------------------------------
public class MyService extends Service { MyBinder myBinder; @Nullable @Override public IBinder onBind(Intent intent) { if(myBinder == null){ myBinder = new MyBinder(); } Log.i("msg","onBind"); return myBinder; } @Override public boolean onUnbind(Intent intent) { Log.i("msg","onUnBind"); return super.onUnbind(intent); } @Override public void onCreate() { super.onCreate(); Log.i("msg","onCreate"); } public class MyBinder extends Binder{ public MyService getService(){ return MyService.this; } } @Override public void onDestroy() { Log.i("msg","onDestroy"); super.onDestroy(); } }
MainActivity启动UselessActivity后,UselessActivity启动MyService,bindService(Intent)。
Log.i=msg: onCreate msg: onBind
①如果UselessActivity中不调用unbindService(conn):
按返回到MainActivity,会报ServiceConnectionLeaked的错误,同时会Log打出msg: onUnBind msg: onDestroy ★要求当绑定服务的活动退出时要调用解除绑定方法,如果没有调用,则程序自动调用★
总结:startService新建的服务,存在于后台,不依赖启动它的Activity,销毁Activity,服务依然存在
bindService新建的服务,存在于后台,与启动它的Activity有交互关系,需要“同生同死”,销毁Activity,要求开发者自动unbindService,否则报异常警告,但不崩溃,同时程序自己调类似unbindService的方法,销毁服务。
适用情况:startService新建的服务,适合后台下载等耗时但与Activity没有交互或几乎没有交互。
bindService新建的服务,适合进行耗时操作,同时结果需要返回给Activity,Activity也有对服务进行控制的需要的操作,比如音乐播放器。
PS: ★如果同时startService、bindService 那个要销毁这个服务(onDestroy)的话,需要调用unbindService和stopService才可以,先后顺序不计。★
★可以多个Activity绑定同一个服务类,只算一个服务,每一个Activity退出时都需要unbindService。★