如何从服务中打开Activity.openOptionsMenu()

时间:2012-08-22 22:47:54

标签: android service android-activity android-optionsmenu

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

2 个答案:

答案 0 :(得分:0)

我不建议该行动计划。没有用户许可和预知的操作和UI功能是不友好的。但要做到这一点,您需要通过静态字段或Application扩展中的字段(或单例状态机等)维护您的Activity的实体引用。

答案 1 :(得分:0)

我建议从活动的Activity中调用bindService()并打开与服务的连接。在服务的活页夹连接上定义的方法之一应该以Binder作为参数。 Activity将实例化此Binder并将其传递给Service的binder方法。当有趣的事件发生时,服务应该在Binder上调用Activity传递它的方法。

当您的某个活动进入后台时,它应取消注册之前传入的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();
    }
}

在Service的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方法。