Android 進(jìn)程間通信AIDL簡(jiǎn)單使用

最近出去面試經(jīng)常會(huì)被問到Android進(jìn)程間通信,因?yàn)轫?xiàng)目中基本上用不到進(jìn)程間通信,所以不是特別了解,下來之后專門去查詢了下資料炮障,Android進(jìn)程通信有4種,下面簡(jiǎn)單介紹下AIDL 的通信方法然低,簡(jiǎn)單的寫個(gè)demo。那么首先什么是AIDL呢 务唐,aidl是 AnInterface definition language的縮寫雳攘,一看就明白,它是一種android內(nèi)部進(jìn)程通信接口的描述語言枫笛。首先新建一個(gè)aidl類型的類命名為IMyAidlInterface

aidl.png

androidstudio會(huì)自動(dòng)在main 目錄下新建一個(gè)aidl目錄吨灭,我們新建的文件會(huì)放到這個(gè)目錄下面,目錄的包路徑和java 目錄下的包路徑一致刑巧。
Paste_Image.png

package example.admin.com.testaidl;  
interface IMyAidlInterface {   
      void hello(String str); /** Demonstrates some basic types that you can use as parameters * and return values in AIDL. */   
      void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString);   
}

我們發(fā)現(xiàn)aidl文件其實(shí)就是一個(gè)接口文件喧兄,as會(huì)自動(dòng)新建一個(gè)方法basicTypes方法涩咖,這個(gè)方法并沒什么卵用,可以直接刪掉繁莹,我們新定義一個(gè)方法叫hello 接收一個(gè)String類型的參數(shù).然后重新編譯一下,編譯完成后特幔,在build目錄下面自動(dòng)生成了一個(gè)IMyAidlInterface的接口文件咨演,它集成了android.os.IInterface接口,有一個(gè)名為Stub的內(nèi)部類蚯斯,stub類繼承Binder薄风。
自動(dòng)生成文件路徑如下圖

Paste_Image.png

接著新建一個(gè)MyService類繼承Service

package example.admin.com.testaidl;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import android.support.annotation.Nullable;
import android.util.Log;
/** * Created by admin * date 16/10/11. */
public class MyService extends Service {    
   public MyService() {        
      Log.i("TAG", "MyService: ");   
   } 
   @Override   
   public void onCreate() {        
      super.onCreate();        
      Log.i("TAG", "onCreate: ");    
   }   
   @Nullable   
   @Override    
   public IBinder onBind(Intent intent) {        
      Log.i("TAG", "onBind: " + intent);        
      return mBinder;   
    }   
    public final IMyAidlInterface.Stub mBinder = new IMyAidlInterface.Stub() {       
       @Override        
       public void hello(String str) throws RemoteException {            
            Log.i("TAG", "hello: " + str);       
       }       
       @Override        
        public void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString) throws RemoteException { 
     
        }   
     };
}

核心代碼就是mBinder 這一段,創(chuàng)建一個(gè)IMyAidlInterface的內(nèi)部類Stub的實(shí)力拍嵌,里面實(shí)現(xiàn)我們接口中定義的方法遭赂,此處就是接受輸入?yún)?shù) 并打印出來。然后在manifest.xml 文件中注冊(cè)這個(gè)service

<service android:name=".MyService"> 
      <intent-filter> 
          <action android:name="example.admin.com.testaidl.MyService" />
      </intent-filter>
</service>

到目前為止服務(wù)端的代碼我們已經(jīng)完成横辆。接下來是客戶端的代碼

