2012-07-30 46 views
0

我試圖讓我的應用程序的主要活動完成(而不是在後臺保持活動的應用程序),同時保持該流程活着的服務。一旦焦點丟失,如何殺死應用程序?

如果用戶按下home按鈕並離開我的應用程序或從我的應用程序外部啓動了其他活動,我希望該活動被關閉並且不被列爲活動應用程序。

然而,重要的是,這個過程仍然存在。我不希望我的後臺服務也會死機。

要做到這一點,最好的方法是什麼?

+0

關閉一個應用程序是熱門話題,閱讀此:[退出應用程序 - 是皺眉?](http://stackoverflow.com/q/2033914/1267661)。簡而言之,自己關閉應用程序並不是必需的。 – Sam 2012-07-30 21:32:54

+0

「我希望這個活動能夠被關閉,而不是作爲一個活躍的應用程序列出來,但是這個過程仍然存在很重要,我不希望我的後臺服務也會死掉。」 - 這些是相互排斥的概念。您的應用程序正在運行,或者它沒有運行。除了薛定諤的貓場景的應用外,它不能同時運行和不運行。報告進程運行的任何內容都會報告您正在運行的進程。 – CommonsWare 2012-07-30 21:39:15

+0

正在運行的進程與任務管理器中列出的「活動」應用程序之間存在差異。 – bgroenks 2012-07-31 00:51:40

回答

0

您不應該強行關閉應用程序,因爲系統在處理這個問題時表現不錯。相反,您應該調用finish()來表示該應用已完成並且可以被處置掉(您的服務將繼續運行)。

+0

是的。但我正在尋找如何有效地做到這一點。 – bgroenks 2012-07-31 00:52:52

0

默認情況下Services沒有UI。一旦開始,他們跑,直到他們崩潰或死亡。用戶可以關閉你的應用程序並啓動一個新的服務,服務將會持續。

Activities另一方面只在它們可見時才運行。當用戶導航到其他活動時,以前的活動是paused, stopped, or killed

一個簡單的方法來做你剛纔簡要描述的將是創建一個啓動服務的活動。這種方式,當使用導航離開你的活動服務將繼續在後臺運行。

如果你希望你的活動完全死去,每當一個新的活動映入眼簾簡單地把調用finish()onPause()onStop()方法,爲您的活動(這曾經是更適合您的應用程序)。

+0

問題在於如果Activity啓動另一個Activity,則onPause方法的finish()調用將關閉該應用程序。 – bgroenks 2012-07-31 00:52:32

+0

不,它不會關閉應用程序,它只會關閉該「活動」。您已經開始的任何其他「活動」或「服務」將繼續運行。此外,您將呼叫發送至「完成」取決於您的具體需求。你需要弄清楚它在'onPause()'還是'onStop()'中更合適。 – slayton 2012-07-31 03:49:38

+0

在onStop中執行此操作會引發異常,並在onPause中執行此操作會導致應用程序在活動啓動是子活動時退出。 – bgroenks 2012-07-31 04:30:57

0

您應該創建一個Application類。像這樣:

public class AvaApplication extends Application { 
    private static boolean FOCUSED = true; 

    public static boolean isAppFocused() { 
     Log.v("@@@@@@ isAppFocused", "called"); 
     return FOCUSED; 
    } 

    public static void appResumed() { 
     Log.v("@@@@@@ appResumed", "called"); 
     FOCUSED = true; 
    } 

    public static void appPaused() { 
     Log.v("@@@@@@ appPaused", "called"); 
     FOCUSED = false; 
    } 
} 
在AdroidManifest.xml

這一行添加到您的應用程序標籤:

android:name="your.package.name.MyApplication" 

每一個活動裏面這樣寫:

@Override 
protected void onPause() { 
    super.onPause(); 
    MyApplication.appPaused(); 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    MyApplication.appResumed(); 
} 

@Override 
public void onWindowFocusChanged(boolean hasFocus) { 
    super.onWindowFocusChanged(hasFocus); 
    if (hasFocus) 
    { 
     //do something if you want 
    } else { 
     Thread.sleep(100); 
     if(!MyApplication.isAppFocused){ 

      finish(); 
      return(); 
     } 
    } 
} 

,默認情況下後臺服務應繼續運行,但您也可以使用START_STICKY。在您的服務內:

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 

    //do your stuff in the service 

    return Service.START_STICKY; 
}