ウィジェットからライブ壁紙をリモート コントロールしようとしています。それらは同じ APK にありますが、明らかに異なるプロセスです。ライブ壁紙の「アクティビティ」を呼び出すことは、別のプロセスであるため、ほとんど役に立ちません。ウィジェットにはシンプルなボタンがあり、押すと、
だから私が必要としているのは(私が思うに)IPCとAIDLです。
まず、壁紙側で AIDL を作成しましたが、うまくいきました。追加のパラメーターのない 3 つのメソッドがあります。しかし、クライアント側をウィジェットに追加すると、ウィジェットが既に BroadcastListener であるため、そのリモート インターフェイスにバインドできないというエラーが表示されました。Widget を BroadcastListener にすることなくボタン処理を取得しようとしましたが、それは不可能のようです。
問題ありませんよね?ウィジェットは BroadcastListener ですが、サービスはそうではなく、すべて問題ないため、リモート インターフェイスにバインドするウィジェット内にサービスを作成しました。
とか、そう思いました。
さて、ウィジェット サービスをトリガーするウィジェットのボタンを取得しています。リモート サービスにバインドすると、次の警告が表示されます。
サービスを開始できません インテント (act=com.blabla.IRemoteService): 見つかりません。
リモートのものにバインドするために、ウィジェットのサービス内で getApplicationContext() を使用しています。マニフェストにウィジェット サービスはありますが、リモート サービスはありません。そこに入れると、不特定の InstantiationException が発生します。
ウィジェットのサービス onStart() で、私はこれをやっています:
getApplicationContext().bindService(new Intent(IWallpaperRemote.class.getName()),
mConnection, Context.BIND_AUTO_CREATE);
私も持っています...
private ServiceConnection mConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className,
IBinder service) {
mService = IWallpaperRemote.Stub.asInterface(service);
isBound = true;
Log.i("WidgetServiceConnection", "binding to service succeeded");
}
public void onServiceDisconnected(ComponentName className) {
mService = null;
isBound = false;
Log.i("WidgetServiceConnection", "binding to service lost!");
}
};
私の質問は次のとおりです。ウィジェットから別のアプリケーションへのリモート呼び出しに成功した人はいますか? ここでライブ壁紙について話していることと、ウィジェット プロセス内でアクティビティを呼び出すことには関心がないが、ライブ壁紙内で関数呼び出しを行うことに興味があるという事実を考慮すると、IPC 以外にどのようなオプションがありますか?
そして、IPCがここに行く方法である場合、私は何を間違っていますか?