Android判斷應(yīng)用程序退到后臺的方法(示例代碼)
判斷手機是否退到后臺,這是我們在Android開發(fā)中實現(xiàn)一些功能時,經(jīng)常會考慮的問題
比如:按HOME,BACK鍵時,程序退到后臺,消息以Notification形式彈出 ,或者程序在服務(wù)中把App退到后臺,彈出服務(wù)浮窗,點擊后回到當前頁面等,這些也是實現(xiàn)及時通訊,服務(wù)推送過程經(jīng)常遇到的,比如QQ,微信消息提醒,網(wǎng)絡(luò)電話通知展示等.
廢話不多說,直接上圖:
如果需要判斷程序進入后臺,然后顯示通知,彈出通知之后,直接進入HOME鍵之前頁面,情點擊下一節(jié)
DEMO下載地址為:點擊下載demo
判斷手機是否退到后臺,本人查閱各種資料,發(fā)現(xiàn)實現(xiàn)其實很簡單,目前自己主要實現(xiàn)方式有兩種:
方式一:
/** * 程序是否在前臺運行 * */ public boolean isAppOnForeground() { ActivityManager activityManager = (ActivityManager) getApplicationContext() .getSystemService(Context.ACTIVITY_SERVICE); String packageName = getApplicationContext().getPackageName(); /** * 獲取Android設(shè)備中所有正在運行的App */ List<ActivityManager.RunningAppProcessInfo> appProcesses = activityManager .getRunningAppProcesses(); if (appProcesses == null) return false; for (ActivityManager.RunningAppProcessInfo appProcess : appProcesses) { // The name of the process that this object is associated with. if (appProcess.processName.equals(packageName) && appProcess.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) { return true; } } return false; }
這是我在網(wǎng)上找到的例子,
主要的實現(xiàn)原理就是,使用ActivityManager,首先拿到自己App的包名,再拿到Android設(shè)備中所有正在運行的App包名,
然后對所有的App進行遍歷,通過判斷正在運行的App中包名有沒有和自己的App相等,從而判斷自己的App是否退到后臺.
@Override protected void onPause() { super.onPause(); if(!isAppOnForeground()){ Toast.makeText(getApplicationContext(), TAG+"onPause:", Toast.LENGTH_SHORT).show(); }else { sendBroadcast(new Intent(NotificationIntentReceiver.ACTION_ENABLE_MESSAGES) .setClass(this, NotificationIntentReceiver.class)); Toast.makeText(getApplicationContext(), TAG+"后臺運行1", Toast.LENGTH_SHORT).show(); } }
然后在onPause()方法中,進行判斷,上面代碼中實現(xiàn)的是,App退出后臺就發(fā)送廣播,然后在廣播中執(zhí)行Notification,然后在回到Activity時,在onResume()中清除應(yīng)該清除Notification.
方法二:
這種方法主要是根據(jù)Application中實現(xiàn)ActivityLifecycleCallbacks回調(diào),(可以百度ActivityLifecycleCallbacks)
ActivityLifecycleCallbacks是4.0以后新增的,
主要用于監(jiān)聽Activity的狀態(tài),這里主要關(guān)注onActivityStarted(Activity activity)和onActivityStopped(Activity activity)兩個方法,
簡單的解釋:
Activity在start時會走onActivityStarted方法,
而Activity在退出后臺時,則會走onActivityStopped方法,所以我們可以通過這種方法實現(xiàn):
int countActivity = 0;
@Override public void onActivityStarted(Activity activity) { countActivity++; }
@Override public void onActivityStopped(Activity activity) { countActivity--; L.i("onActivityStopped", "countActivity=" + countActivity); if (countActivity <= 0) { if (WDRTCSysConfig.getInstance().isCalling()) { Intent _intent = new Intent(WDBroadcastReceiver.ACTION_ENABLE_MESSAGES); _intent.setClass(getApplicationContext(), WDBroadcastReceiver.class); sendBroadcast(_intent); } } }
上面的代碼主要原理是:我在自定義的Application中定義一個變量,主要是模擬Stack<Activity>判斷等操作,
當我們一個Activity在 Start時countActivity就加一,
當我們一個Activity在 Stop時countActivity就減一,
而最后當我們countActivity值等于0時,就代表App沒有Activity正在Start,程序在退到后臺,然后執(zhí)行我們需要執(zhí)行的退到后臺處理.
WDRTCSysConfig.getInstance().isCalling()只是一個布爾值得邏輯判斷,我這里執(zhí)行的是正在語音服務(wù)中.
APP退到后臺是,發(fā)生廣播,執(zhí)行通知的操作.
ActivityLifecycleCallbacks的實現(xiàn)重寫的方法如下:
public class DemoApplication extends Application implements Application.ActivityLifecycleCallbacks{ @Override public void onCreate() { super.onCreate(); //全局管理Activity生命周期 registerActivityLifecycleCallbacks(this); } @Override public void onActivityCreated(Activity activity, Bundle bundle) { } @Override public void onActivityStarted(Activity activity) { } @Override public void onActivityResumed(Activity activity) { } @Override public void onActivityPaused(Activity activity) { } @Override public void onActivityStopped(Activity activity) { } @Override public void onActivitySaveInstanceState(Activity activity, Bundle bundle) { } @Override public void onActivityDestroyed(Activity activity) { } }
到此這篇關(guān)于android判斷應(yīng)用程序退到后臺的方法的文章就介紹到這了,更多相關(guān)android判斷應(yīng)用程序退到后臺內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android SharedPreferences存取操作以及封裝詳解
SharedPreferences是安卓平臺上一個輕量級的存儲類,用來保存應(yīng)用的一些常用配置,比如Activity狀態(tài),Activity暫停時,將此activity的狀態(tài)保存到SharedPereferences中;當Activity重載,系統(tǒng)回調(diào)方法onSaveInstanceState時,再從SharedPreferences中將值取出2021-11-11Android ViewPager制作新手導(dǎo)航頁(動態(tài)加載)
這篇文章主要為大家詳細介紹了Android ViewPager制作新手導(dǎo)航頁,了解什么是動態(tài)加載指示器,感興趣的小伙伴們可以參考一下2016-05-05Android CoordinatorLayout高級用法之自定義Behavior
這篇文章主要介紹了Android CoordinatorLayout高級用法之自定義Behavior,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-02-02Android 開發(fā)中l(wèi)ayout下的子文件夾
這篇文章主要介紹了android 開發(fā)中l(wèi)ayout下的子文件夾,需要的朋友可以參考下2017-12-12Android7.0開發(fā)實現(xiàn)Launcher3去掉應(yīng)用抽屜的方法詳解
這篇文章主要介紹了Android7.0開發(fā)實現(xiàn)Launcher3去掉應(yīng)用抽屜的方法,結(jié)合實例形式分析了Android7.0 Launcher3調(diào)整界面布局的相關(guān)操作技巧與注意事項,需要的朋友可以參考下2017-11-11Android實現(xiàn)獲取未接來電和未讀短信數(shù)量的方法
這篇文章主要介紹了Android實現(xiàn)獲取未接來電和未讀短信數(shù)量的方法,是Android程序開發(fā)中非常常見的重要功能,需要的朋友可以參考下2014-08-08