AIDL を実装しようとしていますが、その仕組みがわかりません。これは、メソッド呼び出しの進行状況を意味します。
AIDL を介してサービスからアクティビティにオブジェクトを取得する方法がわかりません。ガイダンスとしてGoogleドキュメントを使用していますが、混乱しています.Thanks.
アップデート:
Service Connection には、mCallback が IRemoteServiceCallback であるこれらの行があります。
public void onServiceConnected(ComponentName name, IBinder service) {
mRemoteInterface = IRemoteInterface.Stub.asInterface(service);
Log.v(TAG, "Interface bound.");
try{
mRemoteInterface.registerCallback(mCallback);
}catch(RemoteException e){
}
Toast.makeText(MainActivity.this, "Remote Service Connected",
Toast.LENGTH_SHORT).show();
}
これが registerCallback で、mCallbacks は
final RemoteCallbackList <IRemoteServiceCallback> mCallbacks
= new RemoteCallbackList <IRemoteServiceCallback> ();
.....
public void registerCallback(IRemoteServiceCallback callback)
throws RemoteException {
if(callback != null){
mCallbacks.register(callback);
}
}
IRemoteServiceCallback(mCallback) が持つ唯一のメソッドは次のとおりです。
public void valueChanged(int value) {
mHandler.sendMessage(mHandler.obtainMessage(BUMP_MSG, value, 0));
}
私もハンドラーを持っていますが、それをどうするかよくわかりません:
private Handler mHandler = new Handler() {
@Override public void handleMessage(Message msg) {
switch (msg.what) {
case BUMP_MSG:
Log.d(TAG, "Received from service: " + msg.arg1);
break;
default:
super.handleMessage(msg);
}
}
};
更新 2:
AIDL ステップ -私が理解していることから-。
MainActivity から bindService(service,connection,flags) を呼び出します
bindService を呼び出して接続が確立されると、onServiceConnected が自動的に呼び出されます。その中で、IBinder を取得し、registerCallback を呼び出して IRemoteServiceCallback[ WHERE DOES THIS CALLBACK COME FROM?? ] を RemoteCallbackList に追加して、後でアクセスできるようにします
ここで、サービスに 1 つ、アクティビティに 1 つの、2 つの mHandler があることに気付きました。[これらはいつ呼び出され、使用上の違いは何ですか]
これで、RemoteCallbackList には必要なコールバックが含まれており、アクティビティ クラスの mHandler で必要なオブジェクトを最終的に取得できることがわかります。