本篇内容主要讲解“Android如何判断应用程序退到后台”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Android如何判断应用程序退到后台”吧!
判断手机是否退到后台,这是我们在Android开发中实现一些功能时,经常会考虑的问题
比如:按HOME,BACK键时,程序退到后台,消息以Notification形式弹出 ,或者程序在服务中把App退到后台,弹出服务浮窗,点击后回到当前页面等,这些也是实现及时通讯,服务推送过程经常遇到的,比如QQ,微信消息提醒,网络电话通知展示等.
废话不多说,直接上图:
方式一:
/** * 程序是否在前台运行 * */ public boolean isAppOnForeground() { ActivityManager activityManager = (ActivityManager) getApplicationContext() .getSystemService(Context.ACTIVITY_SERVICE); String packageName = getApplicationContext().getPackageName(); /** * 获取Android设备中所有正在运行的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; }
这是我在网上找到的例子,
主要的实现原理就是,使用ActivityManager,首先拿到自己App的包名,再拿到Android设备中所有正在运行的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()方法中,进行判断,上面代码中实现的是,App退出后台就发送广播,然后在广播中执行Notification,然后在回到Activity时,在onResume()中清除应该清除Notification.
方法二:
这种方法主要是根据Application中实现ActivityLifecycleCallbacks回调,(可以百度ActivityLifecycleCallbacks)
ActivityLifecycleCallbacks是4.0以后新增的,
主要用于监听Activity的状态,这里主要关注onActivityStarted(Activity activity)和onActivityStopped(Activity activity)两个方法,
简单的解释:
Activity在start时会走onActivityStarted方法,
而Activity在退出后台时,则会走onActivityStopped方法,所以我们可以通过这种方法实现:
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,程序在退到后台,然后执行我们需要执行的退到后台处理.
WDRTCSysConfig.getInstance().isCalling()只是一个布尔值得逻辑判断,我这里执行的是正在语音服务中.
APP退到后台是,发生广播,执行通知的操作.
ActivityLifecycleCallbacks的实现重写的方法如下:
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) { } }