![](/img/trans.png)
[英]How to Communicate between Activity and Service using LocalBroadcastManager in a different Process
[英]Communicate between service and activity
我在上課
MyClass m = new MyClass();
在班級內部,我檢查是否有覆蓋視圖的權限; 如果是這樣,沒關系,否則我必須開始一項活動
if (Settings.canDrawOverlays(mContext)) {
// draw over app
} else {
// start the activity
Intent i = new Intent(context,Calls.class);
context.startActivity(i);
}
當我開始活動時,我在班級和活動之間進行交流時遇到問題。 我知道如何使用該界面,但如何在活動中注冊它。
有一段時間我想將對象或數據從類傳遞到活動或從活動傳遞給類...我該怎么做?
我在Stack Overflow中看到了許多有關如何在服務和活動之間進行通信的示例。 他們建議從活動開始上課,但這在我的應用程序中不起作用 ,因為我的課必須一直在運行。
也許您可以使用類似事件總線的機制,通過該機制您可以通過應用程序發送或接收事件。盡管那里有多個庫,但我還是建議您將Otto庫用於android。
用法非常簡單,只需在onCreate
的活動中注冊
Bus bus = new Bus();
bus.register(this);
用於發送事件
// example data to post
public class TestData {
public String message;
}
// post this data
bus.post(new TestData().message="Hello from the activity");
並訂閱這樣的活動
@Subscribe public void getMessage(TestData data) {
// TODO: React to the event somehow!
}
更多信息在這里
如果要實現Service
與Activity
之間的通信模式,則應使用LocalBroadcastManager 。
它將變得很方便,因為如果萬一您的Service
仍處於打開狀態,但您的Activity
已被銷毀(非常常見的情況),則兩者之間的“消息傳遞”將完全無效(不會拋出NPE
或任何東西)。
第1步
在Activity
創建一個BroadcastReceiver
並定義一個ID
/ Filter
this.localBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// Do what you have to do here if you receive data from the Service / Background Task
}
}
public static final IntentFilter SIGNAL_FILTER = new IntentFilter("com.you.yourapp.MY_SIGNAL")
第2步
在您的Activity
,在onResume()
注冊廣播,然后在onPause()
取消注冊。
@Override
protected void onResume() {
// Listen if a Service send me some data
LocalBroadcastManager.getInstance(getApplicationContext()).registerReceiver(this.localBroadcastReceiver, SIGNAL_FILTER);
}
@Override
protected void onPause() {
// I'm going to the background / or being destroyed: no need to listen to anything anymore...
LocalBroadcastManager.getInstance(getApplicationContext()).unregisterReceiver(this.localBroadcastReceiver);
}
現在,您的Activity
已准備就緒,可以從Application
任何其他組件接收數據。
如果它在后台,則無需更新UI
:實際上,如果在后台,則Activity
將不會響應。
以同樣的方式,如果正在垃圾回收中,則Receiver
將被注銷, Activity
將不響應任何內容。
如果恢復/重新啟動Activity
,將觸發onResume()
並重新注冊Receiver
。
第三步
您現在要做的就是從Service
發送數據。
只需致電
final Intent intent = new Intent();
intent.setAction(SomeActivity.SIGNAL_FILTER);
// put your data in intent
LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(intent);
並且您的Activity
將相應地響應該信號。
令人驚訝的是,很少有人知道LocalBroadcastManager
,而是使用一些自我實現的回調/單例模式,這會增加復雜性和不可讀取性。
這種模式是Android
內置的,因此您不需要外部庫。 至於安全性,這可確保您的信號保持在應用程序內部:因此其他應用程序無法讀取任何數據。
我在這里同樣回答了另一個問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.