android怎样判断应用程序退到后台

 判断手机是否退到后台,这是我们在Android开发中实现一些功能时,经常会考虑的问题

比如:按HOME,BACK键时,程序退到后台,消息以Notification形式弹出 ,或者程序在服务中把App退到后台,弹出服务浮窗,点击后回到当前页面等,这些也是实现及时通讯,服务推送过程经常遇到的,比如QQ,微信消息提醒,网络电话通知展示等.

废话不多说,直接上图:

如果需要判断程序进入后台,然后显示通知,弹出通知之后,直接进入HOME键之前页面,情点击下一节

程序后台切换前台,点击通知进入当前页面

DEMO下载地址为:点击下载demo


判断手机是否退到后台,本人查阅各种资料,发现实现其实很简单,目前自己主要实现方式有两种:

方式一:

 
  1. /**
  2. * 程序是否在前台运行
  3. *
  4. */
  5. public boolean isAppOnForeground() {
  6.  
  7. ActivityManager activityManager = (ActivityManager) getApplicationContext()
  8. .getSystemService(Context.ACTIVITY_SERVICE);
  9. String packageName = getApplicationContext().getPackageName();
  10. /**
  11. * 获取Android设备中所有正在运行的App
  12. */
  13. List<ActivityManager.RunningAppProcessInfo> appProcesses = activityManager
  14. .getRunningAppProcesses();
  15. if (appProcesses == null)
  16. return false;
  17.  
  18. for (ActivityManager.RunningAppProcessInfo appProcess : appProcesses) {
  19. // The name of the process that this object is associated with.
  20. if (appProcess.processName.equals(packageName)
  21. && appProcess.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
  22. return true;
  23. }
  24. }
  25.  
  26. return false;
  27. }

这是我在网上找到的例子,

主要的实现原理就是,使用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.  
  5.  
  6. }
 
  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. }
  13.  
  14. . }

 

上面的代码主要原理是:我在自定义的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.  
  9. @Override
  10. public void onActivityCreated(Activity activity, Bundle bundle) {
  11.  
  12. }
  13.  
  14. @Override
  15. public void onActivityStarted(Activity activity) {
  16.  
  17. }
  18.  
  19. @Override
  20. public void onActivityResumed(Activity activity) {
  21.  
  22. }
  23.  
  24. @Override
  25. public void onActivityPaused(Activity activity) {
  26.  
  27. }
  28.  
  29. @Override
  30. public void onActivityStopped(Activity activity) {
  31.  
  32. }
  33.  
  34. @Override
  35. public void onActivitySaveInstanceState(Activity activity, Bundle bundle) {
  36.  
  37. }
  38.  
  39. @Override
  40. public void onActivityDestroyed(Activity activity) {
  41.  
  42. }
  43. }

 

 

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值