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
首先定义toolbar的xml,我用了v7的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"
完成效果: