Android Serviceの使い方のまとめとライフサイクルの詳細


Service androidの4つのコンポーネントの1つで、最も重要なバックグラウンドでコントロールを実行します.1.サービスの使用方法bindServiceと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