众所周知,在Android四大组件之中,Activity的生命周期是很重要的。
在此,我们先小测一下在生命周期里面加打印,打印结果如下:
C:\Users\Administrator>adb logcat -s -vtime Launcher
- waiting for device -
--------- beginning of main
--------- beginning of system
01-18 09:33:26.117 E/Launcher( 1020): jhczz : onCreate
01-18 09:33:26.117 V/Launcher( 1020): LauncherAppState inited
01-18 09:33:26.956 E/Launcher( 1020): jhczz : onStart
01-18 09:33:26.962 E/Launcher( 1020): jhczz : onResume
01-18 09:33:27.048 E/Launcher( 1020): jhczz : onPause
01-18 09:33:27.057 E/Launcher( 1020): jhczz : onStop
01-18 09:33:33.753 E/Launcher( 1020): jhczz : onStart
01-18 09:33:33.796 E/Launcher( 1020): jhczz : onResume
01-18 09:33:44.897 E/Launcher( 1020): jhczz : onPause
01-18 09:33:44.966 E/Launcher( 1020): jhczz : onStop
01-18 09:33:46.627 E/Launcher( 1020): jhczz : onStart
01-18 09:33:46.633 E/Launcher( 1020): jhczz : onResume
01-18 09:33:46.827 E/Launcher( 1020): jhczz : onPause
01-18 09:33:46.852 E/Launcher( 1020): jhczz : onStop
这样我们对于Launcher的生命周期有一个很好的把握。
在开机的时候,则调用onCreate方法,OnStart方法和OnResume方法。
这和普通的Activity并无什么不同。休眠的时候调用OnPause方法之后调用OnStop方法。
当点击桌面的一个应用的时候,调用的也和平常的Activity一样,Launcher的
01-18 11:43:41.549 E/Launcher( 1015): jhczz : onPause
01-18 11:43:43.137 E/Launcher( 1015): jhczz : onStop
但退回到主界面的时候,则调用
01-18 11:43:48.381 E/Launcher( 1015): jhczz : onStart
01-18 11:43:48.384 E/Launcher( 1015): jhczz : onResume
和一个普通的APP,有两个Activity的跳转无异样。再次证明,Launcher也是一个普通的应用,普通的Activity。
接下来进入正题,看Activity的话,我们首先是看OnCreate方法。我们用传统的方法查看OnCreate方法。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.launcher);
}
在Launcher的onCreate方法中我们也将其分为三部分:
@Override
protected void onCreate(Bundle savedInstanceState) {
// ================================= A 部分
super.onCreate(savedInstanceState);
// ================================= B 部分
setContentView(R.layout.launcher);
// ================================= C 部分
}
首先是A部分:
if (DEBUG_STRICT_MODE) {
// 線程代理
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectDiskReads().detectDiskWrites()
.detectNetwork() // or .detectAll() for all detectable problems
.penaltyLog()
.build());
// 虛擬內存代理
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
.detectLeakedSqlLiteObjects()
.detectLeakedClosableObjects()
.penaltyLog()
.penaltyDeath()
.build());
}
// PROFILE_STARTUP = ProviderConfig.IS_DOGFOOD_BUILD;
if (LauncherAppState.PROFILE_STARTUP) {
Trace.beginSection("Launcher-onCreate");
}
if (mLauncherCallbacks != null) {
mLauncherCallbacks.preOnCreate();
}
全局变量 static final boolean DEBUG_STRICT_MODE = false;
是关闭的,所以这个debug是关闭的,如果打开,是设置一些线程代理和虚拟内存代理的绑定。因为是关闭的,这里暂不考虑,有兴趣的同学自行研究。
if (LauncherAppState.PROFILE_STARTUP) {
Trace.beginSection("Launcher-onCreate");
}
这种类.属性的写法就是一个静态的全局变量。
查看对应的类文件。
rk3288\packages\apps\Launcher3\src\com\android\launcher3\LauncherAppState.java
中有一个定义如下:
public static final boolean PROFILE_STARTUP = ProviderConfig.IS_DOGFOOD_BUILD;
./src_config/com/android/launcher3/config/ProviderConfig.java:19:public class ProviderConfig {
我们跟踪下这个文件:ProviderConfig.java
package com.android.launcher3.config;
public class ProviderConfig {
public static final String AUTHORITY = "com.android.launcher3.settings".intern();
public static boolean IS_DOGFOOD_BUILD = true;
}
所以可以知道 PROFILE_STARTUP 这个全局变量也是true 。
if的条件成立,Trace.beginSection("Launcher-onCreate"); 这句被执行。
private LauncherCallbacks mLauncherCallbacks;// Launcher回調接口
我们还是要找到这个文件
rk3288\packages\apps\Launcher3\src\com\android\launcher3\LauncherCallbacks.java
public interface LauncherCallbacks {
/*
* Activity life-cycle methods. These methods are triggered after
* the code in the corresponding Launcher method is executed.
*/
public void preOnCreate();
public void onCreate(Bundle savedInstanceState);
public void preOnResume();
public void onResume();
public void onStart();
public void onStop();
public void onPause();
public void onDestroy();
public void onSaveInstanceState(Bundle outState);
public void onPostCreate(Bundle savedInstanceState);
public void onNewIntent(Intent intent);
public void onActivityResult(int requestCode, int resultCode, Intent data);
public void onRequestPermissionsResult(int requestCode, String[] permissions,int[] grantResults);
public void onWindowFocusChanged(boolean hasFocus);
public void onAttachedToWindow();
public void onDetachedFromWindow();
public boolean onPrepareOptionsMenu(Menu menu);
public void dump(String prefix, FileDescriptor fd, PrintWriter w, String[] args);
public void onHomeIntent();
public boolean handleBackPressed();
public void onTrimMemory(int level);
/*
* Extension points for providing custom behavior on certain user interactions.
*/
public void onLauncherProviderChange();
public void finishBindingItems(final boolean upgradePath);
public void bindAllApplications(ArrayList<AppInfo> apps);
public void onInteractionBegin();
public void onInteractionEnd();
@Deprecated
public void onWorkspaceLockedChanged();
/**
* Starts a search with {@param initialQuery}. Return false if search was not started.
*/
public boolean startSearch(String initialQuery, boolean selectInitialQuery, Bundle appSearchData);
public boolean hasCustomContentToLeft();
public void populateCustomContentContainer();
public View getQsbBar();
public Bundle getAdditionalSearchWidgetOptions();
//...此处省略
}
我们可以看出这个接口补充了Activity的一些生命周期的,相当于又将生命周期拓展和细化了。
你可以在Launcher的Java文件里面看到很多重写 interface的一些方法。
这个回调接口 preOnCreate方法,预先onCreate的意思,我们也只知道可能在OnCreate方法之前调用
mLauncherCallbacks.preOnCreate();
是否是这样呢,相应的位置加个Log打印出来检验下。