記事のシリーズ
AIDL基本的な使用
AIDLのカスタムデータ型
の再接続のAIDL方法
インターフェイス登録/登録解除AIDL
AIDLの接続プール
知識ポイント
- AIDLの間で使用されるインタフェース
- インターAIDLプロセスのインターフェイス登録/登録解除
AIDL間のインタフェースの第1、使用
AIDLクロスプロセス通信用いて処理するので、なぜ具体的には、登録および登録インターフェースの解除を説明インタフェースオブジェクトは、メモリ内のすべてのアドレスを渡す同じではない登録した後に、従来使用できません、キャンセルする方法は、転送登録登録和解インタフェースアドレスが同じではないので、システムが認識しません
上記の問題に、AIDLは、特にこのような状況に対処するクラスを提供RemoteCallbackList
し、その動作原理は次のとおりです。
マップキーの地図のすべてのAIDLを保存するように設計されたコールバック内の結果IBinderタイプで、値がコールバックタイプです。
同じオブジェクトの多くのクロスプロセス転送クライアントがサーバー上の別のオブジェクトを生成しますが、しかし、これらの新しく生成されたオブジェクトに共通しているのは、彼らが、根本的なバインダーが同じであるターゲット、あなたが遭遇したような問題点を達成することができます。この機能を利用することです
AIDLプロセス登録/登録解除との間の第二インタフェース
まず、説明の前に、基本的な使用AIDLに最初のインタフェースの基礎をして、新しいAIDL登録和解レジスタを追加します:
import com.returntolife.jjcode.mydemolist.bean.AIDLBook;
interface IOnNewBookArrivedListener {
void onNewsBookArrived(in AIDLBook book);
}
interface IPerson {
/**
* Demonstrates some basic types that you can use as parameters
* and return values in AIDL.
*/
void setName(String s);
String getName();
void setBook(in AIDLBook book);
AIDLBook getBook();
void registerListener(IOnNewBookArrivedListener listener);
void unregisterListener(IOnNewBookArrivedListener listener);
}
そして、それはRemoteCallbackList
使用する:
登録/登録解除は非常に簡単です
private RemoteCallbackList<IOnNewBookArrivedListener> mListener=new RemoteCallbackList<>();
...
...
@Override
public void registerListener(IOnNewBookArrivedListener listener) throws RemoteException {
LogUtil.d("registerListener listener="+listener);
mListener.register(listener);
}
@Override
public void unregisterListener(IOnNewBookArrivedListener listener) throws RemoteException {
LogUtil.d("unregisterListener listener="+listener);
mListener.unregister(listener);
}
:によってインタフェースの使用が続きます
@Override
public void setBook(AIDLBook book) throws RemoteException {
LogUtil.d("setBook="+book);
mybook=book;
//调用接口通知客户端
if(mListener!=null){
int size=mListener.beginBroadcast();
for (int i = 0; i < size; i++) {
IOnNewBookArrivedListener listener=mListener.getBroadcastItem(i);
listener.onNewsBookArrived(book);
}
mListener.finishBroadcast();
}
}
PS:ことに注意してくださいbeginBroadcast()
方法及びfinishBroadcast()
方法を使用する必要があり、単にセットのサイズを取得した場合でも、
概要
すぐに残していますが、使用AIDL間クロスプロセス通信は、私たちはしばしばのは、サーバーに気づくせ、待機するように登録する必要がありますが、クライアントがメッセージを受け入れるためのインタフェースを離れたくなかった場合は、サーバーにも登録解除の方法を提供し、またはしなければなりませんクライアント側の処理方法が間違って行かないが、それでも存在するモニター・コレクションのサーバー側の前に、それはシステムリソースを無駄になりますので、リスナーが登録され、最善の解決策は、登録を達成するためにする必要があります
Demo地址
https://github.com/returntolife455/DemoList
参考記事
「芸術的探求のAndroidの開発。」
ます。https://www.jianshu.com/p/e80c9bc36ed0で再現