继承Application管理生命周期
http://www.jianshu.com/p/75a5c24174b2
jessyan提出一个思路,用Application + 接口来管理扩展每个activity的生命周期
这个接口有什么用呢?
Application 提供有一个 registerActivityLifecycleCallbacks() 的方法,需要传入的参数就是这个 ActivityLifecycleCallbacks 接口,作用和你猜的没错,就是在你调用这个方法传入这个接口实现类后,系统会在每个 Activity 执行完对应的生命周期后都调用这个实现类中对应的方法,请记住是每个!
这个时候我们就会想到一个需求实现,关闭所有 Activity !你还在通过继承 BaseActivity 在 BaseActivity 的 onCreate 中将这个 Activity 加入集合???
那我现在就告诉你这样的弊端,如果你 App 中打开有其他三方库的 Activity ,这个三方库肯定不可能继承你的 BaseActivity ,这时你怎么办?怎么办?
这时 ActivityLifecycleCallbacks 就派上用场了, App 中的所有 Activity 只要执行完生命周期就一定会调用这个接口实现类的对应方法, 那你就可以在 onActivityCreated 中将所有 Activity 加入集合,这样不管你是不是三方库的 Activity 我都可以遍历集合 finish 所有的 Activity
现在就按照他给的思路实现toolbar
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:layout_gravity="top"
android:background="?attr/colorPrimary"/>
使用toolbar
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"> <include layout = "@layout/app_toolbar"/> </LinearLayout>
继承application,重写接口
public class LApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
if (activity.findViewById(R.id.toolbar) != null) {
if (activity instanceof AppCompatActivity) {
Toolbar toolbar = (Toolbar) activity.findViewById(R.id.toolbar);
((AppCompatActivity) activity).setSupportActionBar(toolbar);
((AppCompatActivity) activity).getSupportActionBar().setDisplayShowTitleEnabled(false);
toolbar.setTitle(activity.getTitle().toString());
}
}
}
}
}
这样在activity的super.oncreate时就会调用application的这段代码
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.activity_main);
super.onCreate(savedInstanceState);
}
}
所以这里要注意先setContentView再调用super.onCreate
最后设置application
<application android:name=".LApplication"
完成效果:

