Binder基本使用

来源:https://www.cnblogs.com/linhaostudy/archive/2020/02/05/12264137.html
-Advertisement-
Play Games

Android開發中,Binder是一種跨進程通信方式,而使用AIDL可以實現Binder的工作。 如何使用它是瞭解它的第一步,本文章主要記錄使用Binder的一些步驟。(代碼思路參考《Android開發藝術探索》任玉剛 著) 1.創建兩個activity 兩個activity(OneActivit ...


Android開發中,Binder是一種跨進程通信方式,而使用AIDL可以實現Binder的工作。

如何使用它是瞭解它的第一步,本文章主要記錄使用Binder的一些步驟。(代碼思路參考《Android開發藝術探索》任玉剛 著)

1.創建兩個activity

兩個activity(OneActivity、TwoActivity),將OneActivity假設為服務端,TwoActivity假設為客戶端,分別運行在不同進程中

在AndroidManifest.xml中,為TwoActivity設置進程,這樣兩個activity就分別運行在不同的進程中了

<activity android:name=".TwoActivity" android:process=":test"/>

2. 創建AIDL文件

在AIDL文件中聲明客戶端想要調用服務端的方法

interface IInfManager {
    /**
     * Demonstrates some basic types that you can use as parameters
     * and return values in AIDL.
     */
    void setName(String name);
 
    String getName();
}

AIDL文件聲明完,activity等文件並不能調用到IInfManager介面,需要在app的build.gradle文件中的android{}中添加

sourceSets{
    main{
        java.srcDirs = ['src/main/java', 'src/main/aidl']
    }
}

然後點擊sync now按鈕,activity文件就可以調用到IInfManager介面了,可以在app\build\generated\source\aidl\debug文件下找到自動生成的IInfManager.java文件。

3.創建Service

Service中創建Binder對象,在onBind方法中返回這個對象,Binder對象中具體實現了IInfManager介面中的方法。Service需要在AndroidManifest.xml中註冊。

public class InfManageService extends Service{
 
    private String name;
 
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        name = intent.getStringExtra("name");
        return super.onStartCommand(intent, flags, startId);
    }
 
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return binder;
    }
 
    private Binder binder = new IInfManager.Stub() {
        @Override
        public void setName(String mName) throws RemoteException {
            name = mName;
        }
 
        @Override
        public String getName() throws RemoteException {
            return name;
        }
    };
}

4.服務端OneActivity

OneActivity中設置按鈕跳轉至TwoActivity,這裡為了簡單,使用startService可以為InfManageService中name變數初始化"zhangsan"的值。也可以與客戶端TwoActivity中一樣,綁定service,建立連接,來設置name的值(具體參考下一步客戶端的用法)。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_one);
 
    Intent intent = new Intent(OneActivity.this, InfManageService.class);
    intent.putExtra("name", "zhangsan");
    startService(intent);
 
    btn_one_gototwo = (Button) findViewById(R.id.btn_one_gototwo);
 
    btn_one_gototwo.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(OneActivity.this, TwoActivity.class);
            startActivity(intent);
        }
    });
}

5.客戶端TwoActivity

首先綁定InfManageService服務,建立連接,連接成功後通過返回的IBinder對象可以獲得IInfManager介面,可以通過這個介面去使用服務端的方法。

private TextView tv_two_name;
private Button btn_two_change;
 
private IInfManager iInfManager;
 
private ServiceConnection connection = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        iInfManager = IInfManager.Stub.asInterface(service);
        try {
            tv_two_name.setText(iInfManager.getName());
            Log.i("TwoActivity","first:" + iInfManager.getName());
            iInfManager.setName("lisi");
            Log.i("TwoActivity","next:" + iInfManager.getName());
        }catch (RemoteException e){
 
        }
    }
 
    @Override
    public void onServiceDisconnected(ComponentName name) {
 
    }
};
 
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_two);
 
    tv_two_name = (TextView) findViewById(R.id.tv_two_name);
    btn_two_change = (Button) findViewById(R.id.btn_two_change);
 
    Intent intent = new Intent(TwoActivity.this, InfManageService.class);
    bindService(intent, connection, Context.BIND_AUTO_CREATE);
 
    btn_two_change.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            try {
                iInfManager.setName("wangmazi");
                tv_two_name.setText(iInfManager.getName());
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }
    });
}
 
@Override
protected void onDestroy() {
    super.onDestroy();
    unbindService(connection);
}

上面代碼onServiceConnected方法中,首先在TwoActivity界面中顯示了服務端的name變數內容"zhangsan"

