您的位置:首页 > Web前端

用ActivityLifecycleCallbacks 判断前后台运行

2018-01-22 13:57 387 查看
ActivityLifecycleCallbacks 是 Application 中的一个内部接口:

private void backprogress(){
registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
@Override
public void onActivityCreated(Activity activity, Bundle bundle) {

}

@Override
public void onActivityStarted(Activity activity) {
Log.v("viclee", activity + "onActivityStarted");
//         if (appCount == 0) {
//            Log.v("viclee", ">>>>>>>>>>>>>>>>>>>切到前台  lifecycle");
//            Intent intent = new Intent();
//            intent.setAction("zhangzksmart");
//
//            intent.putExtra("moel", "foreground");
//            Log.e("viclee","---111-------");
//            sendBroadcast(intent);
//         }
appCount++;
Log.e("ciclee","niha"+activity+"onActivityStopped"+"=======22======"+appCount);
}

@Override
public void onActivityResumed(Activity activity) {

}

@Override
public void onActivityPaused(Activity activity) {

}

@Override
public void onActivityStopped(Activity activity) {
Log.v("viclee", activity + "onActivityStopped");
appCount--;
Log.e("ciclee","niha"+activity+"onActivityStopped"+"============="+appCount);
//         if (appCount == 0) {
//            Log.v("viclee", ">>>>>>>>>>>>>>>>>>>切到后台  lifecycle");
//            Intent intent = new Intent();
//            intent.setAction("zhangzksmart");
//            //  intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
//            intent.putExtra("moel", "background");
//            Log.e("viclee","------2-2-----");
//            sendBroadcast(intent);
//         }
}

@Override
public void onActivitySaveInstanceState(Activity activity, Bundle bundle) {

}

@Override
public void onActivityDestroyed(Activity activity) {

}
});
}
public int getAppCount() {
return appCount;
}

public void setAppCount(int appCount) {
this.appCount = appCount;
}

 然后在定义一个工具类

/**
* 自动根据参数选择判断前后台的方法
*
* @param context     上下文参数
* @param packageName 需要检查是否位于栈顶的App的包名
* @return
*/
public static boolean isForeground(Context context,String packageName) {
return getApplicationValue((Zksmart) ((Service) context).getApplication());

}
/**
* 方法3:通过ActivityLifecycleCallbacks来批量统计Activity的生命周期,来做判断,此方法在API 14以上均有效,但是需要在Application中注册此回调接口
* 必须:
* 1. 自定义Application并且注册ActivityLifecycleCallbacks接口
* 2. AndroidManifest.xml中更改默认的Application为自定义
* 3. 当Application因为内存不足而被Kill掉时,这个方法仍然能正常使用。虽然全局变量的值会因此丢失,但是再次进入App时候会重新统计一次的
* @param zksmart
* @return
*/

public static boolean getApplicationValue(Zksmart zksmart) {
return zksmart.getAppCount() > 0;
}


Application 提供有一个 registerActivityLifecycleCallbacks() 的方法,需要传入的参数就是这个 ActivityLifecycleCallbacks 接口,系统会在每个 Activity 执行完对应的生命周期后都调用这个实现类中对应的方法,请记住是每个!

这个时候我们就会想到一个需求实现,关闭所有 Activity !你还在通过继承 BaseActivity 在 BaseActivity 的 onCreate 中将这个 Activity 加入集合???

那我现在就告诉你这样的弊端,如果你 App 中打开有其他三方库的 Activity ,这个三方库肯定不可能继承你的 BaseActivity ,这时你怎么办?怎么办?

这时 ActivityLifecycleCallbacks 就派上用场了, App 中的所有 Activity 只要执行完生命周期就一定会调用这个接口实现类的对应方法, 那你就可以在 onActivityCreated 中将所有 Activity 加入集合,这样不管你是不是三方库的 Activity 我都可以遍历集合 finish 所有的 Activity.
项目地址:http://download.csdn.net/download/zhanghuaiwang/10217730
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android 前后台