Lifecycle启动源码分析
来源:互联网 发布:pinnacle临床数据采集 编辑:程序博客网 时间:2024/05/19 12:14
首先从Lifecycle的manifests文件说起:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="android.arch.lifecycle.extensions" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="26" /> <application> <provider android:name="android.arch.lifecycle.LifecycleRuntimeTrojanProvider" android:authorities="${applicationId}.lifecycle-trojan" android:exported="false" android:multiprocess="true" /> </application></manifest>
Lifecycle框架会在应用的manifest文件中添加一个provider(LifecycleRuntimeTrojanProvider)。
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.android.persistence"> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-feature android:name="android.hardware.location.gps" /> <application android:name=".viewmodel.MyApplication" android:allowBackup="false" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name="com.example.android.persistence.MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application></manifest>
通过apktool拿到的最终apk中的manifest:
<?xml version="1.0" encoding="utf-8" standalone="no"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.android.persistence" platformBuildVersionCode="26" platformBuildVersionName="8.0.0"> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-feature android:name="android.hardware.location.gps"/> <application android:allowBackup="false" android:debuggable="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name="com.example.android.persistence.MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> <meta-data android:name="android.support.VERSION" android:value="26.0.2"/> <provider android:authorities="com.example.android.persistence.lifecycle-trojan" android:exported="false" android:multiprocess="true" android:name="android.arch.lifecycle.LifecycleRuntimeTrojanProvider"/> </application> </manifest>
可以看到lifecycle框架会向应用中添加一个LifecycleRuntimeTrojanProvider,而这个provider只是为了启动lifecycle框架。接下来我们看一下LifecycleRuntimeTrojanProvider。
public class LifecycleRuntimeTrojanProvider extends ContentProvider { @Override public boolean onCreate() { LifecycleDispatcher.init(getContext()); ProcessLifecycleOwner.init(getContext()); return true; } @Nullable @Override public Cursor query(@NonNull Uri uri, String[] strings, String s, String[] strings1, String s1) { return null; } @Nullable @Override public String getType(@NonNull Uri uri) { return null; } @Nullable @Override public Uri insert(@NonNull Uri uri, ContentValues contentValues) { return null; } @Override public int delete(@NonNull Uri uri, String s, String[] strings) { return 0; } @Override public int update(@NonNull Uri uri, ContentValues contentValues, String s, String[] strings) { return 0; }}
可以看到除了onCreate方法,其他都是返回null或0。初始化方法中
一个是初始化lifecycle框架,一个是创建了ProcessLifecycleOwner来监听进程的lifecycle。
LifecycleDispatcher.init(getContext());ProcessLifecycleOwner.init(getContext());
先看LifecycleDispatcher.init(getContext());
class LifecycleDispatcher { private static final String REPORT_FRAGMENT_TAG = "android.arch.lifecycle" + ".LifecycleDispatcher.report_fragment_tag"; private static AtomicBoolean sInitialized = new AtomicBoolean(false); static void init(Context context) { if (sInitialized.getAndSet(true)) { return; } ((Application) context.getApplicationContext()) .registerActivityLifecycleCallbacks(new DispatcherActivityCallback()); } ...}
在init中注册了activitylifecyclecallback,在onActivityCreated中又注册了fragmentLifecycleCallback。onActivityStopped和onActivitySaveInstanceState中发送CREATED状态。(可以参考lifecycle状态图)。
static class DispatcherActivityCallback extends EmptyActivityLifecycleCallbacks { private final FragmentCallback mFragmentCallback; DispatcherActivityCallback() { mFragmentCallback = new FragmentCallback(); } @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) { if (activity instanceof FragmentActivity) { ((FragmentActivity) activity).getSupportFragmentManager() .registerFragmentLifecycleCallbacks(mFragmentCallback, true); } ReportFragment.injectIfNeededIn(activity); } @Override public void onActivityStopped(Activity activity) { if (activity instanceof FragmentActivity) { markState((FragmentActivity) activity, CREATED); } } @Override public void onActivitySaveInstanceState(Activity activity, Bundle outState) { if (activity instanceof FragmentActivity) { markState((FragmentActivity) activity, CREATED); } } }
在fragmentLifecycleCallback的onFragmentCreated回调中又添加了一个空的DestructionReportFragment。fragmentLifecycleCallback用来监听onCreate、onStart、onResume事件。
static class FragmentCallback extends FragmentManager.FragmentLifecycleCallbacks { @Override public void onFragmentCreated(FragmentManager fm, Fragment f, Bundle savedInstanceState) { dispatchIfLifecycleOwner(f, ON_CREATE); if (!(f instanceof LifecycleRegistryOwner)) { return; } if (f.getChildFragmentManager().findFragmentByTag(REPORT_FRAGMENT_TAG) == null) { f.getChildFragmentManager().beginTransaction().add(new DestructionReportFragment(), REPORT_FRAGMENT_TAG).commit(); } } @Override public void onFragmentStarted(FragmentManager fm, Fragment f) { dispatchIfLifecycleOwner(f, ON_START); } @Override public void onFragmentResumed(FragmentManager fm, Fragment f) { dispatchIfLifecycleOwner(f, ON_RESUME); } }
空的DestructionReportFragment用来监听onPause、onStop、onDestroy事件。
public static class DestructionReportFragment extends Fragment { @Override public void onPause() { super.onPause(); dispatch(ON_PAUSE); } @Override public void onStop() { super.onStop(); dispatch(ON_STOP); } @Override public void onDestroy() { super.onDestroy(); dispatch(ON_DESTROY); } protected void dispatch(Lifecycle.Event event) { dispatchIfLifecycleOwner(getParentFragment(), event); } }
这块总结一下
1. 注册registerActivityLifecycleCallbacks,onActivityCreated方法中注册registerFragmentLifecycleCallbacks。onActivityStopped和onActivitySaveInstanceState中发送CREATED状态。
2. FragmentCallback在onFragmentCreated发送ON_CREATE事件;onFragmentStarted发送ON_START;onFragmentResumed发送ON_RESUME事件。同时onFragmentCreated中添加DestructionReportFragment(用来监听onPause、onStop、onDestroy)。
可以看到lifecycle用FragmentCallback和DestructionReportFragment结合的方式来监听生命周期。这么做的目的应该是为了onCreate、onStart、onResume事件发生在activity相应回调之后,onPause、onStop、onDestroy事件发生在相应回调之前。(调试发现FragmentCallback的方法会多次回调,并且FragmentCallback的onFragmentStarted还是发生在了activity的onStart之前)
ActivityLifecycleCallbacks的onActivityCreated方法中还有一句: ReportFragment.injectIfNeededIn(activity);
前面的分析是在if (activity instanceof FragmentActivity) ,也就是在应用中采用的是FragmentActivity的前提下进行了,有可能应用中用的是app包中的Activity,所以这里对这种情况进行处理。
public static void injectIfNeededIn(Activity activity) { // ProcessLifecycleOwner should always correctly work and some activities may not extend // FragmentActivity from support lib, so we use framework fragments for activities android.app.FragmentManager manager = activity.getFragmentManager(); if (manager.findFragmentByTag(REPORT_FRAGMENT_TAG) == null) { manager.beginTransaction().add(new ReportFragment(), REPORT_FRAGMENT_TAG).commit(); // Hopefully, we are the first to make a transaction. manager.executePendingTransactions(); } }
在这种情况下会添加一个空的ReportFragment,在onActivityCreated、onStart、onResume、onPause、onStop、onDestroy中发送相应的生命周期事件。
public class ReportFragment extends Fragment { private static final String REPORT_FRAGMENT_TAG = "android.arch.lifecycle" + ".LifecycleDispatcher.report_fragment_tag"; public static void injectIfNeededIn(Activity activity) { // ProcessLifecycleOwner should always correctly work and some activities may not extend // FragmentActivity from support lib, so we use framework fragments for activities android.app.FragmentManager manager = activity.getFragmentManager(); if (manager.findFragmentByTag(REPORT_FRAGMENT_TAG) == null) { manager.beginTransaction().add(new ReportFragment(), REPORT_FRAGMENT_TAG).commit(); // Hopefully, we are the first to make a transaction. manager.executePendingTransactions(); } } static ReportFragment get(Activity activity) { return (ReportFragment) activity.getFragmentManager().findFragmentByTag( REPORT_FRAGMENT_TAG); } private ActivityInitializationListener mProcessListener; private void dispatchCreate(ActivityInitializationListener listener) { if (listener != null) { listener.onCreate(); } } private void dispatchStart(ActivityInitializationListener listener) { if (listener != null) { listener.onStart(); } } private void dispatchResume(ActivityInitializationListener listener) { if (listener != null) { listener.onResume(); } } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); dispatchCreate(mProcessListener); dispatch(Lifecycle.Event.ON_CREATE); } @Override public void onStart() { super.onStart(); dispatchStart(mProcessListener); dispatch(Lifecycle.Event.ON_START); } @Override public void onResume() { super.onResume(); dispatchResume(mProcessListener); dispatch(Lifecycle.Event.ON_RESUME); } @Override public void onPause() { super.onPause(); dispatch(Lifecycle.Event.ON_PAUSE); } @Override public void onStop() { super.onStop(); dispatch(Lifecycle.Event.ON_STOP); } @Override public void onDestroy() { super.onDestroy(); dispatch(Lifecycle.Event.ON_DESTROY); // just want to be sure that we won't leak reference to an activity mProcessListener = null; } private void dispatch(Lifecycle.Event event) { if (getActivity() instanceof LifecycleRegistryOwner) { ((LifecycleRegistryOwner) getActivity()).getLifecycle().handleLifecycleEvent(event); } } void setProcessListener(ActivityInitializationListener processListener) { mProcessListener = processListener; } interface ActivityInitializationListener { void onCreate(); void onStart(); void onResume(); }}
可以看到在onActivityCreated、onStart、onStop中除了dispatch(Lifecycle.Event.xx);还多了dispatchXX(mProcessListener);方法。这个mProcessListener从名字也可以看出,是ProcessLifecycleOwner用来监听有activity真正的进入到激活状态的。
接下来我们分析下ProcessLifecycleOwner。
public class ProcessLifecycleOwner implements LifecycleOwner { @VisibleForTesting static final long TIMEOUT_MS = 700; //mls // ground truth counters private int mStartedCounter = 0; private int mResumedCounter = 0; private boolean mPauseSent = true; private boolean mStopSent = true; private Handler mHandler; private final LifecycleRegistry mRegistry = new LifecycleRegistry(this); private Runnable mDelayedPauseRunnable = new Runnable() { @Override public void run() { dispatchPauseIfNeeded(); dispatchStopIfNeeded(); } }; private ActivityInitializationListener mInitializationListener = new ActivityInitializationListener() { @Override public void onCreate() { } @Override public void onStart() { activityStarted(); } @Override public void onResume() { activityResumed(); } }; private static final ProcessLifecycleOwner sInstance = new ProcessLifecycleOwner(); /** * The LifecycleOwner for the whole application process. Note that if your application * has multiple processes, this provider does not know about other processes. * * @return {@link LifecycleOwner} for the whole application. */ public static LifecycleOwner get() { return sInstance; } static void init(Context context) { sInstance.attach(context); } void activityStarted() { mStartedCounter++; if (mStartedCounter == 1 && mStopSent) { mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START); mStopSent = false; } } void activityResumed() { mResumedCounter++; if (mResumedCounter == 1) { if (mPauseSent) { mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_RESUME); mPauseSent = false; } else { mHandler.removeCallbacks(mDelayedPauseRunnable); } } } void activityPaused() { mResumedCounter--; if (mResumedCounter == 0) { mHandler.postDelayed(mDelayedPauseRunnable, TIMEOUT_MS); } } void activityStopped() { mStartedCounter--; dispatchStopIfNeeded(); } private void dispatchPauseIfNeeded() { if (mResumedCounter == 0) { mPauseSent = true; mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_PAUSE); } } private void dispatchStopIfNeeded() { if (mStartedCounter == 0 && mPauseSent) { mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_STOP); mStopSent = true; } } private ProcessLifecycleOwner() { } void attach(Context context) { mHandler = new Handler(); mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE); Application app = (Application) context.getApplicationContext(); app.registerActivityLifecycleCallbacks(new EmptyActivityLifecycleCallbacks() { @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) { ReportFragment .get(activity).setProcessListener(mInitializationListener); } @Override public void onActivityPaused(Activity activity) { activityPaused(); } @Override public void onActivityStopped(Activity activity) { activityStopped(); } }); } @Override public Lifecycle getLifecycle() { return mRegistry; }}
可以看到ProcessLifecycleOwner代码比较清晰了,onStart和onResume是由上面分析的ReportFragment的对应回调发送过来的,保证activity真正的被启动。而onPause和onStop是由自己注册的ActivityLifecycleCallbacks回调的。
void attach(Context context) { mHandler = new Handler(); mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE); Application app = (Application) context.getApplicationContext(); app.registerActivityLifecycleCallbacks(new EmptyActivityLifecycleCallbacks() { @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) { ReportFragment .get(activity).setProcessListener(mInitializationListener); } @Override public void onActivityPaused(Activity activity) { activityPaused(); } @Override public void onActivityStopped(Activity activity) { activityStopped(); } }); }
onActivityCreated中设置了listenerReportFragment .get(activity).setProcessListener(mInitializationListener);
private ActivityInitializationListener mInitializationListener = new ActivityInitializationListener() { @Override public void onCreate() { } @Override public void onStart() { activityStarted(); } @Override public void onResume() { activityResumed(); } };
不论是ReportFragment回调的onStart、onResume还是自己注册回调的onPause、onStop最终都调用相应的activityXX方法。
ProcessLifecycleOwner利用两个counter计算当前活着的activity数量
// ground truth counters private int mStartedCounter = 0; private int mResumedCounter = 0;
比较有意思的是pause和stop中加了个700ms的延时。这个延时足以保证ProcessLifecycleOwner在activities销毁或者因为配置变化重建的时候不会发送任何事件。
void activityPaused() { mResumedCounter--; if (mResumedCounter == 0) { mHandler.postDelayed(mDelayedPauseRunnable, TIMEOUT_MS); } } void activityStopped() { mStartedCounter--; dispatchStopIfNeeded(); } private void dispatchPauseIfNeeded() { if (mResumedCounter == 0) { mPauseSent = true; mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_PAUSE); } }
- Lifecycle启动源码分析
- Tomcat源码Lifecycle分析
- Tomcat源码分析-Lifecycle
- Tomcat6源码启动分析
- PackageManagerService启动源码分析
- opentsdb源码分析--启动
- Activity启动源码分析
- Presto启动源码分析
- 进程启动源码分析
- Activity启动源码分析
- Tomcat源码分析之Server与Lifecycle的设计与实现
- Tomcat类分析-Lifecycle
- TOMCAT源码分析(启动框架)
- TOMCAT源码分析(启动框架)
- TOMCAT源码分析(启动框架)
- TOMCAT源码分析(启动框架)
- TOMCAT源码分析(启动框架)
- TOMCAT源码分析(启动框架)
- mysql官方源码安装第一部分
- this引用逃逸
- java自定义注解
- HFOI2017.9.14 复习赛02题解
- React Native之ReactJs生命周期(四)
- Lifecycle启动源码分析
- SSM框架(Spring+SpringMVC+MyBatis)详细搭建过程
- Jquery EasyUI 获取其他文件数据(4)
- Java api 调用Sqoop2进行MySQL-->Hive的数据同步
- DAT.GUI-初次了解
- # Software-eng lab 1
- Effective Java中文第二章第6节(个人渣翻)
- get_mainarea()详解
- jquery获取 屏幕宽度以及网页可用宽度 以及 给图片src赋值 div赋值