您可以使用SharedPreferences來存儲某個值(在服務中),並且您的活動可以通過從SharedPreferences中加載值來根據它進行操作。
你也可以使用EventBus並使用它傳遞一些事件。方式應該是這樣的:
- 您的活動註冊EventBus捕獲一些特殊的事件,而不是NLS。 - 通知服務在需要時生成併發布事件。它還打包你的活動需要到事件 任何數據 - 您的活動從NS抓住新的事件,並從中獲得數據:
public void onEvent(final FriendsRenameEvent event) {
Log.i(this, "onEvent() FriendsRenameEvent event");
if (event.isActionSucced)
listAdapter.notifyDataSetChanged();
}
事件僅僅是一個simeple類(擴展對象):
public class FriendsRenameEvent {
public final boolean isActionSucced;
public FriendsRenameEvent(final boolean isSucced/*, final Contact rejectedContact*/) {
this.isActionSucced = isSucced;
}
}
使用它的這樣的(一個GCMIntenService的一部分)GCM
林:
private void handleMessage(final Bundle gcmBundle) {
if (gcmBundle == null) {
Log.e(this, "handleMessage(): Received null-gcmBundle in GCMIntentService.onReceive()!");
return;
}
Log.i(this, "handleMessage(): gcmBundle: " + gcmBundle);
EventBus.getDefault().post(new IncomingGCMEvent(gcmBundle));
}
而在活動:
public void onEventMainThread(final IncomingGCMEvent event) {
final String payloadMessage = event.gcmBundle.getString("collapse_key");
...
}
此外還有一個綁定機制將服務和活動綁定在一起。使用Bind接口,你可以像Activity的自己的方法一樣從一個Activity中運行一個Sevice的方法。
通過廣播發布內容的服務如何與通過事件發佈內容不同?我的意思是它仍然是一個推動設計,但我需要拉動活動。或者事件總線可以提供拉式功能?感謝關於SharedPreferences的建議,這可能是一個簡單的解決方案。 – Gruntcakes 2015-04-01 20:26:27
NotificationListenerService可以預先設置一個事件,並且您的Activity捕獲該事件。不需要拉動。你可以在事件中包含任何你想要的東西。所以當Activity收到事件時,它可以從中「拉出」所需的數據。你有沒有嘗試過EventBus?如果不嘗試,我會鏈接它的GitHub – Stan 2015-04-01 20:32:48
NLS看起來很特別 - 只有操作系統可以綁定它。並且NLS在活動創建之前由操作系統啓動,因此活動沒有機會設置監聽等,以及時捕獲服務的初始輸出(否則服務可以通過廣播或一個事件等onListenerConnected,但這太早,它會被活動所錯過)。 – Gruntcakes 2015-04-01 20:37:57