启动流程
系统设置作为系统应用是一个需要高度客制化的原生应用。以Mtk平台Android S版本的MtkSettings源码为例,分析其主要的加载流程。
- 清单文件:Settings作为SettingsHomepageActivity的别名,在桌面创建一个快捷入口。启动模式为singleTask,意味着每次启动时Settings主界面活动都会位于栈顶,子页面会结束掉并出栈。
<!-- Alias for launcher activity only, as this belongs to each profile. -->
<!-- [android]以singleTask启动模式启动,若存在该实例,结束掉该实例之上的所有Activity,并将该实例置为栈顶 -->
<activity-alias android:name="Settings"
android:label="@string/settings_label_launcher"
android:taskAffinity="com.android.settings.root"
android:launchMode="singleTask"
android:exported="true"
android:targetActivity=".homepage.SettingsHomepageActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data android:name="android.app.shortcuts"
android:resource="@xml/shortcuts"/>
</activity-alias>
- Settings.java继承自SettingsActivity.java,里面所有的类都只是定义,没有实现。
此类定义的都是二级及其子页面的活动,用于定义独立启动的activity活动类。比如从下拉公控长按启动的wifi界面的activity
/**
- Top-level Settings activity
*/
public class Settings extends SettingsActivity {
/*
* Settings subclasses for launching independently.
*/
public static class AssistGestureSettingsActivity extends SettingsActivity {
/* empty */}
public static class BluetoothSettingsActivity extends SettingsActivity {
/* empty */ }
public static class WifiSettingsActivity extends SettingsActivity {
/* empty */ }
ResumedActivity: ActivityRecord{
e80f8b1 u0 com.android.settings/.Settings$WifiSettingsActivity t10}
- SettingsHomepageActivity.java作为桌面设置主Activity入口,实现LifecycleObserver子类接口CategoryMixin,感知全局生命周期的变化,并及时处理categories的异步加载。其中TopLevelSettings.java是展示主界面的Fragment。
/** Settings homepage activity */
/** [android]主Activity入口,实现LifecycleObserver子类接口CategoryMixin,感知生命周期的变化 */
public class SettingsHomepageActivity extends FragmentActivity implements
CategoryMixin.CategoryHandler {
private CategoryMixin mCategoryMixin;
@Override
public CategoryMixin getCategoryMixin() {
return mCategoryMixin;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//[android]settings_homepage_container布局内部包含一个支持嵌套的NestedScrollView
setContentView(R.layout.settings_homepage_container);
final View appBar = findViewById(R.id.app_bar_container);
appBar.setMinimumHeight(getSearchBoxHeight());
initHomepageContainer();
final Toolbar toolbar = findViewById(R.id.search_action_bar);
FeatureFactory.getFactory(this).getSearchFeatureProvider()
.initSearchToolbar(this /* activity */, toolbar, SettingsEnums.SETTINGS_HOMEPAGE);
getLifecycle().addObserver(new HideNonSystemOverlayMixin(this));
mCategoryMixin = new CategoryM

本文详细剖析了Android S版本MtkSettings应用的启动流程,从清单文件的设置到Settings主界面Activity的加载,再到二级页面的启动。SettingsActivity作为基类,处理了启动逻辑,而Settings Homepage Activity作为主入口,通过LifecycleObserver监听全局变化。设置项通过XML定义,使用Preference构建静态配置,通过Fragment进行加载。SubSettings类处理子页面,其启动的Fragment需在SettingsGateway注册。整个过程体现了Android系统的组件化和模块化设计思想。
最低0.47元/天 解锁文章
503

被折叠的 条评论
为什么被折叠?



