我正在尝试从小部件远程控制动态壁纸。它们在同一个 APK 中,但进程明显不同。调用动态壁纸的“活动”对我来说没什么用,因为它是一个不同的过程。小部件有简单的按钮,按下时,
所以(我认为)我需要的是 IPC 和 AIDL。
首先,我在墙纸一侧创建了 AIDL,效果很好。它具有三个没有额外参数的方法。但是当我将客户端添加到小部件时,我收到一条错误消息,告诉我我无法绑定到该远程接口,因为小部件已经是一个 BroadcastListener。我尝试在不需要 Widget 成为 BroadcastListener 的情况下进行按钮处理,但这似乎是不可能的。
好吧,没问题,对吧?我刚刚在绑定到远程接口的小部件中创建了一个服务,因为虽然小部件是 BroadcastListener,但服务不是,一切都应该没问题。
或者我是这么想的。
好吧,我正在获取小部件的按钮来触发小部件服务。绑定到远程服务会产生以下警告:
无法启动服务 Intent (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 是去这里的方式,我做错了什么?