最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android多進(jìn)程間采用AIDL方式進(jìn)行通信

 更新時(shí)間:2018年04月17日 12:05:02   作者:愛(ài)好代碼  
這篇文章主要為大家詳細(xì)介紹了Android多進(jìn)程間采用AIDL方式進(jìn)行通信,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

在上一節(jié)中,我介紹了Android中Service的生命周期以及一些有關(guān)知識(shí)。在這一節(jié)中,我采用代碼編寫(xiě)的方式來(lái)介紹一下不同程序之間也就是不同進(jìn)程之間通信采用AIDL方式。

首先我需要解釋一下,不同程序進(jìn)程間采用AIDL方式啟動(dòng)服務(wù),我們可以看作成client客戶端與server服務(wù)端之間的通信,無(wú)非c/s都是安裝在了我們的智能手機(jī)設(shè)備Android系統(tǒng)之上。好了,理解到這里我們就可以繼續(xù)往下介紹了。

首先我們編寫(xiě)server服務(wù)端程序:

1)我們新建一個(gè)應(yīng)用程序S,它的應(yīng)用程序架構(gòu)如下:

2)我們?cè)赾om.lgy.s包下編寫(xiě)S.aidl文件,具體代碼如下:(aidl編碼格式不再敘述)

package com.lgy.s; 
 
interface S{ 
  String getStr(String name); 
} 

編寫(xiě)好S.aidl文件我們就可以使用S.stub類下的相關(guān)方法。

3)我們可以自定義我們的Service了,具體代碼如下:

package com.lgy.s; 
 
import android.app.Service; 
import android.content.Intent; 
import android.os.IBinder; 
import android.os.RemoteException; 
import android.util.Log; 
 
public class MyService extends Service { 
 
  private static final String TAG = "MyService"; 
  private S.Stub server; 
   
  @Override 
  public void onCreate() { 
    Log.i(TAG, "onCreate"); 
    server = new S.Stub() { 
      @Override 
      public String getStr(String name) throws RemoteException { 
        Log.i(TAG, name); 
        return name; 
      } 
    }; 
    super.onCreate(); 
  } 
   
  @Override 
  public boolean onUnbind(Intent intent) { 
    Log.i(TAG, "onUnbind"); 
    return super.onUnbind(intent); 
  } 
   
  @Override 
  public void onDestroy() { 
    Log.i(TAG, "onDestroy"); 
    server = null; 
    super.onDestroy(); 
  } 
   
   
  @Override 
  public IBinder onBind(Intent intent) { 
    Log.i(TAG, "onBind"); 
     
    return server; 
  } 
 
} 

4)我們進(jìn)行服務(wù)端Server最后一步,在AndroidManifest.xml文件中注冊(cè)服務(wù)Service

<service android:name="com.lgy.s.MyService"> 
      <intent-filter > 
        <action android:name="android.lgy.myService" /> 
      </intent-filter> 
    </service> 

-----------到此我們服務(wù)器端就編寫(xiě)完畢------------------------

下面我們編寫(xiě)客戶端client應(yīng)用程序:

1)我們新建一個(gè)應(yīng)用程序C,具體應(yīng)用架構(gòu)如下:

2)我們將在服務(wù)器端S寫(xiě)的aidl原封不動(dòng)的移到客戶端C上來(lái)(注包文件名都原封不動(dòng)),移動(dòng)后架構(gòu)如下圖:

3)我們就可以在客戶端MainActivity中直接調(diào)用綁定服務(wù)器上的服務(wù),具體代碼如下:

package com.lgy.c; 
 
import android.app.Activity; 
import android.content.ComponentName; 
import android.content.Intent; 
import android.content.ServiceConnection; 
import android.os.Bundle; 
import android.os.IBinder; 
import android.os.RemoteException; 
import android.util.Log; 
import android.view.View; 
 
import com.lgy.s.S; 
 
public class MainActivity extends Activity { 
   
  protected static final String TAG = "MainActivity"; 
  private S s; 
  private ServiceConnection conn = new ServiceConnection() { 
    @Override 
    public void onServiceDisconnected(ComponentName name) { 
       
    } 
     
    @Override 
    public void onServiceConnected(ComponentName name, IBinder service) { 
      s = S.Stub.asInterface(service); 
      Log.i(TAG, "onServiceConnected client"); 
    } 
  }; 
   
  @Override 
  protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
  } 
   
  public void bindBtn(View v){ 
    Intent mIntent = new Intent("android.lgy.myService"); 
    bindService(mIntent, conn, BIND_AUTO_CREATE); 
  } 
 
  public void greetBtn(View v){ 
    try { 
      Log.i(TAG, s.getStr("client")); 
    } catch (RemoteException e) { 
      e.printStackTrace(); 
    } 
  } 
   
  public void unbindBtn(View v){ 
    unbindService(conn); 
  } 
   
} 

