Android aidl 深入淺出(一)

既然你已經(jīng)點到這里來了,那么你肯定對aidl有所了解讯泣,什么纫普,aidl是啥你都不知道?好好渠,不要慌局嘁,讀了這篇文章你肯定就懂了。

437.gif

什么是aidl呢

AIDL是Android Interface Definition Language的縮寫晦墙,見名知意悦昵,Android接口定義語言。嗯晌畅,可我還是不懂什么是接口定義語言但指,用官方的說法是定義客戶端與服務使用進程間通信 (IPC) 進行相互通信時都認可的編程接口,說白了抗楔,其實就是跨進程通信棋凳。

看到這你可能會問,跨進程通信的方式有廣播连躏、ContentProvider剩岳,Messenger,那我為什么要選AIDL呢入热,確實拍棕,Messenger要比aidl使用起來更加簡單,但是aidl的好處用官方原話是:只有允許不同應用的客戶端用 IPC 方式訪問服務勺良,并且想要在服務中處理多線程時绰播,才有必要使用 AIDL。說白了尚困,如果你想要跨應用蠢箩、多線程并發(fā)訪問,aidl是最好的選擇事甜。

進入正題谬泌,沒有什么比一個demo更生動了

通過這個demo了解如何實現(xiàn)跨應用通信

1. 服務端代碼(即提供數(shù)據(jù)給客戶端)

  1. 先建一個aidl,如圖:
QQ圖片20170610165852.png
interface MeiNvManager {

void getName();

void getHeight();

void getWeight();
}

