Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱
MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina.com

目录

小知识点

应用进入前后台判断

getApplication().registerActivityLifecycleCallbacks(new SampleActivityLifecycleCallbacks() {
private int mFinalCount; @Override
public void onActivityStarted(Activity activity) {
super.onActivityStarted(activity);
mFinalCount++;
if (mFinalCount == 1){
//如果mFinalCount ==1,说明是从后台到前台
}
} @Override
public void onActivityStopped(Activity activity) {
super.onActivityStopped(activity);
mFinalCount--;
if (mFinalCount == 0){
//如果mFinalCount ==0,说明是前台到后台
}
}
}

获取自己App中的所有Activity

try {
PackageInfo packageInfo = getPackageManager().getPackageInfo(getPackageName(), PackageManager.GET_ACTIVITIES);
for (ActivityInfo activity : packageInfo.activities) {
Log.i("bqt", activity.name); //com.bqt.test.MainActivity
}
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}

获取栈顶和栈底的Activity

ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningTaskInfo> list = manager.getRunningTasks(Integer.MAX_VALUE);
for (ActivityManager.RunningTaskInfo info : list) {
Log.i("bqt", info.topActivity.getClassName() + "---" + info.baseActivity.getClassName());
}

Activity管理器

ActivityStackManager

定义一个集合(Stack)保存所有还未销毁的 Activity

public class ActivityStackManager {
private Stack<ActivityInfo> activityStack; private static ActivityStackManager instance = new ActivityStackManager(); private ActivityStackManager() {//构造方法私有
} public static ActivityStackManager getInstance() {
return instance;
} //入栈
public void push(Activity activity) {
if (activityStack == null) activityStack = new Stack<>(); for (int i = 0; i < activityStack.size(); i++) {
if (activity == activityStack.get(i).activity) return;
}
activityStack.add(ActivityInfo.newBuilder()
.activity(activity)
.startTime(System.currentTimeMillis())
.build());
} //出栈
public void pop(Activity activity) {
if (activityStack != null && activityStack.size() > 0 && activity != null) {
activity.finish();
activityStack.remove(new ActivityInfo(activity));
}
} //第一种方式
public ActivityInfo getActivityInfo(Activity activity) {
ActivityInfo activityInfo = null;
if (activityStack != null && activityStack.size() > 0) {
for (ActivityInfo info : activityStack) {
if (info.activity == activity) {
activityInfo = info;
break;
}
}
}
return activityInfo;
} //第二种方式,不建议采用这种方式,因为在使用中发现可能会报数组越界异常
//原因可能是当我通过search查找到之后和通过get获取之前这段时间,某个Activity被移除掉了,所以导致数组大小改变,取值时就可能越界了
public ActivityInfo getActivityInfo2(Activity activity) {
ActivityInfo activityInfo = null;
if (activityStack != null && activityStack.size() > 0) {
int index = activityStack.search(new ActivityInfo(activity));
if (index >= 0) {
activityInfo = activityStack.get(index);
}
}
return activityInfo;
} public long getStartTime(Activity activity) {
ActivityInfo activityInfo = getActivityInfo(activity);
return activityInfo != null ? activityInfo.startTime : 0;
}
}

registerActivityLifecycleCallbacks

注册 Activity 生命周期回调

registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
ActivityStackManager.getInstance().push(activity);
} @Override
public void onActivityDestroyed(Activity activity) {
long time = ActivityStackManager.getInstance().getStartTime(activity);
String date = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss SSS", Locale.getDefault()).format(new Date(time));
Log.i("bqt", "【" + activity.getClass().getSimpleName() + "启动时间】" + date);
ActivityStackManager.getInstance().pop(activity);//必须放在获取消息后面,否则一经清空了就获取不到了
} @Override
public void onActivityStarted(Activity activity) {
} @Override
public void onActivityResumed(Activity activity) {
Log.i("bqt", "当前Activity" + "(" + activity.getClass().getSimpleName()+".java" + ":" +30 + ")");
} @Override
public void onActivityPaused(Activity activity) {
} @Override
public void onActivityStopped(Activity activity) {
} @Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
}
});

