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. C++最快的读取文件的方案(scanf,cin(及取消sync),fread)的详细对比

    竞赛中,遇到大数据时,往往读文件成了程序运行速度的瓶颈,需要更快的读取方式.相信几乎所有的C++学习者都在cin机器缓慢的速度上栽过跟头,于是从此以后发誓不用cin读数据.还有人说Pascal的rea ...

  2. logstash grok 分割匹配日志

    使用logstash的时候,为了更细致的切割日志,会写一些正则表达式. 使用方法 input { file { type => "billin" path => &qu ...

  3. CentOS安装CLI

    #使用root账号 vim /etc/yum.repos.d/epel.repo [epel] name=epel baseurl=http://mirrors.sohu.com/fedora-epe ...

  4. Windows 2008 R2防火墙设置运行被ping通

    参考文献: http://huobumingbai.blog.51cto.com/1196746/323896/

  5. 如何自定义 maven中的archetype

    1.首先使用eclipse创建一个新的maven project,然后把配置好的一些公用的东西放到相应的目录下面 比如说会将一些常用的java代码存放到src/main/java目录下面: 会将一些通 ...

  6. Delphi把一张PNG横向分割成N张透明通道的图片

    Delphi新版本虽然集成了PngImage但是分割复制什么的却非常难用.稍微封装了一下.可以把一张PNG横向分割成N张.透明通道什么的都可以保持不变.typeTPngArray = array of ...

  7. 分享一段ios数据库代码,包括对表的创建、升级、增删查改

    分享一段ios数据库代码.包括创建.升级.增删查改. 里面的那些类不必细究,主要是数据库的代码100%可用. 数据库升级部分,使用switch,没有break,低版本一次向高版本修改. // DB.h ...

  8. C#编程(六十五)----------表达式树

    表达式树 以前没听过表达式树,只听过表达式,而且听过Lambda表达式,首先介绍一下.NET里表达式树的核心概念:讲代码作为数据,他将一些代码表示为一个对象树,树中的每个节点本身都是一个表达式,不同的 ...

  9. 【Devops】【docker】【CI/CD】3.Jenkins+GitLab+docker+springboot 实现自动化部署

    ==================================================================================================== ...

  10. Android提交数据到服务器的两种方式四种方法

    本帖最后由 yanghe123 于 2012-6-7 09:58 编辑 Android应用开发中,会经常要提交数据到服务器和从服务器得到数据,本文主要是给出了利用http协议采用HttpClient方 ...