Android判斷應(yīng)用程序退到后臺(tái)的方法(示例代碼)
判斷手機(jī)是否退到后臺(tái),這是我們?cè)贏ndroid開發(fā)中實(shí)現(xiàn)一些功能時(shí),經(jīng)常會(huì)考慮的問題
比如:按HOME,BACK鍵時(shí),程序退到后臺(tái),消息以Notification形式彈出 ,或者程序在服務(wù)中把App退到后臺(tái),彈出服務(wù)浮窗,點(diǎn)擊后回到當(dāng)前頁(yè)面等,這些也是實(shí)現(xiàn)及時(shí)通訊,服務(wù)推送過程經(jīng)常遇到的,比如QQ,微信消息提醒,網(wǎng)絡(luò)電話通知展示等.
廢話不多說,直接上圖:
如果需要判斷程序進(jìn)入后臺(tái),然后顯示通知,彈出通知之后,直接進(jìn)入HOME鍵之前頁(yè)面,情點(diǎn)擊下一節(jié)
程序后臺(tái)切換前臺(tái),點(diǎn)擊通知進(jìn)入當(dāng)前頁(yè)面
DEMO下載地址為:點(diǎn)擊下載demo
判斷手機(jī)是否退到后臺(tái),本人查閱各種資料,發(fā)現(xiàn)實(shí)現(xiàn)其實(shí)很簡(jiǎn)單,目前自己主要實(shí)現(xiàn)方式有兩種:
方式一:
/** * 程序是否在前臺(tái)運(yùn)行 * */ public boolean isAppOnForeground() { ActivityManager activityManager = (ActivityManager) getApplicationContext() .getSystemService(Context.ACTIVITY_SERVICE); String packageName = getApplicationContext().getPackageName(); /** * 獲取Android設(shè)備中所有正在運(yùn)行的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)上找到的例子,
主要的實(shí)現(xiàn)原理就是,使用ActivityManager,首先拿到自己App的包名,再拿到Android設(shè)備中所有正在運(yùn)行的App包名,
然后對(duì)所有的App進(jìn)行遍歷,通過判斷正在運(yùn)行的App中包名有沒有和自己的App相等,從而判斷自己的App是否退到后臺(tái).
@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+"后臺(tái)運(yùn)行1", Toast.LENGTH_SHORT).show(); } }
然后在onPause()方法中,進(jìn)行判斷,上面代碼中實(shí)現(xiàn)的是,App退出后臺(tái)就發(fā)送廣播,然后在廣播中執(zhí)行Notification,然后在回到Activity時(shí),在onResume()中清除應(yīng)該清除Notification.
方法二:
這種方法主要是根據(jù)Application中實(shí)現(xiàn)ActivityLifecycleCallbacks回調(diào),(可以百度ActivityLifecycleCallbacks)
ActivityLifecycleCallbacks是4.0以后新增的,
主要用于監(jiān)聽Activity的狀態(tài),這里主要關(guān)注onActivityStarted(Activity activity)和onActivityStopped(Activity activity)兩個(gè)方法,
簡(jiǎn)單的解釋:
Activity在start時(shí)會(huì)走onActivityStarted方法,
而Activity在退出后臺(tái)時(shí),則會(huì)走onActivityStopped方法,所以我們可以通過這種方法實(shí)現(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中定義一個(gè)變量,主要是模擬Stack<Activity>判斷等操作,
當(dāng)我們一個(gè)Activity在 Start時(shí)countActivity就加一,
當(dāng)我們一個(gè)Activity在 Stop時(shí)countActivity就減一,
而最后當(dāng)我們countActivity值等于0時(shí),就代表App沒有Activity正在Start,程序在退到后臺(tái),然后執(zhí)行我們需要執(zhí)行的退到后臺(tái)處理.
WDRTCSysConfig.getInstance().isCalling()只是一個(gè)布爾值得邏輯判斷,我這里執(zhí)行的是正在語音服務(wù)中.
APP退到后臺(tái)是,發(fā)生廣播,執(zhí)行通知的操作.
ActivityLifecycleCallbacks的實(shí)現(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)用程序退到后臺(tái)的方法的文章就介紹到這了,更多相關(guān)android判斷應(yīng)用程序退到后臺(tái)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Android判斷應(yīng)用程序退到后臺(tái)的方法(示例代碼)
- Android應(yīng)用程序保持后臺(tái)喚醒(使用WakeLock實(shí)現(xiàn))
- Android應(yīng)用程序轉(zhuǎn)到后臺(tái)并回到前臺(tái)判斷方法
- 深入解析Android系統(tǒng)中應(yīng)用程序前后臺(tái)切換的實(shí)現(xiàn)要點(diǎn)
- Android判斷當(dāng)前應(yīng)用程序處于前臺(tái)還是后臺(tái)的兩種方法
- Android 完全退出當(dāng)前應(yīng)用程序的四種方法
- Android完全退出應(yīng)用程序的方法
- android 完全退出應(yīng)用程序?qū)崿F(xiàn)代碼
相關(guān)文章
詳解Flutter手游操縱桿移動(dòng)的原理與實(shí)現(xiàn)
這篇文章將為大家詳細(xì)介紹一下Android?Flutter手游中操縱桿移動(dòng)角色的原理與實(shí)現(xiàn)過程,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-07-07Android SharedPreferences存取操作以及封裝詳解
SharedPreferences是安卓平臺(tái)上一個(gè)輕量級(jí)的存儲(chǔ)類,用來保存應(yīng)用的一些常用配置,比如Activity狀態(tài),Activity暫停時(shí),將此activity的狀態(tài)保存到SharedPereferences中;當(dāng)Activity重載,系統(tǒng)回調(diào)方法onSaveInstanceState時(shí),再?gòu)腟haredPreferences中將值取出2021-11-11Android ViewPager制作新手導(dǎo)航頁(yè)(動(dòng)態(tài)加載)
這篇文章主要為大家詳細(xì)介紹了Android ViewPager制作新手導(dǎo)航頁(yè),了解什么是動(dòng)態(tài)加載指示器,感興趣的小伙伴們可以參考一下2016-05-05Android CoordinatorLayout高級(jí)用法之自定義Behavior
這篇文章主要介紹了Android CoordinatorLayout高級(jí)用法之自定義Behavior,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-02-02使用DrawerLayout完成滑動(dòng)菜單的示例代碼
這篇文章主要介紹了使用DrawerLayout完成滑動(dòng)菜單的示例代碼,代碼簡(jiǎn)單易懂,非常不錯(cuò),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08Android 開發(fā)中l(wèi)ayout下的子文件夾
這篇文章主要介紹了android 開發(fā)中l(wèi)ayout下的子文件夾,需要的朋友可以參考下2017-12-12Android7.0開發(fā)實(shí)現(xiàn)Launcher3去掉應(yīng)用抽屜的方法詳解
這篇文章主要介紹了Android7.0開發(fā)實(shí)現(xiàn)Launcher3去掉應(yīng)用抽屜的方法,結(jié)合實(shí)例形式分析了Android7.0 Launcher3調(diào)整界面布局的相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下2017-11-11Android實(shí)現(xiàn)獲取未接來電和未讀短信數(shù)量的方法
這篇文章主要介紹了Android實(shí)現(xiàn)獲取未接來電和未讀短信數(shù)量的方法,是Android程序開發(fā)中非常常見的重要功能,需要的朋友可以參考下2014-08-08