ActivityInfo

保存与Activity相关的一些信息

//用于保存Activity示例以及与Activity相关的一些信息,比如Activity启动时间等
public class ActivityInfo {
public Activity activity;
public long startTime; public ActivityInfo(Activity activity) {
this.activity = activity;
} @Override
public boolean equals(Object obj) {//必须重写equals方法
return obj instanceof ActivityInfo && ((ActivityInfo) obj).activity.equals(activity);
} //省略Builder代码
}

一个通用的AppManager

/**
* activity堆栈式管理
*/
public class AppManager {
private static Stack<Activity> activityStack;
private static AppManager instance; private AppManager() {
} public static AppManager getAppManager() {
if (instance == null) {
instance = new AppManager();
}
return instance;
} /**
* 添加Activity到堆栈
*/
public void addActivity(Activity activity) {
if (activityStack == null) {
activityStack = new Stack<>();
}
activityStack.add(activity);
} /**
* 获取当前Activity(堆栈中最后一个压入的)
*/
public Activity currentActivity() {
return activityStack.lastElement();
} /**
* 结束当前Activity(堆栈中最后一个压入的)
*/
public void finishActivity() {
Activity activity = activityStack.lastElement();
finishActivity(activity);
} /**
* 结束指定的Activity
*/
public void finishActivity(Activity activity) {
if (activity != null && !activity.isFinishing()) {
activityStack.remove(activity);
activity.finish();
activity = null;
}
} /**
* 结束指定类名的Activity
*/
public void finishActivity(Class<?> cls) {
for (Activity activity : activityStack) {
if (activity.getClass().equals(cls)) {
finishActivity(activity);
break;
}
}
} /**
* 结束所有Activity
*/
public void finishAllActivity() {
for (int i = 0, size = activityStack.size(); i < size; i++) {
if (null != activityStack.get(i)) {
finishActivity(activityStack.get(i));
break;
}
}
activityStack.clear();
} /**
* 获取指定的Activity
*/
public static Activity getActivity(Class<?> cls) {
if (activityStack != null)
for (Activity activity : activityStack) {
if (activity.getClass().equals(cls)) {
return activity;
}
}
return null;
} public static Stack<Activity> getActivitys() {
return activityStack;
} /**
* 退出应用程序
*/
public void AppExit(Context context) {
try {
finishAllActivity();
android.os.Process.killProcess(android.os.Process.myPid());// 杀死该应用进程
System.exit(0);
} catch (Exception ignored) {
}
} /**
* 返回当前Activity栈中Activity的数量
*/
public int getActivityCount() {
int count = activityStack.size();
return count;
} /**
* 堆栈中移除Activity
*/
public void removeActivity(Activity activity) {
if (activityStack == null) {
return;
} else if (activityStack.contains(activity)) {
activityStack.remove(activity);
}
if (activity != null && !activity.isFinishing()) {
activity.finish();
activity = null;
}
}
}

2018-5-30