然后點一下同步按鈕逻谦,正常的話掌实,會 編譯成java代碼,如圖:(如果沒有生成此java文件跨跨,請看下面)
![K]KM~}R78V%R3R8G}EUD1_2.png](http://upload-images.jianshu.io/upload_images/4126773-bd7d1e60e7d982d0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

開始的時候潮峦,我點同步按鈕,這里不會自動生成java代碼勇婴,我也找了很久的原因忱嘹,未果,就將此aidl文件刪掉耕渴,重新創(chuàng)建一個Androidstudio默認創(chuàng)建的aidl文件拘悦,如圖:

![](DRB5U%P_6@XB.png](http://upload-images.jianshu.io/upload_images/4126773-b05b7dcd100b07d0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

然后我再同步一下,自動生成的java文件出現(xiàn)了3髁场4∶住!然后我再刪掉這個aidl文件添诉,建上我需要的MeiNvManager.aidl文件屁桑,同步,bingo栏赴!

然后建一個服務類蘑斧,用于提供數(shù)據(jù)給客戶端:大概的邏輯是沒隔兩秒中對美女賦值。

public class AIDLService extends Service {

      public final String TAG = this.getClass().getSimpleName();

      MeiNvManager.Stub meiNvManager = new MeiNvManager.Stub() {

       @Override
        public String getName() throws RemoteException {
            return meiNv.name;
        }

    @Override
    public String getHeight() throws RemoteException {
        return meiNv.height;
    }

        @Override
        public String getWeight() throws RemoteException {
            return meiNv.weight;
        }
    }; 
    private MeiNv meiNv;
    private Handler handler;

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {

    return meiNvManager;
}

    @Override
    public void onCreate() {
        super.onCreate();
        handler = new Handler();
        startChange();
    }

    private void startChange() {
        meiNv = new MeiNv();
        meiNv.name = "柳巖";
        meiNv.height = "16";
        meiNv.weight = "10";
        handler.postDelayed(runnable, 2000);
    }
    Runnable runnable = new Runnable() {
        @Override
        public void run () {
            double random = Math.random();
            meiNv.name = "柳巖";
            meiNv.height = "16" + (int)(random * 10);
            meiNv.weight = "10" + (int)(random * 10);
            handler.postDelayed(this,2000);
        }
    };    

}

然后在MainActivity里啟動service:

 startService(new Intent(this,AIDLService.class));

當然须眷,不要忘了在Manifest文件里注冊Service:android:process=":remote"和android:exported="true"的作用就是聲明此service為遠程服務竖瘾,并且能用其他應用啟動。

<service android:name=".AIDLService"
             android:process=":remote"
             android:exported="true">
        <intent-filter>
            <action android:name="com.example.aidlservice.AIDLService"/>
        </intent-filter>
 </service>

2. 客戶端代碼(獲取服務端的數(shù)據(jù))

然后我們又建一個module花颗,建一個和服務端一樣的aidl文件捕传,包名也必須一樣,如圖:

L8SY_C`}PUABZCRXOEDX7KR.png

然后同步一下扩劝。

在MainActivity里接收服務端的數(shù)據(jù):

public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
private MeiNvManager meiNvManager;

private ServiceConnection conn = new ServiceConnection() {

    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        meiNvManager = MeiNvManager.Stub.asInterface(service);
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
        meiNvManager = null;
    }
};
private TextView tv_name;
private TextView tv_height;
private TextView tv_weight;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    bindService();
    initView();
}

private void initView() {
    Button click = (Button) findViewById(R.id.click);
    tv_name = (TextView) findViewById(R.id.tv_name);
    tv_height = (TextView) findViewById(R.id.tv_height);
    tv_weight = (TextView) findViewById(R.id.tv_weight);
    click.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            try {
                String height = meiNvManager.getHeight();
                String name = meiNvManager.getName();
                String weight = meiNvManager.getWeight();
                tv_name.setText(name);
                tv_height.setText(height);
                tv_weight.setText(weight);
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }
    });
 }

private void bindService() {

    Intent intent = new Intent();
    //綁定服務端的service
    intent.setAction("com.example.aidlservice.AIDLService");
    //新版本(5.0后)必須顯式intent啟動 綁定服務
    intent.setComponent(new ComponentName("com.example.aidlservice","com.example.aidlservice.AIDLService"));
    //綁定的時候服務端自動創(chuàng)建
    bindService(intent,conn, Context.BIND_AUTO_CREATE);
}
}

效果如下圖:


aidl.gif

到這應該就知道如何去使用了庸论,下一節(jié)我再詳細介紹其原理~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市棒呛,隨后出現(xiàn)的幾起案子葡公,更是在濱河造成了極大的恐慌,老刑警劉巖条霜,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件催什,死亡現(xiàn)場離奇詭異,居然都是意外死亡宰睡,警方通過查閱死者的電腦和手機蒲凶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拆内,“玉大人旋圆,你說我怎么就攤上這事◆锘校” “怎么了灵巧?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵搀矫,是天一觀的道長。 經(jīng)常有香客問我刻肄,道長瓤球,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任敏弃,我火速辦了婚禮卦羡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘麦到。我一直安慰自己绿饵,他們只是感情好,可當我...
    茶點故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布瓶颠。 她就那樣靜靜地躺著拟赊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪粹淋。 梳的紋絲不亂的頭發(fā)上要门,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天,我揣著相機與錄音廓啊,去河邊找鬼欢搜。 笑死,一個胖子當著我的面吹牛谴轮,可吹牛的內(nèi)容都是我干的炒瘟。 我是一名探鬼主播,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼第步,長吁一口氣:“原來是場噩夢啊……” “哼疮装!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起粘都,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤廓推,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后翩隧,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體樊展,經(jīng)...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年堆生,在試婚紗的時候發(fā)現(xiàn)自己被綠了专缠。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,861評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡淑仆,死狀恐怖涝婉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蔗怠,我是刑警寧澤墩弯,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布吩跋,位于F島的核電站,受9級特大地震影響渔工,放射性物質(zhì)發(fā)生泄漏锌钮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一涨缚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧策治,春花似錦脓魏、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至履腋,卻和暖如春珊燎,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背遵湖。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工悔政, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人延旧。 一個月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓谋国,卻偏偏與公主長得像,于是被迫代替她去往敵國和親迁沫。 傳聞我的和親對象是個殘疾皇子芦瘾,可洞房花燭夜當晚...
    茶點故事閱讀 45,860評論 2 361

推薦閱讀更多精彩內(nèi)容