0

我有一项服务(用于通信),需要调用当前正在运行的活动的 openOptionsMenu() 。我有大约 3 个左右的活动需要根据服务的请求显示他们的选项菜单。如何找到当前正在运行的活动?

4

2 回答 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 回答