2017-10-06 104 views
1

是否可以將服務意圖從服務發送到應用程序類?不活動?將廣播意圖從服務發送到應用程序類

我不知道在特定時間將會運行什麼活動,所以我在活動類中添加了一個布爾標誌,它檢測活動並根據收到的廣播發送適當的數據。

+0

爲什麼應用程序類?你可以澄清你的情況 –

+0

@VivekMishra我有一個服務運行XMPP繁重。這項服務永遠在後臺運行。現在,當我想將數據從服務傳輸到應用程序時,用戶可能正在使用該應用程序。所以我想先喚醒應用程序,然後發送意圖和應用程序類將其處理到正確的活動 – Bezaleel

+0

爲什麼應用程序類?那可以在廣播接收機上完成 –

回答

0

如果您的Service處於活動狀態,那麼Application類別也是活動

否則,您將無法使用getApplicationContext()

雖然我懷疑論者一直運行有一個很乾淨的方法,使Service具有一定Activity通信的服務,應該是最後一個是被激活的。

這種乾淨的方式叫做LocalBroadcastManager

旨在接收數據的Activity應該在onResume()中註冊BroadcastReceiver並在onPause()中註銷它。

你實例化你的BroadcastReceiver在活動的onCreate()

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. 
    } 
} 

您創建一個過濾器,以便您的活動只聽某一類型的信號。

private IntentFilter notifIntentFilter new IntentFilter("com.you.yourapp.MY_SIGNAL"); 

onResume()

LocalBroadcastManager.getInstance(getApplicationContext()).registerReceiver(this.localBroadcastReceiver, notifIntentFilter); 

onPause()

LocalBroadcastManager.getInstance(getApplicationContext()).unregisterReceiver(this.localBroadcastReceiver); 

現在,每當你想將數據發送到你的活動,你的服務可以撥打:

final Intent intent = new Intent(); 
intent.setAction("com.you.yourapp.MY_SIGNAL"); 
// put your data in intent 

LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(intent); 

如果您的Activity清醒,它將響應信號。否則,如果它在後臺,或者它沒有實例化,它不會。

您可以將此模式應用於任意數量的活動。


儘管如此,我從來沒有使用這個Application類中。但是你可以嘗試在那裏註冊你的接收器。它可能有效,因爲如果Application類被銷燬,BroadcastReceiver也被銷燬,因此也可能未註冊。

問題是,如果你的應用程序被破壞,你的服務也會被殺死。除非你在另一個過程中啓動它。但是,它將擁有它自己的Application實例;這是一件複雜的事情,您現在可能不想深入細節......


重要:由於Application類是不依賴於任何UI組件,你可以做任何你需要直接您的服務中。如果你需要操縱用戶界面,那麼上面描述的模式將適用於你。

請閱讀關於新Android's background limitations


編輯:

噢權利,如果你需要你的服務來調用你的Application類中的函數聲明,你可以做

​​

我沒雖然我不明白你的問題,但是上述任何一種方法都適合你。

+0

嘗試了這一點,它並沒有很好的工作。調用類是在一個單獨的模塊中。 – Bezaleel

+0

@bezaleel你在另一個模塊中的含義是什麼?如果您發佈了一些代碼,它會幫助我們找到解決方案 – payloc

+0

想通了,上面的答案確實有效。我只是從單獨的模塊/庫擴展到當前的類,然後使用廣播接收器。然而,我不能將意圖發送給應用程序類本身,而不是首先發送到一個活動,但這是有效的。 – Bezaleel

相關問題