我有一个需要调用当前运行活动的openOptionsMenu()的服务(用于通信)。我有大约3个左右的活动需要根据服务的请求显示他们的选项菜单。我怎样才能找到当前的运行活动?
答案 0 :(得分:0)
我不建议该行动计划。没有用户许可和预知的操作和UI功能是不友好的。但要做到这一点,您需要通过静态字段或Application扩展中的字段(或单例状态机等)维护您的Activity的实体引用。
答案 1 :(得分:0)
我建议从活动的Activity中调用bindService()并打开与服务的连接。在服务的活页夹连接上定义的方法之一应该以Binder作为参数。 Activity将实例化此Binder并将其传递给Service的binder方法。当有趣的事件发生时,服务应该在Binder上调用Activity传递它的方法。
当您的某个活动进入后台时,它应取消注册之前传入的Binder并从服务中取消绑定。
所以,你有一个类似于
的服务的AIDLinterface IServiceConnection {
void registerCallback(IActivityCallback callback);
void unregisterCallback(IActivityCallback callback);
}
然后你有一个看起来像
的IActivityCallback.aidloneway 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方法。