2012-08-22 57 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