欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android监听APP前后台转换的两种方式实例讲解

程序员文章站 2022-03-19 22:12:44
应用场景:很多时候我们需要去监听用户有没有将apps放置在后台,比如常用的银行类app、音视频播放类app,那么这些app为什么要去监听应用程序在不在前台?银行当然是为了安全,必须保证一些数据的传输...

应用场景:很多时候我们需要去监听用户有没有将apps放置在后台,比如常用的银行类app、音视频播放类app,那么这些app为什么要去监听应用程序在不在前台?银行当然是为了安全,必须保证一些数据的传输一定是在前台,音视频播放app呢,是为了更好的用户体验,用户按下home键切换到其他页面,期望是想让正在播放的电影暂停下来,而不是看不到视频页面而app还在不停的播放,鉴于此种目的,我们需要做监听app前后台应用。现在找到两种方法来实现:

一:baseactivity基类+activitymanager.runningappprocessinfo

首先,创建所有activity的基类,项目中所有activity去继承baseactivity,这样就可以统一管理,baseactivity当然会有各种生命周期,onresume()和onstop()中去判断执行逻辑代码,也就是说进入一个activity页面 它的onresume肯定会执行,home键退出应用程序肯定会走onstop,逻辑伪代码综上所述,下面来看代码

public class baseactivity extends activity {

 public static boolean isactive; //全局变量

 @override
 protected void oncreate(bundle savedinstancestate) {
  super.oncreate(savedinstancestate);
  setcontentview(r.layout.activity_base);
 }

 @override
 protected void onresume() {
  if (!isactive) {
//app 从后台唤醒,进入前台
isactive = true;
log.i("activity", "程序从后台唤醒");
  }
  super.onresume();
 }

 @override
 protected void onstart() {
  super.onstart();
 }

 @override
 protected void onpause() {
  super.onpause();
 }

 @override
 protected void onstop() {
  if (!isapponforeground()) {
//app 进入后台
isactive = false;//记录当前已经进入后台
log.i("activity", "程序进入后台");
  }
  super.onstop();
 }

 @override
 protected void ondestroy() {
  super.ondestroy();
 }

 /**
  * app是否处于前台唤醒状态
  *
  * @return
  */
 public boolean isapponforeground() {
  activitymanager activitymanager = (activitymanager) getapplicationcontext().getsystemservice(context.activity_service);
  string packagename = getapplicationcontext().getpackagename();
  list 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;
 }
}

二:application中注册声明周期监听回调

首先,创建当前项目的application去继承的application,在application中实现oncreate()方法,方法中注册reginsteractivitylifecyclecallbacks回调,来看代码实现

public class theapplication extends application {

 private int mfinalcount;

 @override
 public void oncreate() {
  super.oncreate();
  registeractivitylifecyclecallbacks(new activitylifecyclecallbacks() {
@override
public void onactivitycreated(activity activity, bundle savedinstancestate) {

}

@override
public void onactivitystarted(activity activity) {
 mfinalcount++;
 //如果mfinalcount ==1,说明是从后台到前台
 log.e("onactivitystarted", mfinalcount +"");
 if (mfinalcount == 1){
  //说明从后台回到了前台
 }
}

@override
public void onactivityresumed(activity activity) {

}

@override
public void onactivitypaused(activity activity) {

}

@override
public void onactivitystopped(activity activity) {
 mfinalcount--;
 //如果mfinalcount ==0,说明是前台到后台
 log.i("onactivitystopped", mfinalcount +"");
 if (mfinalcount == 0){
  //说明从前台回到了后台
 }
}

@override
public void onactivitysaveinstancestate(activity activity, bundle outstate) {

}

@override
public void onactivitydestroyed(activity activity) {

}
  });
 }
}

这样基本上实现了app前后台切换的动态监听