Android S版本MtkSettings的加载流程(一)

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

启动流程

系统设置作为系统应用是一个需要高度客制化的原生应用。以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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值