android应用程序启动流程

  我看网上很多教程包括书籍都是介绍android app是从一个主Activity的onCreate开始的,难道它没有像windows一样有个主入口吗?今天我跟踪了一下程序的运行过程发现Android App的主入口并不是Activity的onCreate开始的。

handleBindApplication:6624, ActivityThread (android.app)   //走到这时能看到一个main函数且能下断点但是调试时提示代码和执行的位置不对应
access$2000:273, ActivityThread (android.app)
handleMessage:2020, ActivityThread$H (android.app)
dispatchMessage:112, Handler (android.os)
loop:216, Looper (android.os)
main:7625, ActivityThread (android.app)
invoke:-1, Method (java.lang.reflect)
run:524, RuntimeInit$MethodAndArgsCaller (com.android.internal.os)
main:987, ZygoteInit (com.android.internal.os)

  我们可以看出其实一个app运行时的入口不是主activity。那么我们有没有办法在主activity的onCreate前干点啥呢?在android app 的清单文件中我们看到有个一个application节点,这个节点我们可以理解它代表了我们的应用程序,它下面可以有很多个其他节点,就如同Activity节点对应一个类一样,application节点也对应着一个类,默认是Application,那我们能不能从Application类派生出一个类,让我们的App启动时执行我们的这个派生类,在Activity的创建前干点啥,比如检查手机机主身份,手机类型,初始化一些资源等,答案显然是可以的,那就是从Application类派生出一个类,然后在清单文件中为application指定name属性,这样就可以了。
  如:

    android:name=".BaseApplication"    //在这增加了我们这个应用它使用的类是BaseApplication,注意前面的.不要省
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">

  代码:

1 class BaseApplication: Application()
2 {
3 override fun onCreate() {
4 super.onCreate()
5 Log.d("测试","我是BaseApplication: ")
6 }
7 }

 

你可能感兴趣的:(android应用程序启动流程)