看了好多网上的资料,大多代码长而且不好理解,本人自己谢了一种方法跟大家分享,个人认为比较简单容易理解,主要分如下几个步骤:
第一步:重写activity的基类,使所有需要监测的每个单个activity,都继承与重写的这个(MyBaseActivity)
* 重写一个Activity 的基类 ,记录其子Activity的状态 */ public class MyBaseActivity extends AppCompatActivity { String TAG="abcde"; @Override protected void onStart() { super.onStart(); ActivityStateUitl.getInstance().addActivity(this);//记录avtivity的状态,最后记录程序是否在运行 } @Override protected void onStop() { super.onStop(); Log.i(TAG, "onStop: "); ActivityStateUitl.getInstance().exitActivity(this); } }
第二步:写出基类里面用到的工具封装类
* 检测activity 是否初始化前台后台, 程序是否仔仔运行还是已经关闭 */ public class ActivityStateUitl { String TAG="abcde"; private static Boolean isLine=false;//true 表示登录用户正在使用app,false登录用户已下线再上线, private List<Activity> activityList = new LinkedList<Activity>(); private static ActivityStateUitl instance; private ActivityStateUitl(){ } // 单例模式中获取唯一的MyApplication实例 public static ActivityStateUitl getInstance() { if (null == instance) { instance = new ActivityStateUitl(); } return instance; } // 添加Activity到容器中 public void addActivity(Activity activity) { activityList.add(activity); Log.i("loginstatus", "addActivity: "); if(!isLine){//此时用户已经下线,才可以再次上线,已上线则不可再次上线 try{ db=new DbOperatorLogin(activity); endUserId=db.getLoginEndUserInfo().getEndUserId();//此处是获取等咯用户id Log.e(TAG, "addActivity: "+"用户上线"); new LoginStatusToHttp().userUpLine(endUserId);//设置用户上线,调用上线用户请求 isLine=true;//上线成功后,设置true }catch (Exception e){ Log.i(TAG, "addActivity: 抛出异常"); } } } DbOperatorLogin db; String endUserId; //移除该activity,并且30秒后检查集合是否为空,为空则表示退出程序 public void exitActivity(final Activity activity) { Log.i(TAG, "exit:某activity "+activity); activityList.remove(activity); db=new DbOperatorLogin(activity); try{ endUserId=db.getLoginEndUserInfo().getEndUserId(); if(endUserId==null){ return; } }catch (Exception e){ Log.i(TAG, "exitActivity: "+e.toString()); } new Thread(){//程序走到这里,说明已有用户登录,故此需要检查activity的stop的时候,是否是用户下线 @Override public void run() { super.run(); try { sleep(30000);//等待三十秒,检测是否有新的activity添加进来 checkActivity(endUserId); instance = null; } catch (Exception e) { e.printStackTrace(); } } }.start(); } //检查用户是否下线,是关闭则通知网络 public void checkActivity(String endUserId){ if(isLine){//用户在线时候,才有下线,如果用户已经下线,则不会再次下线 if(activityList.size()>0){ Log.i(TAG, "checkActivity: "+"程序正在运行"); }else{ Log.e(TAG, "checkActivity: "+"程序已关闭,用户下线"); LoginStatusToHttp.userUnderLine(endUserId);//调用下线网络请求 isLine=false;//表示用户已经下线 } }else{ Log.i(TAG, "checkActivity: "+"无用户在线,不可下线"); } }第三部:再写一个工具类,此工具类 (即上面程序的LoginStatusToHttp,该工具类只有两个方法,及上线请求,下线请求), 只发送上线下线的网络请求工具类,此处网络请求大家自己写,每个app的写的接口不一样,写好了直接调用就是。
第四部:到了这一步,只剩下如何调用我们的工具类了,所有需要检测用户上线下线的activity直接继承写好的MyBaseActivty,注意不是所有的activity都需要继承咯,比如你的登录activity就不需要继承此类。写好了,就可以检测每个actvity的stop之后,是否是退出程序的状态。