Service生命周期
知識點:
Service中的onBind方法,返回IBinder接口,如果直接實現(xiàn),方法數(shù)太多,因此返回自定義MyBinder繼承Binder類
@Override
public IBinder onBind(Intent intent) {
return new IBinder() {
@Override
public String getInterfaceDescriptor() throws RemoteException {
return null;
}
@Override
public boolean pingBinder() {
return false;
}
@Override
public boolean isBinderAlive() {
return false;
}
合理的寫法
@Override
public IBinder onBind(Intent intent) {
Log.i("zhang","服務(wù) onBind");
return new MyBinder();
}
public class MyBinder extends Binder {
//自定義方法
//比如 我要獲取這個service
public MyService getService() {
return MyService.this;
}
}
綁定服務(wù)會隨著Activity結(jié)束而結(jié)束,啟動服務(wù)則不受activity影響
MainActivity
private ServiceConnection mConnection=new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.i("zhang","服務(wù) mConnection onServiceConnected");
}
@Override
public void onServiceDisconnected(ComponentName name) {
Log.i("zhang","服務(wù) mConnection disConnected");
}
};
@butterknife.OnClick({R.id.start, R.id.stop, R.id.bind, R.id.unbind})
public void onViewClicked(View view) {
switch (view.getId()) {
case R.id.start:
Intent intent = new Intent(MainActivity.this, MyService.class);
startService(intent);
break;
case R.id.stop:
stopService(new Intent(MainActivity.this, MyService.class));
break;
case R.id.bind:
Intent bindintent = new Intent(MainActivity.this, MyService.class);
bindService(bindintent,mConnection,BIND_AUTO_CREATE);
break;
case R.id.unbind:
unbindService(mConnection);
break;
}
}
MyService
@Override
public IBinder onBind(Intent intent) {
Log.i("zhang","服務(wù) onBind");
return new MyBinder();
}
@Override
public void onCreate() {
super.onCreate();
Log.i("zhang","服務(wù) onCreate");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i("zhang","服務(wù) onStartCommand");
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
Log.i("zhang","服務(wù) onDestroy");
}
@Override
public boolean onUnbind(Intent intent) {
Log.i("zhang","服務(wù) onUnbind");
return super.onUnbind(intent);
}
public class MyBinder extends Binder {
//自定義方法
//比如 我要獲取這個service
public MyService getService() {
return MyService.this;
}
}
AndroidManifest
<service
android:name=".MyService">
</service>
運行
1. start -> stop
說明啟動service,一定會調(diào)用onStartCommand方法
2. start -> start
重復(fù)啟動service,只會調(diào)用一次onCreate方法,onStartCommand可多次調(diào)用
3. bind -> unbind
bind也能創(chuàng)建service,執(zhí)行onCreate方法
4. bind -> start
bind之后start service,不會重新onCreate,只會執(zhí)行onStartCommond
5. bind -> start -> stop
6. bind -> start -> unbind
bind創(chuàng)建的Service,start之后,unbind只能解綁,不能銷毀
7.bind -> start -> unbind ->stop
同上5,6,7對比,說明bind創(chuàng)建的Service,start之后,如果要銷毀service,必須先unbind,然后stop,才能銷毀
8. bind -> bind
重復(fù)bind并未執(zhí)行任何方法
9. bind -> start ->unbind ->bind
若要執(zhí)行ServiceConnection的方法,必須先unbind,然后bind調(diào)用
即可獲得值service中的值,達到實時監(jiān)控service中的值方法
10. bind -> 點擊返回鍵
activity銷毀之后,bind的service也unbind,銷毀
11. bind -> start ->點擊返回鍵
中間加了start步驟,即使activity銷毀之后,service也不會被銷毀,只會解綁
案例:
耗時操作放在onStartCommond中執(zhí)行
實時獲取線程中的值,需要bind
bind之后,start執(zhí)行,然后重復(fù)unbind bind操作,就可以通過serviceConn中的方法獲取值
MainActivity
private ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
MyService.MyBinder binder = (MyService.MyBinder) service;
int count = binder.getCount();
Log.i("zhang", " mConnection onServiceConnected count " + count);
}
@Override
public void onServiceDisconnected(ComponentName name) {
Log.i("zhang", "服務(wù) mConnection disConnected");
}
};
MyService
public int count = 0;
public MyService() {
}
@Override
public IBinder onBind(Intent intent) {
Log.i("zhang","onBind");
return new MyBinder();
}
@Override
public void onCreate() {
Log.i("zhang","onCreate");
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i("zhang","onStartCommand");
new Thread(new Runnable() {
@Override
public void run() {
for (count = 0; count < 100; count++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
}
@Override
public boolean onUnbind(Intent intent) {
Log.i("zhang","onUnbind");
return super.onUnbind(intent);
}
public class MyBinder extends Binder {
public int getCount(){
return count;
}
}
結(jié)果:
start -> unbind -> bind -> unbind -> bind......