我正在尝试从小部件远程控制动态壁纸.他们在同一个APK中,但显然是不同的过程.调用动态壁纸的"活动"对我来说没什么用处,因为它是一个不同的过程.小部件有简单的按钮,按下时,
那么(我认为)我需要的是IPC和AIDL.
首先,我在壁纸一侧创建了AIDL,效果很好.它有三种方法,没有额外的参数.但是当我将客户端添加到窗口小部件时,我收到一个错误,告诉我无法绑定到该远程接口,因为窗口小部件已经是BroadcastListener.我尝试在不需要Widget成为BroadcastListener的情况下获取按钮处理,但这似乎是不可能的.
好吧没问题吧?我刚刚在窗口小部件中创建了一个绑定到远程接口的服务,因为虽然窗口小部件是BroadcastListener,但服务不是,一切都应该没问题.
或者我想.
好吧,我正在获取小部件的按钮来触发小部件服务.绑定到远程服务会产生以下警告:
无法启动服务Intent(act = com.blabla.IRemoteService):找不到.
我在小部件的服务中使用getApplicationContext()来绑定到远程的东西.我在清单中有小部件服务,但我没有远程服务.当我把它放在那里时,我得到一个非特定的InstantiationException.
在Widget的服务onStart()我这样做:
getApplicationContext().bindService(new Intent(IWallpaperRemote.class.getName()),
mConnection, Context.BIND_AUTO_CREATE);
Run Code Online (Sandbox Code Playgroud)
我也有...
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!");
}
};
Run Code Online (Sandbox Code Playgroud)
我的问题是:有没有人成功地从一个小部件进入另一个应用程序的远程调用?考虑到我在这里谈论一个动态壁纸,以及我对在小部件过程中调用活动但在动态壁纸中引起函数调用不感兴趣的事实,除了IPC之外我还有哪些选项,如果有的话?
如果IPC是去这里的方式,我做错了什么?