天天看點

android怎樣判斷應用程式退到背景

 判斷手機是否退到背景,這是我們在Android開發中實作一些功能時,經常會考慮的問題

比如:按HOME,BACK鍵時,程式退到背景,消息以Notification形式彈出 ,或者程式在服務中把App退到背景,彈出服務浮窗,點選後回到目前頁面等,這些也是實作及時通訊,服務推送過程經常遇到的,比如QQ,微信消息提醒,網絡電話通知展示等.

廢話不多說,直接上圖:

android怎樣判斷應用程式退到背景

如果需要判斷程式進入背景,然後顯示通知,彈出通知之後,直接進入HOME鍵之前頁面,情點選下一節

程式背景切換前台,點選通知進入目前頁面

DEMO下載下傳位址為:點選下載下傳demo

判斷手機是否退到背景,本人查閱各種資料,發現實作其實很簡單,目前自己主要實作方式有兩種:

方式一:

  1. public boolean isAppOnForeground() {

  2. ActivityManager activityManager = (ActivityManager) getApplicationContext()

  3. .getSystemService(Context.ACTIVITY_SERVICE);

  4. String packageName = getApplicationContext().getPackageName();

  5. List<ActivityManager.RunningAppProcessInfo> appProcesses = activityManager

  6. .getRunningAppProcesses();

  7. if (appProcesses == null)

  8. return false;

  9. for (ActivityManager.RunningAppProcessInfo appProcess : appProcesses) {

  10. // The name of the process that this object is associated with.

  11. if (appProcess.processName.equals(packageName)

  12. && appProcess.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {

  13. return true;

  14. }

  15. }

  16. return false;

  17. }

這是我在網上找到的例子,

主要的實作原理就是,使用ActivityManager,首先拿到自己App的包名,再拿到Android裝置中所有正在運作的App包名,

然後對所有的App進行周遊,通過判斷正在運作的App中包名有沒有和自己的App相等,進而判斷自己的App是否退到背景.

  1. @Override

  2. protected void onPause() {

  3. super.onPause();

  4. if(!isAppOnForeground()){

  5. Toast.makeText(getApplicationContext(), TAG+"onPause:",

  6. Toast.LENGTH_SHORT).show();

  7. }else {

  8. sendBroadcast(new Intent(NotificationIntentReceiver.ACTION_ENABLE_MESSAGES)

  9. .setClass(this, NotificationIntentReceiver.class));

  10. Toast.makeText(getApplicationContext(), TAG+"背景運作1",

  11. Toast.LENGTH_SHORT).show();

  12. }

  13. }

然後在onPause()方法中,進行判斷,上面代碼中實作的是,App退出背景就發送廣播,然後在廣播中執行Notification,然後在回到Activity時,在onResume()中清除應該清除Notification.

方法二:

這種方法主要是根據Application中實作ActivityLifecycleCallbacks回調,(可以百度ActivityLifecycleCallbacks)

ActivityLifecycleCallbacks是4.0以後新增的,

主要用于監聽Activity的狀态,這裡主要關注onActivityStarted(Activity activity)和onActivityStopped(Activity activity)兩個方法,

簡單的解釋:

Activity在start時會走onActivityStarted方法,

而Activity在退出背景時,則會走onActivityStopped方法,是以我們可以通過這種方法實作:

  1. int countActivity = 0;

  1. @Override

  2. public void onActivityStarted(Activity activity) {

  3. countActivity++;

  4. }

  1. @Override

  2. public void onActivityStopped(Activity activity) {

  3. countActivity--;

  4. L.i("onActivityStopped", "countActivity=" + countActivity);

  5. if (countActivity <= 0) {

  6. if (WDRTCSysConfig.getInstance().isCalling()) {

  7. Intent _intent = new Intent(WDBroadcastReceiver.ACTION_ENABLE_MESSAGES);

  8. _intent.setClass(getApplicationContext(), WDBroadcastReceiver.class);

  9. sendBroadcast(_intent);

  10. }

  11. }

  12. . }

上面的代碼主要原理是:我在自定義的Application中定義一個變量,主要是模拟Stack<Activity>判斷等操作,

當我們一個Activity在 Start時countActivity就加一,

當我們一個Activity在 Stop時countActivity就減一,

而最後當我們countActivity值等于0時,就代表App沒有Activity正在Start,程式在退到背景,然後執行我們需要執行的退到背景處理.

WDRTCSysConfig.getInstance().isCalling()隻是一個布爾值得邏輯判斷,我這裡執行的是正在語音服務中.

APP退到背景是,發生廣播,執行通知的操作.

ActivityLifecycleCallbacks的實作重寫的方法如下:

  1. public class DemoApplication extends Application implements Application.ActivityLifecycleCallbacks{

  2. @Override

  3. public void onCreate() {

  4. super.onCreate();

  5. //全局管理Activity生命周期

  6. registerActivityLifecycleCallbacks(this);

  7. }

  8. @Override

  9. public void onActivityCreated(Activity activity, Bundle bundle) {

  10. }

  11. @Override

  12. public void onActivityStarted(Activity activity) {

  13. }

  14. @Override

  15. public void onActivityResumed(Activity activity) {

  16. }

  17. @Override

  18. public void onActivityPaused(Activity activity) {

  19. }

  20. @Override

  21. public void onActivityStopped(Activity activity) {

  22. }

  23. @Override

  24. public void onActivitySaveInstanceState(Activity activity, Bundle bundle) {

  25. }

  26. @Override

  27. public void onActivityDestroyed(Activity activity) {

  28. }

  29. }