2016-03-04 86 views
1

我試圖以確定當用戶關閉後,以任何方式,按home鍵,返回鍵或切換到其他應用我的應用程序正在被重新恢復後, 。Android的 - 如何知道什麼時候應用程序已經在後臺

我需要做的是,當應用程序進入後臺設置一個布爾值,因此,當它恢復,我知道,這是在之前的背景,我可以採取相應的行動。

我試圖在活動中使用onResume和onPause方法來知道應用程序何時在後臺運行,然後又恢復,但由於只有一個活動可以活着,所以我沒有成功。當一個活動暫停時,這並不意味着該應用程序進入後臺,因爲另一個活動可能已啓動,但該活動的onResume事件只有在前一個活動暫停後纔會觸發。

我也試着列出前景所有的應用程序,但沒有成功,如果我把我的應用程序在後臺恢復另一個應用程序,我的應用程序總是導致要在前臺。

我讀到由於Android 4有知道即使應用前景的新方法,但我需要我的應用程序是兼容Android 3.0的設備了。

這裏是我試圖在每一個活動將代碼(MyApp的是我的應用程序名稱):

@Override 
protected void onResume() { 
    super.onResume(); 
    MyApp.isPaused = false; 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    MyApp.isPaused = true; 
} 

這也是我試圖列出前景所有的應用程序:

ActivityManager activityManager = (ActivityManager)((Activity) currentContext).getSystemService(ACTIVITY_SERVICE); 
    List<RunningAppProcessInfo> appProcesses = activityManager.getRunningAppProcesses(); 
    for(RunningAppProcessInfo appProcess : appProcesses){ 
     if(appProcess.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND){ 
      if(appProcess.processName.equals("com.xxx.myapp")) { 
       Log.i("MyApp", "it's in foreground"); 
      } 
      Log.i("MyApp", appProcess.processName); 
     } 
    } 
+0

你能張貼一些代碼? – Talha

+0

@Talha我添加了一些代碼 – dany84

回答

3

這個class提供了一個單例來確定「在後臺的活動」狀態。它使用具有閾值(即0.3s)的計時器來確定活動是否進入後臺。

需要指出的一件事是,如果用戶恢復到閾值(即0.3秒)內的活動,則此測試將失敗。

如果你有一個更好的解決方案,請與我們分享:)

編號:https://gist.github.com/steveliles/11116937

+0

非常有趣,我會嘗試,謝謝! – dany84

+0

對不起,我更新了這個類的原始作者的鏈接 – VoidExplorer

+0

沒問題,我還沒有開始實施。謝謝! – dany84

0

Application中覆蓋onTrimMemory(int level)。可能不是最漂亮的方式,但它已經爲我工作。

你會得到

TRIM_MEMORY_BACKGROUND = 40; 

當你的應用程序進入後臺。

0

你可以讓應用程序類的項目,以節省您的項目的狀態裏面。當有任何活動暫停時暫停呼叫時恢復呼叫時恢復方法並保存該課堂內部的狀態。即使一個活動繼續暫停,你的班級也會知道確切的申請狀態。或者您可以在每個活動中以共享首選項保存應用程序狀態的另一種方式可以更改其值。

2

你是絕對正確的:)因爲只有一個活動可以同時是活着的,所以你需要的東西,它通過仍然活着出來的應用程序生命週期:)喜歡的應用實例本身,或者您也可以使用該共享偏好物。但是如果你問我,那麼認真使用共享預設來檢查生命週期是錯誤的選擇。

如果我在你的位置,我會去爲應用類:)下面是代碼,如果你想要做同樣的:)

import android.app.Application; 

/** 
* Created by sandeepbhandari on 3/3/16. 
*/ 
public class AppService extends Application{ 
    private static AppService sInstance; 
    public static boolean isGoingToBackGround=false; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     sInstance = this; 
    } 

    public static AppService getInstance() { 
     return sInstance; 
    } 
} 

在所有的活動的onPause剛剛成立

AppService service = AppService.getInstance(); 
     service.isGoingToBackGround =true; 

而且在檢查的onResume同一variablethats所有:),是的,如果你想使用你的應用類,而不是默認的應用程序,你必須做出改變來體現。XML

<application 
     android:name=".AppService" 

這就是所有:)

+0

getInstance()僅當您不在您的應用程序類AndroidManifest.xml中調整此類時才返回null)它是一個工作代碼:) –

+0

謝謝,但是如果某個活動暫停時並不意味着該應用程序在後臺。它可能已經暫停,因爲正在啓動另一個活動,而不是因爲該應用已關閉。 – dany84

+0

然後嘗試onStop :)當應用程序被完全隱藏時onStop被調用,並且在按照文檔部分隱藏活動時調用onPause :) http://developer.android.com/training/basics/activity-lifecycle/pausing.html你也可以嘗試onWindowFocusChanged上的活動:) –

0

我相信沒有必要爲了使u張貼代碼...這樣說...... 開始每隔實現的方法onCreate()onPause()onDestroy()記錄,和其他知名的活動方法... 但後退按鈕不只是暫停它殺死,因此onCreate被稱爲最 和檢查onStart()了。

+0

,所有方法都在活動生命週期內調用。如果在活動中調用onPause或onDestroy,那麼並不意味着該應用程序在後臺。如果啓動了其他活動,則在上一活動暫停/銷燬後調用onStart,onResume或onCreate方法。 – dany84

0
public class CustomApplication extends Application { 
    private static boolean activityVisible; 
    @Override 
    public void onCreate() { 
     super.onCreate(); 

    } 

    public static boolean isActivityVisible() { 
     return activityVisible; 
    } 

    public static void activityResumed() { 
     activityVisible = true; 
    } 

    public static void activityPaused() { 
     activityVisible = false; 
    } 
} 

,並在您的所有活動設置

@Override 
    protected void onResume() { 
     super.onResume(); 
     CustomApplication.activityResumed(); 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     CustomApplication.activityPaused(); 
    } 

和您的清單

<application 
     android:name=".CustomApplication" 
+0

我已經嘗試過,但問題是,當一個活動暫停時,並不意味着該應用程序在後臺。 – dany84

+0

活動在後臺暫停。 http://developer.android.com/training/basics/activity-lifecycle/pausing.html#Pause – MPG

+0

還有一件事你必須在所有的活動中寫onPause方法代碼,因爲我建議請閱讀我的答案。 – MPG

相關問題