1. 程式人生 > 其它 >Android Service基本用法、AIDL、Binder連線池詳解

Android Service基本用法、AIDL、Binder連線池詳解

技術標籤:Android-APP

原文連線

文章不好貼,所以沒有全文拷貝過來,簡單總結最看重:

文章清晰的描述了Service跨程序和非跨程序處理的差異。 同一程序內的Service通訊可以寫的非常簡單,快程序一般用AIDL來輔助實現。

另外,有空可以看看使用Messenger實現跨程序通訊。

原文如下:原文連線

本文介紹Service與Activity之間的通訊,文章包含以下內容:

  • 一、Service基本用法
  • 二、通過AIDL實現Service與Activity跨程序通訊
  • 三、Binder連線池
  • 四、使用Messenger實現跨程序通訊
  • 五、本文的示例原始碼地址

文章有點長,主要分為上面5個部分,由於沒找到在簡書設定文內連結的方法,所以要想直接跳過基礎看後面的部分,翻滾吧 !不過文章整體從簡到繁,前面的基礎對後面知識的理解會有幫助,所以建議按順序看。

一、Service基本用法

基本用法即同進程下Activity與Service雙向通訊,先描述整體實現過程然後直接上程式碼:

  1. 新建一個繼承自Service的類MyService,然後在AndroidManifest.xml裡註冊這個Service
  2. Activity裡面使用bindService方式啟動MyService,也就是綁定了MyService
    (到這裡實現了繫結,Activity與Service通訊的話繼續下面的步驟)
  3. 新建一個繼承自Binder的類MyBinder
  4. 在MyService裡實例化一個MyBinder物件mBinder,並在onBind回撥方法裡面返回這個mBinder物件
  5. 第2步bindService方法需要一個ServiceConnection型別的引數,在ServiceConnection裡可以取到一個IBinder物件,就是第4步onBinder返回的mBinder物件(也就是在Activity裡面拿到了Service裡面的mBinder物件)
  6. 在Activity裡面拿到mBinder之後就可以呼叫這個binder裡面的方法了(也就是可以給Service發訊息了),需要什麼方法在MyBinder類裡面定義實現就行了。如果需要Service給Activity發訊息的話,通過這個binder註冊一個自定義回撥即可。

程式碼如下,關鍵部分給出了對應上面步驟的註釋:

Activity

public class MainActivity extends Activity {

    private static final String TAG = "zjy";
    public MyBinder mBinder;

    private ServiceConnection mConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
            //第5步所說的在Activity裡面取得Service裡的binder物件
            mBinder = (MyBinder)iBinder;
            //第6步註冊自定義回撥
            mBinder.setOnTestListener(new MyBinder.OnTestListener() {
                @Override
                public void onTest(String str) {
                    Log.d(TAG, "receive msg from service: "+str);
                }
            });
        }

        @Override
        public void onServiceDisconnected(ComponentName componentName) {

        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Intent intent = new Intent(MainActivity.this, MyService.class);
        bindService(intent,mConnection,BIND_AUTO_CREATE);

        findViewById(R.id.test_bt).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //點選按鈕呼叫mBinder裡面的方法,傳送訊息給Service
                mBinder.testMethod("hi, service.");
            }
        });
    }
}