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. android shareUID

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha 安卓中 全局进程,其他应用可以通过 分享UID 方式 和它 在同一个进程中.

  2. 15、Redis的集群

     写在前面的话:读书破万卷,编码如有神 -------------------------------------------------------------------------------- ...

  3. c# RSA 加密解密 java.net公钥私钥转换 要解密的模块大于128字节

    有一个和接口对接的任务,对方使用的是java,我方使用的是c#,接口加密类型为RSA,公钥加密私钥解密. 然后就是解决各种问题. 1.转换对方的密钥字符串 由于c#里面需要使用的是xml各式的密钥字符 ...

  4. Emmet 语法介绍

    一.生成 HTML 文档初始结构 HTML 文档的初始结构,就是包括 doctype.html.head.body 以及 meta 等内容.你只需要输入一个 “!” 就可以生成一个 HTML5 的标准 ...

  5. 研究table-cell和overflow

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. LinkedIn实时低延迟数据抓取系统Databus开源

        http://www.infoq.com/cn/news/2013/03/linkedin-databus

  7. Dapper Miser implementation of CMSIS-DAP, MC HCK as SWD Adapter

    Dapper Miser In late 2013, I created a functional implementation of CMSIS-DAP that runs in a low cos ...

  8. QQ去除未读状态的动画

    QQ去除未读状态的动画 by 伍雪颖 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcmFpbmxlc3Zpbw==/font/5a6L5L2T/fonts ...

  9. 什么是.Net, IL, CLI, BCL, FCL, CTS, CLS, CLR, JIT

    什么是.NET? 起源:比尔盖茨在2000年的Professional Developers Conference介绍了一个崭新的平台叫作Next Generation Windows Service ...

  10. 在ASP.NET MVC下限制同一个IP地址单位时间间隔内的请求次数

    有时候,当用户请求一个Controller下的Action,我们希望,在单位时间间隔内,比如每秒,每分钟,每小时,每天,每星期,限制同一个IP地址对某个Action的请求次数.如何做呢? stefan ...