记录Activity启动时间 ActivityLifecycleCallbacks的更多相关文章

  1. 问题记录-Activity跳转后显示空白界面

    前两天写一个简易安卓记事本,从主界面跳转到添加内容界面总是显示空白. 明明有setContentView xml文件在可视化开发环境下也正常显示.后经前辈指点,原来是复写onCreate函数时出现了问 ...

  2. Android使用ActivityLifecycleCallbacks管理Activity和区分App前后台

    一.ActivityLifecycleCallbacks接口介绍 官方地址:https://developer.android.com/reference/android/app/Applicatio ...

  3. Activity管理笔记

    文章仅记录自己学习该模块时的一点理解,看到哪写到哪.所以特别散. AMS管理四大组件外加进程管理,当中最庞大的算是Activity了吧. 1.AMS中对ActivityStack划分为两类.当中一类是 ...

  4. ActivityLifecycleCallbacks

    public class ActivityLifecycleCallbacks implements Application.ActivityLifecycleCallbacks, ActivityS ...

  5. Android Activity生命周期详讲

    管理 Activity 生命周期 通过实现回调方法管理 Activity 的生命周期对开发强大而又灵活的应用至关重要. Activity 的生命周期会直接受到 Activity 与其他 Activit ...

  6. 【凯子哥带你学Framework】Activity启动过程全解析

    It’s right time to learn Android’s Framework ! 前言 学习目标 写作方式 主要对象功能介绍 主要流程介绍 zygote是什么有什么作用 SystemSer ...

  7. 解决如何监听Activity切换

    本篇博文在我之前的博文中已经提到了,但是监听Activity切换又可以作为一个单独的内容来叙述,因此这里又单独拿了出来进行赘述. Activity的切换无非有两种,第一种:启动或者创建一个新的Acti ...

  8. Android源码剖析之Framework层实战版(Ams管理Activity启动)

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 讲到实战,就不得不拿两个例子来说明,本篇想拿的是应用最广泛的两个:Ams和Wms,一个管理activ ...

  9. Activity学习(一)——状态转变

    (转自:http://blog.csdn.net/flowingflying/article/details/6415323) Android很大的应用场景是手机,有一些应用具有特别的优先级别,例如电 ...

随机推荐

  1. 【WIN10】移植opencc到WIN10-UWP,實現自己的繁簡轉換工具

    花了週末兩天時間,將opencc移植成WIN10-UWP可用的庫,並完成自己的繁簡轉換工具. 我的繁簡轉換工具下載地址為:https://www.microsoft.com/store/apps/9n ...

  2. 9、Redis处理过期keys的机制

    写在前面的话:读书破万卷,编码如有神 -------------------------------------------------------------------- 1.Redis处理过期k ...

  3. java并发基础(五)--- 线程池的使用

    第8章介绍的是线程池的使用,直接进入正题. 一.线程饥饿死锁和饱和策略 1.线程饥饿死锁 在线程池中,如果任务依赖其他任务,那么可能产生死锁.举个极端的例子,在单线程的Executor中,如果一个任务 ...

  4. 微信小程序如何玩转分销

    截止目前,微信月活跃用户已经高达8.89亿,微信这个庞大的互联网巨头下一个目标是什么? 打造属于自己的“AppStore”.小程序正是完成这个微信生态体系的一块完美拼板, 张小龙预言:未来2年内,小程 ...

  5. svn : Can not Parse lock / entries hashfile错误解决办法

    svn服务器死机重启之后,锁定文件的时候出下面的提示: Malformed file svn: Can't parse lock/entries hashfile '/data/svn/svnroot ...

  6. concat函數 函數concat 可以用來合拼兩個或以上的字串。

    12. “Mexico 墨西哥”的首都是”Mexico City”. 顯示所有國家名字,其首都是國家名字加上”City”. concat函數 函數concat 可以用來合拼兩個或以上的字串. : SE ...

  7. 移动web前端小结

    原文地址:http://blog.csdn.net/small_rice_/article/details/22690535 在智能手机横行的时代,作为一个web前端,不会编写移动web界面,的确是件 ...

  8. Execute Javascript in iOS Applications

    In this tutorial, I have covered How to execute JavaScript in iOS / Objective-C. You can execute Jav ...

  9. 数据连接工具DbVisualizer的使用

    一.下载,DbVisualizer Pro 64位 9.0.2 绿色特别版 http://www.cr173.com/soft/103766.html 二.中文乱码 在配置数据库连接时的Databas ...

  10. cocos2d-x系列笔记技巧篇(2)---关于CREATE_FUNC宏的用法

    FROM://http://blog.csdn.net/jinciyulang/article/details/8631889 阅读cocos2d-x demo的代码,我们会看到有些头文件中使用CRE ...