AndroidManifest.xml
正常点桌面图标启动 App 时
MNN/apps/Android/MnnLlmChat/app/src/main/AndroidManifest.xml
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" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<application
android:name="com.alibaba.mnnllm.android.MnnLlmApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher"
android:supportsRtl="true"
android:theme="@style/AppTheme"
tools:targetApi="31">
<uses-native-library
android:name="libOpenCL.so"
android:required="false" />
<uses-library
android:name="libcdsprpc.so"
android:required="false"/>
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
<activity
android:name="com.alibaba.mnnllm.android.chat.ChatActivity"
android:configChanges="orientation|screenSize"
android:exported="true"
android:windowSoftInputMode="adjustResize">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<service
android:name="com.alibaba.mls.api.download.DownloadForegroundService"
android:foregroundServiceType="dataSync" />
<activity
android:name=".chat.SelectTextActivity"
android:exported="false">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity
android:name=".widgets.FullScreenVideoPlayer"
android:exported="false"
android:theme="@style/AppTheme"
android:configChanges="orientation|screenSize" />
<activity
android:name=".main.MainActivity"
android:configChanges="orientation|screenSize"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".mainsettings.MainSettingsActivity"
android:configChanges="orientation|screenSize"
android:exported="true"
android:label="@string/settings">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<!-- <activity-->
<!-- android:name=".modelsettings.SettingsActivity"-->
<!-- android:exported="true">-->
<!-- <intent-filter>-->
<!-- <action android:name="android.intent.action.MAIN" />-->
<!-- <category android:name="android.intent.category.DEFAULT" />-->
<!-- </intent-filter>-->
<!-- </activity>-->
<activity
android:name=".debug.DebugActivity"
android:exported="false"
android:label="@string/debug_activity_title"
android:theme="@style/AppTheme" />
<activity
android:name=".debug.VideoDecoderTestActivity"
android:exported="false"
android:label="@string/video_decoder_test_title"
android:theme="@style/AppTheme" />
<activity
android:name=".debug.DebugAnimationActivity"
android:exported="true"
android:theme="@style/AppTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<service
android:name="com.alibaba.mnnllm.api.openai.service.OpenAIService"
android:enabled="true"
android:exported="true"
android:foregroundServiceType="dataSync" >
</service>
<receiver
android:name="com.alibaba.mnnllm.api.openai.manager.ApiServiceActionReceiver"
android:enabled="true"
android:exported="false">
<intent-filter>
<action android:name="com.alibaba.mnnllm.api.openai.STOP_SERVICE" />
<action android:name="com.alibaba.mnnllm.api.openai.COPY_URL" />
<action android:name="com.alibaba.mnnllm.api.openai.TEST_PAGE" />
</intent-filter>
</receiver>
<activity android:name=".debug.WidgetTestActivity"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity
android:name=".benchmark.CustomQRScannerActivity"
android:exported="false"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" />
<activity
android:name="com.alibaba.mnnllm.android.patient.PatientInfoActivity"
android:exported="false"
android:windowSoftInputMode="stateHidden|adjustResize"
android:screenOrientation="portrait" />
</application>
</manifest>
先执行 Application 的 onCreate()
系统创建进程时,会先实例化这个 MnnLlmApplication,然后调用它的 onCreate()。这是整个 App 的入口。
先执行 Application 的 onCreate(),
xml
android:name="com.alibaba.mnnllm.android.MnnLlmApplication"
启动带有 LAUNCHER 的 Activity:MainActivity
xml
<activity
android:name=".main.MainActivity"
android:configChanges="orientation|screenSize"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
因为只有 MainActivity 同时有:
action = MAIN
category = LAUNCHER
所以点桌面图标时,系统启动的是 MainActivity,依次调用它的:
onCreate(),onStart(),onResume()
ChatActivity / PatientInfoActivity 等,只有在被显式启动时才会执行
ChatActivity 有 MAIN + DEFAULT,但没有 LAUNCHER,不会作为桌面图标的入口,只会在你代码里 startActivity(Intent(this, ChatActivity::class.java)) 时执行它的 onCreate()。
PatientInfoActivity 没有任何 intent-filter,只能在代码里显式 startActivity 时才会执行它的 onCreate()。
应用进程创建 → MnnLlmApplication.onCreate()
点图标启动 → MainActivity.onCreate()
之后在 MainActivity 或别的页面里手动跳转时,才会执行PatientInfoActivity.onCreate() 和 ChatActivity.onCreate()。