2012-08-22 35 views

回答

0

我建议从活动Activity中调用bindService()并打开到服务的连接。在您的服务绑定器连接上定义的一种方法应该将Binder作为参数。该活动将实例化此Binder并将其传递到Service的活页夹方法中。当有趣的事件发生时,服务应该调用活动传递给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通话业务,且当ServiceConnection接收onServiceConnected你投的存根IServiceConnection,然后调用registerCallback方法。

0

我不建议该行动计划。没有用户许可和预知的操作和UI功能是不友善的。但要做到这一点,您需要通过应用程序扩展中的静态字段或字段(或单身状态机等)来维护您的活动。

+0

那么用户会致电打开服务中的选项菜单。我有保存在静态类中的当前活动的上下文。所以我可以这样调用:SomeClass.SaticClass.getContext()。openOptionsMenu();?我已经注意到eclipse希望我将getContext()方法的Activity类型化。 – Dogz1