前言
从Api14开始,系统在Application类中提供了一个关于Activity声明周期回调的方法(如下).
所以我们可以在一个统一的地方就可以监听到所有的Acitivy的声明周期方法的回调,这个Api特别重要,他能实现很多我们以前写的很烦的代码.
那么现在我们可以通过它实现什么样子的效果呢?容老夫和你们掰扯掰扯
public void registerActivityLifecycleCallbacks(ActivityLifecycleCallbacks callback)
public interface ActivityLifecycleCallbacks {
void onActivityCreated(Activity activity, Bundle savedInstanceState);
void onActivityStarted(Activity activity);
void onActivityResumed(Activity activity);
void onActivityPaused(Activity activity);
void onActivityStopped(Activity activity);
void onActivitySaveInstanceState(Activity activity, Bundle outState);
void onActivityDestroyed(Activity activity);
}
能实现的效果
实现Activity的统一管理
这点为什么要提出来呢?因为在以前这个功能实现的时候我们需要在每一个Activity或者BaseActivity中去主动的添加自己的引用到栈中,然后在销毁的时候主动去移除自己的引用,这虽然可以实现但是却有一些风险,比如新人来了之后不知道这种操作,没有添加到栈中怎么办?
如果添加了忘记写移除引用的代码了怎么办?现在这些都不是问题啦,用这个回调都可以统一管理到所有的Activity.并且每一个Activity都是被动的添加到栈中的,不存在忘记或者销毁了忘记移除引用的问题
实现所有Activity的统一的一些样式
之前刚好写了一篇文章是如何更优雅的定义App的标题栏
其中也是使用这种方式对所有的Activity实现了一个标题栏的样式
当然了,你可以定义各种各样的注解来支持你实现不同的样式
最近国家对网约车的App进行了安全检测,我们被要求做App的防止截屏的操作.这时候又正好可以派上用场了.如果某些界面你不需要防止截屏,那么你可以写一个注解来标识,然后统一处理的时候对这个注解做一些额外的处理
可以实现退出指定的一些界面
这个功能这么说呢?是这样的
在很多的App中,比如电商流程中,我们需要实现一个下订单的流程,那么很多时候我们在最后一步的时候,我们都会把之前的界面给销毁掉,比如下订单完成的时候,因为这个时候前面的界面这时候就已经没有什么作用了,所以需要销毁.这个情况放在以前,一般有以下几种方式:
1.界面一个一个返回,得到后一个界面的消息然后销毁自己并且又传消息给前一个界面
2.在前面的界面注册一个这个流程的广播,收到广播的时候退出自己,这种比上一个情况要靠谱
3.基于Activity管理栈的情况下,让栈销毁最上层的n个Activity(不靠谱,可能中间出现了一个其他界面呢?)
4.基于Activity管理栈的情况下,在Activity上使用注解标志并且指定一个Action,调用销毁指定Action的方法,这是我比较喜欢的方式,比如下面:
/**
* you can use Annotation {@link DestoryActivityWithAction} to flag your Activity {@link Activity}
* and write your custom action.
* and then you can call this method delivery a action,such as "selfOrderAction" .
* this method will finish all Activity which was marked with Annotation {@link DestoryActivityWithAction}
* and the Annotation's value() is equals to "selfOrderAction"
*
* @param action the custom action
*/
public void popActivityWithAction(@NonNull String action) {
int size = activityStack.size();
for (int i = 0; i < size; i++) {
Activity currentAct = activityStack.get(i);
if (currentAct == null) continue;
DestoryActivityWithAction destoryActivityWithAction = currentAct.getClass().getAnnotation(DestoryActivityWithAction.class);
if (destoryActivityWithAction != null && destoryActivityWithAction.value().equals(action)) {
currentAct.finish();
removeActivity(currentAct);
}
}
}
可以利用生命周期方法注册广播实现一定的功能
这次博主遇到的就是使用这个方法实现了应用切换到后台的时候提醒用户App正在运行,博主就是在每一个Activity onStart的时候注册的,然后在onStop的时候反注册的。这个广播是Home键的广播,所以只要提示一次就够了.如果没有了这种方式实现的话就很烦了,或者你得采用其他的方法了.在每一个Activity中去写相关的代码还是很烦很烦的