簡體   English   中英

在服務和活動之間進行溝通

[英]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!
}

更多信息在這里

如果要實現ServiceActivity之間的通信模式,則應使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM