Android startservice&bindserviceの違い

6105 ワード

Android startservice&bindserviceの違い
Android開発者として、サービスはすでに接触しているはずですが、Androidに接触する最初の授業は、Androidの4つのコンポーネントを、4つのコンポーネントの1つであるサービスについて、十分に理解していますか?
  • サービスとthreadの違いを知っていますか?サービスは本当に長時間のバックグラウンド操作を実行できますか?
  • startserviceとbindserviceの違いを知っていますか?
  • サービスのライフサイクルは、アクティブにサービスを終了する必要がありますか?サービスはメモリの漏洩を引き起こすのではないでしょうか.
  • サービスとintentサービスの違いは何ですか?

  • 上はサービスについてのいくつかの問題です.問題1、私たちは前のブログで説明しました.詳細はブログを参照してください.http://blog.csdn.net/u014088294/article/details/49907385
    質問4については、私たちの前の文章を参考にしてもいいです.http://blog.csdn.net/u014088294/article/details/44279399
    私たちは主に問題2,startserviceとbindserviceの違いを解く.
    Developerでは、サービスには主に2つの形式があります.
  • started
  • bound

  • 上のstartedは、startserviceに対応し、boundはbindserviceに対応し、彼らはサービスを起動する方法です.
    startservice
    startserviceでサービスを起動し、起動後、サービスはバックグラウンドで実行できます.通常、このサービスは結果を返すことができません(これもbindserviceとの違いの一つです).例えば、ファイルをダウンロードすることができます.startserviceに対応するstopserviceは、サービスを明示的に終了することができます.サービスのライフサイクルも比較的簡単で、startserviceに関連する3つの関数はonCreate、onStartCommand、onDestoryです.
    最初にstartserivceがサービスを開始すると、サービスのonCreate関数が呼び出され、サービスが作成され、onStartCommand関数が呼び出され、操作が実行されます.startserviceを介してサービスを複数回起動すると、onCreateは一度だけ呼び出され、onStartCommandが直接呼び出されます.stopseviceを呼び出してサービスを終了することができます.同様に、複数回呼び出すこともできます(最初の呼び出しは終了しましたが、その後呼び出しを続行しても例外は発生しません).
    サービスがstartserviceによって起動されると、サービスは呼び出し者とは独立して実行されます(つまり、呼び出し者のライフサイクルはそのライフサイクルとは関係ありません).そのため、サービスはタスクが完了したときにstopSelf関数または呼び出し者stopserviceを呼び出してサービスを終了する必要があります.
    Developerでは、サービスが実行されると、システムのリソースや電力を消費しないように、サービスを終了する必要があります.そうでなければ、デバイスのメモリ不足などの理由でオフになるまでバックグラウンドでサービスが実行されます.
    しかし、startserviceは私たちのすべてのニーズを解決することはできません.例えば、私は時々、serviceの戻り結果が必要です.私はserviceと対話する必要があります.startserviceは明らかに完成できません.ではbindserviceを使って
    bindservice
    Developerはこう言いました
    A bound service offers a client-server interface that allows components to interact with the service, send requests, get results, and even do so across processes with interprocess communication (IPC).
    bindserviceを利用してserviceとバインドすることができ、バインド後、serviceと対話したり、要求を送信したり、結果を得たり、IPC通信を実行したりすることができます.
    では、bindserviceをどのように使うべきでしょうか.
  • まずサービスのonBinderを再ロードし、IBinderオブジェクトを返す必要があります.このオブジェクトは、呼び出し元とserivceがインタラクティブなインタフェースです.
  • 新しいServiceConnection変数.このクラスは、Serviceboundをリスニングするインタフェースであり、onServiceConnectedメソッドとonServiceDisconnectedメソッドを再ロードします.onServiceConnectedメソッドでは,サービスでonBinderが返すIBinderインタフェースを得た.
  • はbindserviceを呼び出してサービスをバインドする.

  • 上記の手順に従って、私たちのコードは以下の通りです.onBinderを再ロードし、IBinderオブジェクトを返します.LocalBinderでgetSecveメソッドを指定し、サービスインスタンスを返します.
        public class LocalBinder extends Binder {
            MyService getService() {
                return MyService.this;
            }
        }
    
        private final IBinder mBinder = new LocalBinder();
    
        @Override
        public IBinder onBind(Intent intent) {
            Log.i(TAG, "onBind");
            return mBinder;
        }

    2.呼び出し元にサービス接続インタフェースを新規作成し、onサービス接続メソッドでIBinderオブジェクトをLocalBinderオブジェクトに変換し、getServiceメソッドを呼び出してサービスを取得します.
        private ServiceConnection mConnection = new ServiceConnection() {
            public void onServiceConnected(ComponentName className, IBinder service) {
                mBoundService = ((MyService.LocalBinder) service).getService();
            }
    
            public void onServiceDisconnected(ComponentName className) {
                  mBoundService = null;
            }
        };

    3.呼び出し元は、mConnectionがServiceConnectionインタフェースであるbindserviceを実行します.
    bindService(new Intent(MainActivity.this,MyService.class), mConnection, Context.BIND_AUTO_CREATE);

    ユーザーがbindserviceを実行すると、bindの結果はmConnectionインタフェースにコールバックし、bindが成功するとonServiceConnectedメソッドにコールバックします.その後、このメソッドでは、サービスインスタンスが得られ、サービスインスタンスが得られた後、サービスとインタラクティブになります.
    私たちは引き続きコードを改善して、ServiceのonCreate方法の中で、私たちは新しいスレッドを作って、1 sごとに、カウンタは1をプラスします.ここでcountはメンバー変数であり、現在のカウント値を表し、threadDisableはサービスがオフになっているかどうかを表します.
            new Thread(new Runnable() {
                // @Override
                public void run() {
                    while (!threadDisable) {
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                        }
                        count++;
                        System.out.println("CountService Count is " + count);
                    }
                }
            }).start();

    次に、サービスでメソッドを新規作成し、カウント値を返します.
        public int getCount() {
            return count;
        }

    では,呼び出し者では,上記のmBoundServiceを用いてgetCountメソッドを呼び出し,サービスと対話する目的を達成することができる.プロジェクトのアドレスhttps://github.com/KingPaul/ServiceDemo