6

我有一個後臺任務,我想處理。問題是,當任務完成時,我想調用一個新的Activity向用戶顯示結果,只有當我的主Activity顯示時,否則我只想發送一個通知,以便用戶可以看到該操作完成,並能夠隨時打開它,只要他喜歡。僅當活動未顯示時才顯示通知

我正在考慮使用服務來處理後臺任務的開始和終止,並在完成時廣播消息,但在這種情況下,我無法知道是顯示活動還是未處理廣播我應該發送通知。

所以這是我的問題,因爲我在後臺任務和服務方面的知識和經驗有限,我決定尋求一些幫助。

在此先感謝您閱讀我的案例,希望對您有所幫助!

回答

23

下面是一篇很好的文章,介紹如何實現你想要的內容:Activity or Notification via Ordered Broadcast

主要想法是使用有序廣播。你應該創建一個BroadcastReceiver這將生活沒有任何活動。爲了做到這一點,你應該在AndroidManifest.xml文件中聲明它。該接收器將顯示一個Notification。你也應該在你的主要活動中註冊另一個BroadcastReceiver,它會在屏幕上顯示一些東西。那麼你只需要發送一個有序的廣播。

+0

這是一個可能的答案,我發現問題後發現,似乎真的很好的做法。鏈接非常有用,非常感謝。我認爲這是我將遵循的方式! – akalipetis

+3

超級優雅,效果不錯! – Orr

+0

@Antonis:你能提供一個我們如何實現這個的代碼嗎? – Sam

2

試試這個。

private static boolean isInForeground; 

onResume(){ 
    isInForground = true; 
} 
onPause(){ 
    isInForground = false; 
} 

如果isInForground是true然後活動是在Forground(顯示),否則不顯示。

如果您想從任何地方知道,請在MainActivity中添加以下內容。

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); 

    onResume(){ 
     pref = PreferenceManager.getDefaultSharedPreferences(this); 
     prefEditor = prefs.edit(); 
     prefEditor.putBoolean("isInForeground",true); 
     prefEditor.commit(); 
    } 

    onPause(){ 
      pref = PreferenceManager.getDefaultSharedPreferences(this); 
      prefEditor = prefs.edit(); 
      prefEditor.putBoolean("isInForeground", false); 
      prefEditor.commit(); 
    } 

然後從您的服務。

pref = PreferenceManager.getDefaultSharedPreferences(this); 
if(pref.getBoolean("isInForeground", false)){ 
     //MainActivity is in forground 

} 
else{ 
     //not in forground 
} 
1

聽起來好像你想在一個服務的線程中執行任務。您可以在活動中擁有一個持久靜態布爾值,指出是否顯示該活動。一個活動在onResume()中對用戶是可見的,並且只要調用onPause()就不可見。在onResume()中將布爾值設置爲true,在onPause()中設置爲false。

0

你可以使用SharedPreferences; 在onStart()或onStop()時更新活動的首選項,並在您的服務中對其進行驗證。

希望我會幫助。