Android Service基本用法、AIDL、Binder連線池詳解
阿新 • • 發佈:2021-01-23
技術標籤:Android-APP
文章不好貼,所以沒有全文拷貝過來,簡單總結最看重:
文章清晰的描述了Service跨程序和非跨程序處理的差異。 同一程序內的Service通訊可以寫的非常簡單,快程序一般用AIDL來輔助實現。
另外,有空可以看看使用Messenger實現跨程序通訊。
原文如下:原文連線
本文介紹Service與Activity之間的通訊,文章包含以下內容:
- 一、Service基本用法
- 二、通過AIDL實現Service與Activity跨程序通訊
- 三、Binder連線池
- 四、使用Messenger實現跨程序通訊
- 五、本文的示例原始碼地址
文章有點長,主要分為上面5個部分,由於沒找到在簡書設定文內連結的方法,所以要想直接跳過基礎看後面的部分,翻滾吧 !不過文章整體從簡到繁,前面的基礎對後面知識的理解會有幫助,所以建議按順序看。
一、Service基本用法
基本用法即同進程下Activity與Service雙向通訊,先描述整體實現過程然後直接上程式碼:
- 新建一個繼承自Service的類MyService,然後在AndroidManifest.xml裡註冊這個Service
- Activity裡面使用bindService方式啟動MyService,也就是綁定了MyService
(到這裡實現了繫結,Activity與Service通訊的話繼續下面的步驟) - 新建一個繼承自Binder的類MyBinder
- 在MyService裡實例化一個MyBinder物件mBinder,並在onBind回撥方法裡面返回這個mBinder物件
- 第2步bindService方法需要一個ServiceConnection型別的引數,在ServiceConnection裡可以取到一個IBinder物件,就是第4步onBinder返回的mBinder物件(也就是在Activity裡面拿到了Service裡面的mBinder物件)
- 在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."); } }); } }