[RK3288][Android7.1.2] Launcher3 源码阅读之step2:详解Launcher的OnCreate方法的A部分

众所周知,在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打印出来检验下。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值