Androidのクロスプロセス(APP)コミュニケーション(4) - AIDL

アンドロイドクロスプロセス(APP)通信(A) -のいくつかの例
のプロセスを横切るアンドロイド(APP)通信(B) -非AIDL
アンドロイドクロスプロセス(APP)通信(3) -プロキシ及びスタブモード
アンドロイドクロスプロセス(APP)通信(4 ) - AIDL

AIDLは何ですか

この一連の記事から、我々は知っていますProxy和Stub模式実際には、跨进程通信いわゆるAIDLを達成するために私たちを支援することですProxy和Stub模式、私たちより良いパッケージを支援する编码译码機能を。または底面transactonTransact呼び出す方法。

小さな例

古典的なエコーのプログラムを作成します。プリントアウトして、サービスにサービスを単語を送信するためのプログラム。

STEP 1:AIDLインタフェースファイル(APPのサービスを提供)

他の人が使用できるようにするインターフェースをご利用のサービスプロバイダが、あなたはそれが明確にそれを達成するために、この時に指定する必要がないことを確認する必要があり。

  • com.example.aidlechoservice.aidlパッケージ
  • 作成し、通常のファイルの名前を、IEchoService.aidl
1 
2
3
4
5
パッケージ com.example.aidlechoservice.aidl。

インターフェース {文字列のエコー(文字列INSTR) }


Eclipseを使用している場合は、この定義が作成した後、我々はわかりますgen/com.example.aidlechoservice.aidl/IEchoService.javaファイルを

第二段階:(APPのサービスを提供する)サーバ側のスタブを実装

スーパーシンプルな、言葉だけ。

1 
2
3
4
5
6
7
IEchoService.Stub mBinder = 新しい IEchoService.Stub(){ 公共の文字列のエコー(文字列INSTR)がスロー RemoteExceptionを { リターン"エコー" + INSTR + "に" + sdf.format(新しい日付())。			} 		}。






だから、全体的に、このコード

1 
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
パブリック クラス EchoServiceは、 拡張 サービス  { プライベート IEchoService.Stub mBinderを。民間のSimpleDateFormat自衛隊= 新しいてSimpleDateFormat("YYYY-MM-DD HH:MM:SS"); 公共のボイドのonCreate () { スーパー .onCreate(); 		mBinder = 新しい IEchoService.Stub(){ 公共の文字列のエコー(文字列INSTR)がスローのRemoteException { リターンを"エコー" + INSTR + "に" + sdf.format(新しい日付())。			}













}。
} 公共 IBinder [OnBind]の(意図意図) { 戻り mBinderと、 } }







第三段階:APP AIDLの準備(APPサービスの呼び出し)

上記のサービスはまったく同じですと、それはそれ以外の場合は動作しません、まったく同じでなければなりません。

ステップ4:クライアントプロキシ(APPサービスの呼び出し)を実装

非常に単純な、単語を取得したり、

1
IEchoService mService = IEchoService.Stub.asInterface(バインダー)

レイアウト

1 
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
< のLinearLayout  のxmlns:アンドロイド = "http://schemas.android.com/apk/res/android" のxmlns:ツール = "http://schemas.android.com/tools" のandroid:layout_width = 大专栏アンドロイド跨进程(APP)通信(四) - AIDL 4; match_parent」アンドロイド:layout_height = "match_parent" アンドロイド:オリエンテーション = "垂直" >

 



< ボタンアンドロイド:layout_width = "match_parent" のandroid:layout_height = "wrap_content" アンドロイド:のonClick = "バインド" アンドロイド:テキスト = "バインドサービス" />





< ボタンアンドロイド:layout_width = "match_parent" のandroid:layout_height = "wrap_content" アンドロイド:のonClick = "エコー" のandroid:テキスト = "エコー" />





< ボタンアンドロイド:layout_width = "match_parent" のandroid:layout_height = "wrap_content" アンドロイド:のonClick = "アンバインド" アンドロイド:テキスト = "アンバインドサービス" />





</ のLinearLayout >

コード

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
public class MainActivity extends Activity {

private IEchoService mService;
private ServiceConnection mServiceConnection;
private Intent mServiceIntent = new Intent();


protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mServiceIntent.setComponent(
new ComponentName("com.example.aidlechoservice", "com.example.aidlechoservice.service.EchoService"));
mServiceConnection = new ServiceConnection() {

@Override
public void onServiceDisconnected(ComponentName name) {

}

@Override
public void onServiceConnected(ComponentName name, IBinder binder) {
mService = IEchoService.Stub.asInterface(binder);
}
};
}

public void bind(View v) {
if (isBinded()) {
return;
}
bindService(mServiceIntent, mServiceConnection, Context.BIND_AUTO_CREATE);
}

public void unbind(View v) {
if(!isBinded()){ 返します } unbindService(mServiceConnection)。 } パブリック無効エコー(ビューV) { 場合(!isBinded()){ 返します } してみてください { 文字列の結果= mService.echo("こんにちは、世界を!!!"); Log.i("TAG" 結果)。 } キャッチ(RemoteExceptionを電子){ e.printStackTrace(); } } プライベートブールisBinded () { 戻り mService =!ヌル } }





















プロジェクトアドレス

Githubの住所

おすすめ

転載: www.cnblogs.com/sanxiandoupi/p/11711125.html