4)MainActivity對(duì)應(yīng)的布局文件代碼如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  xmlns:tools="http://schemas.android.com/tools" 
  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="com.lgy.c.MainActivity" > 
 
  <Button 
    android:id="@+id/button1" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentTop="true" 
    android:onClick="bindBtn" 
    android:text="綁定服務(wù)器Service" /> 
 
  <Button 
    android:id="@+id/button2" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_alignLeft="@+id/button1" 
    android:layout_below="@+id/button1" 
    android:onClick="greetBtn" 
    android:text="傳遞參數(shù)給服務(wù)器獲取返回的數(shù)據(jù)" /> 
 
  <Button 
    android:id="@+id/button3" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_alignLeft="@+id/button2" 
    android:layout_below="@+id/button2" 
    android:onClick="unbindBtn" 
    android:text="解除綁定服務(wù)" /> 
 
</RelativeLayout> 

至此為止客戶端代碼我們已經(jīng)編寫(xiě)完畢。

下面我們開(kāi)始測(cè)試:

我們不運(yùn)行服務(wù)器端,而是直接運(yùn)行客戶端的話,相對(duì)應(yīng)的效果會(huì)怎么樣呢?具體效果如下解析:

第一、我們點(diǎn)擊綁定服務(wù)的話,系統(tǒng)程序無(wú)任何反應(yīng),這個(gè)時(shí)候在客戶端服務(wù)已經(jīng)綁定,但是沒(méi)有連接到服務(wù)端。接著我們?cè)俅吸c(diǎn)解讀取數(shù)據(jù)的話,系統(tǒng)將會(huì)崩潰。因?yàn)闆](méi)有連接到服務(wù)器端方法沒(méi)有具體實(shí)現(xiàn)。

第二、我們點(diǎn)擊綁定服務(wù)的話,系統(tǒng)程序無(wú)任何反應(yīng),這個(gè)時(shí)候在客戶端服務(wù)已經(jīng)綁定,但是沒(méi)有連接到服務(wù)端,接著我們點(diǎn)擊解除服務(wù)綁定的話,系統(tǒng)仍然沒(méi)有任何反應(yīng),我們要是再接著點(diǎn)擊解除服務(wù)綁定的話,系統(tǒng)就會(huì)崩潰,這也就從而再次證明了服務(wù)只會(huì)綁定一次,多次綁定的話服務(wù)不會(huì)做出任何反應(yīng);服務(wù)解除綁定只能僅只能解除綁定一次,多次解除綁定服務(wù)的話,系統(tǒng)就會(huì)崩潰。

第三、我們直接點(diǎn)擊接受數(shù)據(jù),系統(tǒng)程序也會(huì)崩潰,原因就是在于服務(wù)沒(méi)有綁定,服務(wù)端根本就沒(méi)有連接,相當(dāng)于數(shù)據(jù)讀取方法沒(méi)有實(shí)現(xiàn)。

第四:我們直接點(diǎn)擊解除綁定的話,系統(tǒng)程序也會(huì)崩潰,原因就是在于服務(wù)一次也沒(méi)有綁定。

我們現(xiàn)在運(yùn)行服務(wù)器,相對(duì)應(yīng)的效果又會(huì)怎么樣呢?具體效果如下解析:

第一、我們點(diǎn)擊綁定服務(wù),可以觀察到后臺(tái)logcat日志信息:

從日志我們可以看出在客戶端C綁定服務(wù)同時(shí)連接服務(wù)端,可以看到服務(wù)端Service的啟動(dòng)onCreate和服務(wù)Service綁定onBind。

第二、我們點(diǎn)擊獲取數(shù)據(jù),可以觀察到后臺(tái)logcat日志信息:

從日志圖中我們可以看出客戶端將client字符串?dāng)?shù)據(jù)傳遞給服務(wù)器端,服務(wù)器端接受并返回一個(gè)字符串?dāng)?shù)據(jù)。

第三、我們點(diǎn)擊解除綁定服務(wù),具體logcat如下:

第四:如果我們不點(diǎn)擊綁定服務(wù),而是直接點(diǎn)獲取數(shù)據(jù),或者解除綁定的話,系統(tǒng)都將會(huì)崩潰,具體原因前面已經(jīng)解釋清楚,在此不作過(guò)多重復(fù)。

以上就是AIDL在多進(jìn)程中通信調(diào)用的簡(jiǎn)單應(yīng)用(C應(yīng)用程序啟動(dòng)S應(yīng)用程序服務(wù)Service)。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論

镇巴县| 伊宁市| 抚松县| 曲阳县| 全南县| 乐陵市| 柳江县| 汉川市| 勃利县| 大同市| 三穗县| 芦溪县| 土默特右旗| 孟州市| 绥滨县| 融水| 祁阳县| 兰考县| 内丘县| 五莲县| 石嘴山市| 阿拉尔市| 罗山县| 民丰县| 峨边| 方正县| 哈尔滨市| 施甸县| 渝中区| 游戏| 财经| 正定县| 西昌市| 威信县| 小金县| 石门县| 夏邑县| 随州市| 迁安市| 琼海市| 山西省|