image


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 錯誤信息:./configure: error: C compiler cc is not found解決方案:yum -y install gcc gcc-c++ autoconf automake make 錯誤信息:./configure: error: the HTTP rewrite mo ...
  • 0. 本blog 簡單說明一下 Linux測試環境尤其是 CentOS測試環境的開發測試使用, 教程可能不會很長, 主要是入門. 0.1 Linux簡介: Linux 的歷史基本上不用闡述, linus作為自己的興趣愛好進行編碼實現的一種開源的操作系統. Linux很好的切合了GNU裡面一直沒有可用 ...
  • 1.flink運行時的組件 ​ Flink 運行時架構主要包括四個不同的組件,它們會在運行流處理應用程式時協同工作: 作業管理器(JobManager)、資源管理器(ResourceManager)、任務管理器(TaskManager), 以及分發器(Dispatcher)。因為 Flink 是用 ...
  • 在消費Kafka中分區的數據時,我們需要跟蹤哪些消息是讀取過的、哪些是沒有讀取過的。這是讀取消息不丟失的關鍵所在。Kafka是通過offset順序讀取事件的。如果一個消費者退出,再重啟的時候,它知道從哪兒繼續讀取消息進行處理。所以,消費者需要「提交」屬於它們自己的偏移量。如果消費者已經提交了偏移量,... ...
  • 首先看一下我的基本的開發環境: 操作系統:MacOS 10.13.5 編輯器:IDEA 2018.3 其他:MySQL8.0.15、Maven 3.3.9、JDK 1.8 好,下麵就正式開始: 第一步:在IDEA中新建一個maven項目 1.使用骨架創建maven項目,此處選擇:maven-arch ...
  • 2020-02-05 mysqli擴展 phpl連接Mysql mysqli_connect($servername,$username,$password,$database,$port); //參數1:連接的主機 參數2:資料庫登錄賬號 參數3:資料庫登錄密碼 參數4:將要連接的資料庫 參數5: ...
  • redis中整數集合intset相關的文件為:intset.h與intset.c intset的所有操作與操作一個排序整形數組 int a[N]類似,只是根據類型做了記憶體上的優化。 一、數據結構 1 typedef struct intset { 2 uint32_t encoding; 3 uin ...
  • android sdk manager 無法更新,解決連不上dl.google.com的問題 ...
一周排行
    -Advertisement-
    Play Games
  • 1. 說明 /* Performs operations on System.String instances that contain file or directory path information. These operations are performed in a cross-pla ...
  • 視頻地址:【WebApi+Vue3從0到1搭建《許可權管理系統》系列視頻:搭建JWT系統鑒權-嗶哩嗶哩】 https://b23.tv/R6cOcDO qq群:801913255 一、在appsettings.json中設置鑒權屬性 /*jwt鑒權*/ "JwtSetting": { "Issuer" ...
  • 引言 集成測試可在包含應用支持基礎結構(如資料庫、文件系統和網路)的級別上確保應用組件功能正常。 ASP.NET Core 通過將單元測試框架與測試 Web 主機和記憶體中測試伺服器結合使用來支持集成測試。 簡介 集成測試與單元測試相比,能夠在更廣泛的級別上評估應用的組件,確認多個組件一起工作以生成預 ...
  • 在.NET Emit編程中,我們探討了運算操作指令的重要性和應用。這些指令包括各種數學運算、位操作和比較操作,能夠在動態生成的代碼中實現對數據的處理和操作。通過這些指令,開發人員可以靈活地進行算術運算、邏輯運算和比較操作,從而實現各種複雜的演算法和邏輯......本篇之後,將進入第七部分:實戰項目 ...
  • 前言 多表頭表格是一個常見的業務需求,然而WPF中卻沒有預設實現這個功能,得益於WPF強大的控制項模板設計,我們可以通過修改控制項模板的方式自己實現它。 一、需求分析 下圖為一個典型的統計表格,統計1-12月的數據。 此時我們有一個需求,需要將月份按季度劃分,以便能夠直觀地看到季度統計數據,以下為該需求 ...
  • 如何將 ASP.NET Core MVC 項目的視圖分離到另一個項目 在當下這個年代 SPA 已是主流,人們早已忘記了 MVC 以及 Razor 的故事。但是在某些場景下 SSR 還是有意想不到效果。比如某些靜態頁面,比如追求首屏載入速度的時候。最近在項目中回歸傳統效果還是不錯。 有的時候我們希望將 ...
  • System.AggregateException: 發生一個或多個錯誤。 > Microsoft.WebTools.Shared.Exceptions.WebToolsException: 生成失敗。檢查輸出視窗瞭解更多詳細信息。 內部異常堆棧跟蹤的結尾 > (內部異常 #0) Microsoft ...
  • 引言 在上一章節我們實戰了在Asp.Net Core中的項目實戰,這一章節講解一下如何測試Asp.Net Core的中間件。 TestServer 還記得我們在集成測試中提供的TestServer嗎? TestServer 是由 Microsoft.AspNetCore.TestHost 包提供的。 ...
  • 在發現結果為真的WHEN子句時,CASE表達式的真假值判斷會終止,剩餘的WHEN子句會被忽略: CASE WHEN col_1 IN ('a', 'b') THEN '第一' WHEN col_1 IN ('a') THEN '第二' ELSE '其他' END 註意: 統一各分支返回的數據類型. ...
  • 在C#編程世界中,語法的精妙之處往往體現在那些看似微小卻極具影響力的符號與結構之中。其中,“_ =” 這一組合突然出現還真不知道什麼意思。本文將深入剖析“_ =” 的含義、工作原理及其在實際編程中的廣泛應用,揭示其作為C#語法奇兵的重要角色。 一、下劃線 _:神秘的棄元符號 下劃線 _ 在C#中並非 ...