Android Serviceの使い方のまとめとライフサイクルの詳細
Service androidの4つのコンポーネントの1つで、最も重要なバックグラウンドでコントロールを実行します.1.サービスの使用方法bindServiceとstartService
まとめ:1、どんな方法でサービスを開いても、サービスは一度だけOncreateします.2、bindService方式で開いているサービスではonStartメソッドは呼び出されず、onbindとunbindServiceメソッドのみが呼び出されます3、startServiceで開いているサービスではonStartCommand 4が呼び出されます.bindServiceが何度呼び出されても、onBindではIbinderオブジェクトがnullであるかどうかによってonbind 5が呼び出されているかどうかを判断します.サービスはstartService(バックグラウンド)やbinder(フロント)サービスで実行されるスレッドがMainであることは関係ありませんので、時間のかかる操作は絶対にしてはいけません.
なぜこの結果が得られるのかAndroid IPC通信Ibinderについて知る必要がある理由がわかります.IBinderはTCP/IPサーバのようにマルチプロセス間の通信を提供しています.
ライフサイクルをテストします.まずDemo Serviceを書いて、それぞれの方法を表示します.
BindServiceのライフサイクルは次のとおりです.
まずBindServiceを見てstartServiceでライフサイクルを見ます:onCreateは一度しかありません.
複数のActivity Bindが同じServiceの場合:最初のActivity BindがServiceを通過した後、2番目の去Bindは直接Bindに戻り、onBindメソッドを呼び出すことはなく、onBindがbindを初期化するエージェントであることを証明し、Bindオブジェクトがnullでないことを発見した場合、このメソッドをトリガーしないことを直接返します.
Serviceが実行するスレッドがプライマリ・スレッドでstartServiceで起動するかどうか:currentThread:mainが表示され、サービスがプライマリ・スレッドで実行されていることを示します.
Bindメソッドで呼び出してみます:結果はstartService方式と同じで、これがサービスで時間のかかる操作ができない理由です.
結果
Intent intent = new Intent(this, MyService.class);
intent.putExtra("comid",200);
// bindService(intent,connection, Context.BIND_AUTO_CREATE);
startService(intent);
まとめ:1、どんな方法でサービスを開いても、サービスは一度だけOncreateします.2、bindService方式で開いているサービスではonStartメソッドは呼び出されず、onbindとunbindServiceメソッドのみが呼び出されます3、startServiceで開いているサービスではonStartCommand 4が呼び出されます.bindServiceが何度呼び出されても、onBindではIbinderオブジェクトがnullであるかどうかによってonbind 5が呼び出されているかどうかを判断します.サービスはstartService(バックグラウンド)やbinder(フロント)サービスで実行されるスレッドがMainであることは関係ありませんので、時間のかかる操作は絶対にしてはいけません.
なぜこの結果が得られるのかAndroid IPC通信Ibinderについて知る必要がある理由がわかります.IBinderはTCP/IPサーバのようにマルチプロセス間の通信を提供しています.
ライフサイクルをテストします.まずDemo Serviceを書いて、それぞれの方法を表示します.
public class MyService extends Service {
public static final String TAG = "MyTestService";
@Nullable
@Override
public IBinder onBind(Intent intent) {
Log.d(TAG,"onBind");
return new Mybind();
}
@Override
public void unbindService(ServiceConnection conn) {
super.unbindService(conn);
Log.d(TAG,"unbindService");
}
@Override
public void onCreate() {
Log.d(TAG,"onCreate :" );
super.onCreate();
}
@Override
public void onStart(Intent intent, int startId) {
super.onStart(intent, startId);
Log.d(TAG,"onStart :" );
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d(TAG,"onStartCommand :" + flags +" startid :" +startId);
int comid = intent.getIntExtra("comid",-1);
Log.d(TAG,"comid :" + comid);
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d(TAG,"onDestroy :" );
}
public void sayHello(){
Log.d(TAG,"say hello");
}
class Mybind extends Binder{
public MyService getService(){
return MyService.this;
}
}
BindServiceのライフサイクルは次のとおりです.
11-21 15:24:04.901 17311-17311/application D/MyTestService: onCreate :
11-21 15:24:04.902 17311-17311/application D/MyTestService: onBind
まずBindServiceを見てstartServiceでライフサイクルを見ます:onCreateは一度しかありません.
11-21 15:25:46.136 19726-19726/? D/MyTestService: onCreate :
11-21 15:25:46.137 19726-19726/? D/MyTestService: onBind
11-21 15:25:46.138 19726-19726/? D/MyTestService: onStartCommand :0 startid :1
11-21 15:25:46.138 19726-19726/? D/MyTestService: onStart :
複数のActivity Bindが同じServiceの場合:最初のActivity BindがServiceを通過した後、2番目の去Bindは直接Bindに戻り、onBindメソッドを呼び出すことはなく、onBindがbindを初期化するエージェントであることを証明し、Bindオブジェクトがnullでないことを発見した場合、このメソッドをトリガーしないことを直接返します.
11-21 15:33:34.758 25373-25373/application D/MyTestService: onCreate :
11-21 15:33:34.759 25373-25373/application D/MyTestService: onBind
11-21 15:33:34.836 25373-25373/application D/MyTestService: .Main3ActivityonServiceConnected :application.service.MyService$Mybind@3384e154
11-21 15:33:39.284 25373-25373/application D/MyTestService: .Main4ActivityonServiceConnected :application.service.MyService$Mybind@3384e154
Serviceが実行するスレッドがプライマリ・スレッドでstartServiceで起動するかどうか:currentThread:mainが表示され、サービスがプライマリ・スレッドで実行されていることを示します.
11-21 15:37:36.914 28238-28238/? D/MyTestService: onCreate :
11-21 15:37:36.916 28238-28238/? D/MyTestService: onStartCommand :0 startid :1
11-21 15:37:36.916 28238-28238/? D/MyTestService: currentThread :main
11-21 15:37:36.916 28238-28238/? D/MyTestService: onStart :
Bindメソッドで呼び出してみます:結果はstartService方式と同じで、これがサービスで時間のかかる操作ができない理由です.
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.d(MyService.TAG,getComponentName().getShortClassName() + "onServiceConnected :" +service);
MyService.Mybind mybind = (MyService.Mybind) service;
mybind.getService().sayHello();
}
結果
11-21 15:41:04.349 31083-31083/? D/MyTestService: onCreate :
11-21 15:41:04.349 31083-31083/? D/MyTestService: onBind
11-21 15:41:04.406 31083-31083/? D/MyTestService: .Main3ActivityonServiceConnected :application.service.MyService$Mybind@3870a8a7
11-21 15:41:04.406 31083-31083/? D/MyTestService: currentThread :main