package example.admin.com.testaidl;
import android.app.Service;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;import android.content.ServiceConnection;
import android.os.IBinder;import android.os.RemoteException;import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;import android.util.Log;
import android.view.View;import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity { 
    TextView mTextView;
    Button mButton; 
    IMyAidlInterface mIMyAidlInterface; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) {                
         super.onCreate(savedInstanceState); 
         setContentView(R.layout.activity_main); 
         initView();
     } 
     private void initView(){ 
          mTextView = (TextView) findViewById(R.id.textview); 
          mButton = (Button) findViewById(R.id.button);           
          mButton.setOnClickListener(new View.OnClickListener() { 
                    @Override
                    public void onClick(View v) { 
                        Intent intent = new Intent();           
                        intent.setAction("example.admin.com.testaidl.MyService");//你定義的service的action 
                        intent.setPackage("example.admin.com.testaidl");//這里你需要設(shè)置你應(yīng)用的包名 
                        bindService(intent,mConnection, Context.BIND_AUTO_CREATE); } });
           } 
        ServiceConnection mConnection = new ServiceConnection() { 
            @Override 
              public void onServiceConnected(ComponentName name, IBinder service) {
               mIMyAidlInterface = IMyAidlInterface.Stub.asInterface(service); 
              Log.i("TAG", "onServiceConnected: " + mIMyAidlInterface); 
              try { 
                    mIMyAidlInterface.hello("World!!!"); 
              }  catch (RemoteException e) { e.printStackTrace(); } } 
              @Override 
              public void onServiceDisconnected(ComponentName name) {
                   Log.i("TAG", "onServiceDisconnected: " + name); 
                }
         };
}

布局文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:id="@+id/activity_main" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:paddingBottom="@dimen/activity_vertical_margin" 
android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
tools:context="example.admin.com.testaidl.MainActivity">

   <TextView android:id="@+id/textview"
       android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="Hello World!"/>

     <Button android:id="@+id/button" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:text="Button"/>
</RelativeLayout>

點(diǎn)擊按鈕 查看輸出日志

Paste_Image.png

運(yùn)行正常F菜!
中間遇到一個(gè)錯(cuò)誤狈蚤,報(bào)錯(cuò)信息IllegalArgumentException: Service Intent must be explicit 解決辦法 如何解決Android 5.0中出現(xiàn)的警告:Service Intent must be expli

github地址:https://github.com/cnexcelee/TestAIDL/tree/master
推薦閱讀:Android:學(xué)習(xí)AIDL困肩,這一篇文章就夠了(上)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市脆侮,隨后出現(xiàn)的幾起案子锌畸,更是在濱河造成了極大的恐慌,老刑警劉巖靖避,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件潭枣,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡幻捏,警方通過查閱死者的電腦和手機(jī)盆犁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來篡九,“玉大人蚣抗,你說我怎么就攤上這事∥拖拢” “怎么了翰铡?”我有些...
    開封第一講書人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)讽坏。 經(jīng)常有香客問我锭魔,道長(zhǎng),這世上最難降的妖魔是什么路呜? 我笑而不...
    開封第一講書人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任迷捧,我火速辦了婚禮织咧,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘漠秋。我一直安慰自己笙蒙,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開白布庆锦。 她就那樣靜靜地躺著捅位,像睡著了一般。 火紅的嫁衣襯著肌膚如雪搂抒。 梳的紋絲不亂的頭發(fā)上艇搀,一...
    開封第一講書人閱讀 51,462評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音求晶,去河邊找鬼焰雕。 笑死,一個(gè)胖子當(dāng)著我的面吹牛芳杏,可吹牛的內(nèi)容都是我干的矩屁。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼爵赵,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼档插!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起亚再,我...
    開封第一講書人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤郭膛,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后氛悬,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體则剃,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年如捅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了棍现。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡镜遣,死狀恐怖己肮,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情悲关,我是刑警寧澤谎僻,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站寓辱,受9級(jí)特大地震影響艘绍,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜秫筏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一诱鞠、第九天 我趴在偏房一處隱蔽的房頂上張望挎挖。 院中可真熱鬧,春花似錦航夺、人聲如沸蕉朵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽始衅。三九已至,卻和暖如春锚烦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背帝雇。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來泰國打工涮俄, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人尸闸。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓彻亲,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親吮廉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子苞尝,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

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