还可以同一管理activity,比如加上ButterKnife注解
把butterKnife放到application里统一管理
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
ButterKnife.bind(activity);
}
Activity就可以直接使用实例了
public class MainActivity extends AppCompatActivity {
@BindView(R.id.am_tv)
TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.activity_main);
super.onCreate(savedInstanceState);
tv.setText("666");
}
}
但是又有一个问题出现这个 ActivityLifecycleCallbacks 是公用的,当一个 Activity 在 onCreate 方法产生了一个对象 ,我们需要在这个 Activity 执行 onDestroy 时用到这个对象,怎么办?因为每个 Activity 都要产生这个对象,我们不可能把这个对象存储在 ActivityLifecycleCallbacks 中啊
现在就可以用到 Activity.getIntent 来存储一些数据, Intent 中持有一个 Bundle 对象可以存储一些数据,
public class WEApplication extends BaseApplication{
@Override
public void onCreate() {
super.onCreate();
registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
ActivityBean bean = new ActivityBean();
Unbinder unbinder = ButterKnife.bind(activity);
bean.setUnbinder(unbinder);
activity.getIntent().putExtra("ActivityBean", bean);
}
...
@Override
public void onActivityDestroyed(Activity activity) {
ActivityBean bean = activity.getIntent().getParcelableExtra("ActivityBean");
bean.getUnbinder().unbind();
}
}
});
}
}
需要Activity初始化某些事,或者提供某些数据
BaseActivity 有些时候需要,子 Activity 实现某些方法,或者提供某些数据,如需要子 Activity
实现 initView 返回 setContentView() 中的布局 ID ,实现 initData 初始化一些数据,这样就可以不需要 Activity 再重写 onCreate ,达到规范的目的, 这样使用 ActivityLifecycleCallbacks 同样能做到,那我该怎么做呢?
只需要 Activity 实现某个自定义接口
public interface IActivity {
int initView();
void initData();
}
然后在 ActivityLifecycleCallbacks 的 onActivityCreated 中调用这些方法,就可以实现
public class LApplication extends Application{
@Override
public void onCreate() {
super.onCreate();
registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
if (activity instanceof IActivity) {
activity.setContentView(((IActivity)activity).initView());
((IActivity)activity).initData();
}
}
...
}
});
}
}
demo如下:
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
if(activity instanceof IActivity)
{
activity.setContentView(((IActivity) activity).initView());
ButterKnife.bind(activity);
((IActivity) activity).initData();
}
else
{
ButterKnife.bind(activity);
}
if (activity.findViewById(R.id.toolbar) != null) {
if (activity instanceof AppCompatActivity) {
Toolbar toolbar = (Toolbar) activity.findViewById(R.id.toolbar);
((AppCompatActivity) activity).setSupportActionBar(toolbar);
((AppCompatActivity) activity).getSupportActionBar().setDisplayShowTitleEnabled(false);
toolbar.setTitle(activity.getTitle().toString());
}
}
}
这样activity只用这样写就行了,oncreate都不用了
public class MainActivity extends AppCompatActivity implements IActivity{
@BindView(R.id.am_tv)
TextView tv;
@Override
public int initView() {
return R.layout.activity_main;
}
@Override
public void initData() {
tv.setText("666");
}
}
继承Application管理生命周期的更多相关文章
- 深入探索Glide图片加载框架:做了哪些优化?如何管理生命周期?怎么做大图加载?
前言 Glide可以说是最常用的图片加载框架了,Glide链式调用使用方便,性能上也可以满足大多数场景的使用,Glide源码与原理也是面试中的常客. 但是Glide的源码内容比较多,想要学习它的源码往 ...
- tomcat生命周期的管理——生命周期统一接口Lifecycle
我们知道Tomcat的架构设计是清晰的.模块化的,其拥有很多组件,假如我们要启动Tomcat,可以一个一个启动组件,但这样启动有很多缺点,不仅麻烦,而且容易漏了组件启动,还会对后面动态组件扩展带来麻烦 ...
- [03] Servlet继承关系和生命周期
1.Servlet的继承关系 假如现有我们自定义的一个Servlet,继承HttpServlet,那么实际上它的继承链如下图: 可以看到,核心的部分在于: 两个顶级接口 Servlet Servl ...
- ASP.NET Core中的依赖注入(4): 构造函数的选择与服务生命周期管理
ServiceProvider最终提供的服务实例都是根据对应的ServiceDescriptor创建的,对于一个具体的ServiceDescriptor对象来说,如果它的ImplementationI ...
- Android中Context的理解及使用(二)——Application的用途和生命周期
实现数据共享功能: 多个Activity里面,可以使用Application来实现数据的共享,因为对于同一个应用程序来说,Application是唯一的. 1.实现全局共享的数据App.java继承自 ...
- React源码剖析系列 - 生命周期的管理艺术
目前,前端领域中 React 势头正盛,很少能够深入剖析内部实现机制和原理.本系列文章希望通过剖析 React 源码,理解其内部的实现原理,知其然更要知其所以然. 对于 React,其组件生命周期(C ...
- React 源码剖析系列 - 生命周期的管理艺术
目前,前端领域中 React 势头正盛,很少能够深入剖析内部实现机制和原理. 本系列文章 希望通过剖析 React 源码,理解其内部的实现原理,知其然更要知其所以然. 对于 React,其组件生命周期 ...
- Application生命周期(一)
1.Application是什么? Application和Activity,Service一样,是android框架的一个系统组件,当android程序启动时系统会创建一个 application对 ...
- ASP.NET Core中的依赖注入: 构造函数的选择与服务生命周期管理
ServiceProvider最终提供的服务实例都是根据对应的ServiceDescriptor创建的,对于一个具体的ServiceDescriptor对象来说,如果它的ImplementationI ...
随机推荐
- 【bzoj4007】[JLOI2015]战争调度 暴力+树形dp
Description 脸哥最近来到了一个神奇的王国,王国里的公民每个公民有两个下属或者没有下属,这种 关系刚好组成一个 n 层的完全二叉树.公民 i 的下属是 2 * i 和 2 * i +1.最下 ...
- Unity---动画系统学习(5)---使用MatchTarget来匹配动画
1. 介绍 做好了走.跑.转弯后,我们就需要来点更加高级的动画了. 我们使用自带动画学习笔记2中的FQVault动画,来控制人物FQ. 在动画学习笔记4的基础上添加Vault动画. 添加一个参数Vau ...
- 《Andrew Ng深度学习》笔记1
深度学习概论 1.什么是神经网络? 2.用神经网络来监督学习 3.为什么神经网络会火起来? 1.什么是神经网络? 深度学习指的是训练神经网络.通俗的话,就是通过对数据的分析与计算发现自变量与因变量的映 ...
- 19.阻止事件冒泡e.stopPropagation();
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Image组件
/* Image* 用于显示图片的组件,包括网络图片,静态资源 * 常用性能: * resizeMode 图片适应模式 cover , contain , stretch * source 图片的引用 ...
- vcftools安装与使用
官网地址:https://vcftools.github.io/examples.html vcftools的软件下载:https://vcftools.github.io/examples.html ...
- 洛谷 P4280 bzoj1786 [AHOI2008]逆序对(dp)
题面 luogu bzoj 题目大意: 给你一个长度为\(n\)的序列,元素都在\(1-k\)之间,有些是\(-1\),让你把\(-1\)也变成\(1-k\)之间的数,使得逆序对最多,求逆序对最少是多 ...
- Hibernate复合主键的注解
[转自] http://blog.csdn.net/happylee6688/article/details/17636801 最近做项目用到了Hibernate框架,采用了纯面向对象的思想,使用OR ...
- ibatis配置文件中的XML解析错误The content of elements must consist of well-formed character data or markup.
在检查过所有的标签名都没有问题的情况下. xml中的小于号属于非法字符. SQL语句中则可能需要小于号,此时就需要用<![CDATA[ ]]>将小于号包裹,如此不会被xml解析器解析. ...
- Python学习 day03
一.基本数据类型 python中的基本数据类型有以下几种: int -- 整数 python3中默认整数都是int型,python2中int的范围为-231~232-1(32位系统中)/ ...