Android应用的执行入口

Application 类的使用

在Android应用中,Application 类是应用的入口点之一。它在应用启动时最早执行,通常用于初始化全局状态。为了确保应用在启动时执行自定义逻辑,可以在 AndroidManifest.xml 文件中指定自定义的 Application 类。

示例代码

AndroidManifest.xml 文件中,添加了以下代码来指定自定义的 Application 类:

xml 复制代码
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <!-- 申请网络请求权限 -->
    <uses-permission android:name="android.permission.INTERNET" />

    <application
        android:allowBackup="true"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.Okhttp3_Study"
        tools:targetApi="31"
        android:name=".myApplication">
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

android:name 属性中指定了自定义的 Application.myApplication

自定义 Application 类

myApplication.java 的代码如下:

java 复制代码
public class myApplication extends Application {

    static {
        Log.d("newfish", "myApplication static");
    }

    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        Log.d("newfish", "myApplication attachBaseContext");
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Log.d("newfish", "myApplication onCreate");
    }
}

在这个类中,我们重写了 attachBaseContextonCreate 方法,并在静态代码块中添加了日志输出,以便于在应用启动时跟踪执行顺序。

MainActivity 类

MainActivity.java 是应用的主活动,它在 Application 类之后执行。其代码如下:

java 复制代码
public class MainActivity extends AppCompatActivity {

    private static String TAG = "learnokhttp";

    static {
        Log.d("newfish", "MainActivity static");
    }

    @Override
    protected void attachBaseContext(Context newBase) {
        super.attachBaseContext(newBase);
        Log.d("newfish", "MainActivity attachBaseContext");
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d("newfish", "MainActivity onCreate");
        setContentView(R.layout.activity_main);

        Button btn = findViewById(R.id.mybtn);

        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String requestUrl = "https://www.baidu.com/";
                example myexample = new example();
                try {
                    Log.e(TAG, "点击");
                    myexample.run(requestUrl);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });
    }
}

MainActivity 类中,同样重写了 attachBaseContextonCreate 方法,并添加了日志输出。

执行顺序

根据上述代码,程序的执行顺序如下:

  1. myApplication 类的静态代码块
  2. myApplication 类的 attachBaseContext 方法
  3. myApplication 类的 onCreate 方法
  4. MainActivity 类的静态代码块
  5. MainActivity 类的 attachBaseContext 方法
  6. MainActivity 类的 onCreate 方法

日志输出如下:

复制代码
D/newfish: myApplication static
D/newfish: myApplication attachBaseContext
D/newfish: myApplication onCreate
D/newfish: MainActivity static
D/newfish: MainActivity attachBaseContext
D/newfish: MainActivity onCreate

通过分析日志,我们可以清晰地看到应用程序的启动流程,从 Application 类到 MainActivity 类的执行顺序。

相关推荐
whysqwhw1 小时前
OkHttp深度架构缺陷分析与演进规划
android
用户7093722538511 小时前
Android14 SystemUI NotificationShadeWindowView 加载显示过程
android
木叶丸2 小时前
跨平台方案该如何选择?
android·前端·ios
顾林海2 小时前
Android ClassLoader加载机制详解
android·面试·源码
用户2018792831672 小时前
🎨 童话:Android画布王国的奇妙冒险
android
whysqwhw3 小时前
OkHttp框架的全面深入架构分析
android
你过来啊你3 小时前
Android App冷启动流程详解
android
泓博3 小时前
KMP(Kotlin Multiplatform)改造(Android/iOS)老项目
android·ios·kotlin
移动开发者1号4 小时前
使用Baseline Profile提升Android应用启动速度的终极指南
android·kotlin
移动开发者1号4 小时前
解析 Android Doze 模式与唤醒对齐
android·kotlin