我有一项服务(用于通信),需要调用当前正在运行的活动的 openOptionsMenu() 。我有大约 3 个左右的活动需要根据服务的请求显示他们的选项菜单。如何找到当前正在运行的活动?
问问题
521 次
2 回答
0
我的建议是从活动的活动中调用 bindService() 并打开与服务的连接。在您的服务的活页夹连接上定义的方法之一应该将活页夹作为参数。Activity 将实例化这个 Binder 并将其传递给 Service 的 binder 方法。当有趣的事件发生时,Service 应该调用 Activity 传递给它的 Binder 上的方法。
当您的一个活动进入后台时,它应该取消注册之前传入的 Binder 并从服务中取消绑定。
所以,你有一个服务的 AIDL,看起来像
interface IServiceConnection {
void registerCallback(IActivityCallback callback);
void unregisterCallback(IActivityCallback callback);
}
然后你有一个 IActivityCallback.aidl 看起来像
oneway interface IActivityCallback {
void openOptionsMenu();
}
在您的服务中,您有
private ArrayList<IActivityCallback> mCallbacks = new ArrayList<IActivityCallback>();
private IServiceConnection.Stub mBinder = new IServiceConnection.Stub() {
public void registerCallback(IActivityCallback callback) {
mCallbacks.add(callback);
}
public void registerCallback(IActivityCallback callback) {
mCallbacks.remove(callback);
}
}
private void onEvent() {
for (int ptr = mCallbacks.size() - 1; ptr > -1; ptr--) {
mCallbacks.get(ptr).openOptionsMenu();
}
}
在您的服务的 onBind 方法中,您返回 mBinder。
在您的活动中,您有
private IActivityCallback.Stub mPlayerBinder = new IActivityCallback.Stub() {
public void openOptionsMenu() {
// call method in Activity to show options menu
}
}
您使用 bindService 调用从您的 Activity 绑定到您的服务,当 ServiceConnection 接收到 onServiceConnected 时,您将其存根转换为 IServiceConnection,然后调用 registerCallback 方法。
于 2012-08-22T23:35:22.930 回答
0
我不建议采取这种行动计划。在未经用户许可和预知的情况下操作和 UI 功能是不友好的。但要做到这一点,您需要通过静态字段或应用程序扩展中的字段(或单例状态机等)维护对您的活动的可靠引用。
于 2012-08-22T23:03:33.407 回答