サービス概要

5893 ワード

概要
サービスはAndroidの4つのコンポーネントの1つとして、その重要性は言うまでもありませんが、これまでいくつかの紹介を見たことがありますが、ずっと使ったことがありません.最近、使う必要があるときに手がつけられないことに気づき、公式のサービスに関するガイドを読みました.ここでまとめます.
サービスの役割
公式紹介は以下の通り.
A Service is an application component representing either an application’s desire to perform a longer-running operation while not interacting with the user or to supply functionality for other applications to use.
Serviceは主にバックグラウンドで長期的なタスクや時間のかかる操作を実行するために使用され、必要に応じてアプリケーションが終了したときに実行状態を維持することもできます.
ServiceとThread
サービスはバックグラウンドでタスクを実行できますが、実際には1つのサービスはプライマリスレッドで実行されます.時間がかかる場合は、サービスで自分でThreadを開いてANRを避けなければなりません.では、このような問題があります.私たちはどうしてThreadを使わないのですか.主な原因はThreadの制御性が悪いことです.もし私たちがActivityでThreadを起動したとしたら、このActivityが終わったら、他のActivityはこのThreadの引用を得ることができません.制御は言うまでもありません.しかし、サービスは異なり、1つのサービス全体が1つのインスタンスしか作成されず、どのActivityでも制御できるので、サービス内のThreadはすべてのActivityで制御できます.また、サービスは4つのコンポーネントの1つとして、バックグラウンドで実行するとシステムに殺されにくいレベルが高い.
サービス区分
サービスには2種類あります
  • Started Service:他のコンポーネントと通信しない
  • Bound Service:他のコンポーネントと通信できます.どのサービスを使用してもonBind()メソッドを書き換えなければなりません.Started Serviceを使用してnullを返すといいです.

  • Started Serviceの使用
    一般的には2つの方法を書き直す必要があります
  • onCreate():サービスを開始するときにそのサービスインスタンスが存在しない場合、このメソッドが呼び出されます.
  • onStartCommand(Intent intent,int flags,int startId):startService(Intent intent)で起動するたびにこの方法が使用されなくなり、一般的にここで新しいスレッドが開きます.

  • onStartCommand(Intent intent,int flags,int startId)メソッドは、サービスがkillされた後の動作を表すintタイプの値を返します.次の3つがあります.
  • START_NOT_STICKY:
  • を再作成しないことを示します.
  • START_STICKY:再作成を表し、null
  • にonStartCommandを呼び出します.
  • START_REDELIVER_INTENT:再構築を表し、onStartCommandを呼び出して前のIntent
  • に転送します.
    リソースと電力を節約するために、タスクの終了後にサービスを閉じる必要があります.サービスを閉じるには、stopSelf()または他のコンポーネントを呼び出してstopService()を呼び出すことができますが、サービスが複数のonStartCommandリクエストを処理する場合、リクエストの終了後にstopSelf()をオフにすると、受信した新しいリクエストが中断される可能性があります.最良の場合、私たち自身が最後の要求であり、stopSelt(int)のパラメータのリロードはこの方法を解決することができ、伝達されたidはonStartCommandが伝達したidであり、現在のタスクのidを表し、伝達されたidと最後のidを比較し、結果的に自分が最後のタスクであることを表し、stopが落ちる.そうしないとstopは実行されない.
    Bound Serviceの使用
    プライマリとStarted Serviceの違いは、Binderを介して他のコンポーネントと通信できることです.作成時には、ユーザーがサーバとどのようにコミュニケーションするかを記述するインタフェースを定義する必要があります.インタフェースはBinderを継承する必要があります.bindService()を使用して作成するには、サービス接続の実装を提供する必要があります.bindService()は非同期メソッドであり、すぐに戻ります.作成が完了すると、ServiceConnectionのonServiceConnectedが呼び出され、binder通信が渡されます.onBindメソッドは、最初のユーザー接続でのみ呼び出され、その後、同じbinder(サービスが1つしかないため)が返されます.コードは次のとおりです.
    public class LocalService extends Service {
        // Binder given to clients
        private final IBinder mBinder = new LocalBinder();
        // Random number generator
        private final Random mGenerator = new Random();
        /**
         * Class used for the client Binder.  Because we know this service always
         * runs in the same process as its clients, we don't need to deal with IPC.
         */
        public class LocalBinder extends Binder {
            LocalService getService() {
                // Return this instance of LocalService so clients can call public methods
                return LocalService.this;
            }
        }
        @Override
        public IBinder onBind(Intent intent) {
            return mBinder;
        }
        /** method for clients */
        public int getRandomNumber() {
          return mGenerator.nextInt(100);
        }
    

    bindサービスのコードは以下の通りです.
    private ServiceConnection mConnection = new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName className,
                    IBinder service) {
                // We've bound to LocalService, cast the IBinder and get LocalService instance
                LocalBinder binder = (LocalBinder) service;
                mService = binder.getService();
                mBound = true;
            }
            @Override
            public void onServiceDisconnected(ComponentName arg0) {
                mBound = false;
            }
        };
    bindService(intent, mConnection, 0);

    サービスでbinder継承をBinderからカスタマイズし、メソッドを宣言し、onBind()でインスタンスを返すことがわかります.私たちはonServiceConnectedメソッドでこのbinderを得て、それから中のメソッドを呼び出してServiceのインスタンスを得て、このように中のメソッドを使って、通信を完成することができます.bindServicerの3番目のパラメータは、BIND_の場合、最初の選択です.AUTO_CREATEは起動していなければ新規作成することを示しています
    注意事項
    onServiceDisconnectedメソッドはunbindのときに呼び出されたものではなく、実際にkillなどの予期せぬ状況に呼び出されたものです