如何添加第三方APK至Android 9.0 设置

1. 添加第三方APK至Settings

    不用修改任何Settings源代码!因为Settings已经开放了新增item的功能——Extra_Settings,我们只用修改第三方APK的Manifest即可。放代码如下:



    

        
            

        
        
            
        

        
        
        
        
    

2. LaunchMode

    launchMode定义了Activity的加载模式,总共有以下四种。

       a.  standard

       默认模式,不需要在launchMode配置,每次跳转都会在Activity任务栈中创建该Activity的新实例。

       如下图,不管栈中、栈顶是否有该Activity实例,都会重新创建新实例压栈。

                  如何添加第三方APK至Android 9.0 设置_第1张图片

        standard模式适用于app的广泛需求,因为该模式支持用户同时开启多个任务,每个任务独立进行操作不同数据。

        b. singleTop

        singleTop模式,也会创建新的Activity实例。但是会检查栈顶Activity是不是当前Activity,如果是,则不创建新实例。

       如下图,若栈顶是Activity B实例,这时候打开Activity B则不会重新创建Activity B实例。如果这时候打开Activity A则会把新的Activity A实例压入栈中。

            如何添加第三方APK至Android 9.0 设置_第2张图片

        singleTop模式特点是检查栈顶实例,可以防止短时间内同时创建同个Activity的多个实例,Audio播放就是非常经典的singleTop模式使用场景,否则每个实例播放进度不一致就容易产生很多问题。

        c. singleTask

        singleTask模式,会检查整个栈中是否有该Activity实例,有则清除该实例前的其他实例,没有则创建新实例压栈。

        如下图,栈中已有Activity A, Activity B, Activity C三个实例,若重新启动Activity C实例,先要将Activity B弹栈(调用Activity B的onDestory()方法),接着调用Activity C的onNewIntent()方法。区别于singleInstance模式,SingleTask只维护一个任务栈 (Back Stack)。

        singleTask模式特点是检查整个任务栈的实例,不开辟新的任务栈。用了单例模式的思想,内存中只存有一个Activity实例对象,可以做到同步。适用于需要保持任务进度的app,例如Settings,视频播放等任务。

             如何添加第三方APK至Android 9.0 设置_第3张图片

        d.  singleInstance 

        singleInstance模式,会单独创建一个任务栈来维护创建的当前实例。对于内存利用来说有点浪费。

        如下图,Activity D的设为singleInstance后,会新建任务栈Back Stack2。这样Stack2只维护Activity D一个实例。

如何添加第三方APK至Android 9.0 设置_第4张图片         singleInstance一般多使用于比较核心的特殊场景,比如系统Launcher的主屏界面。

3. Intent filter的priority

    通常priority被设置为1~9, 但是不能代表一定就位于Settings的最顶层菜单。这还取决于Settings的底层AndroidManifest.xml对系统模块Activity的设定(如wifi,Bluetooth等等)。这个会在之后,添加系统级item至设置菜单中提到。

4. Category

 

      这个会设置你的第三方APK出现在具体哪一级的菜单目录中,category目录分级见源代码 /frameworks/base/packages/SettingsLib/src/com/android/settingslib/drawer/CategoryKey.java

... ...

public static final String CATEGORY_HOMEPAGE = "com.android.settings.category.ia.homepage";

    // Top level category.
    public static final String CATEGORY_NETWORK = "com.android.settings.category.ia.wireless";
    public static final String CATEGORY_CONNECT = "com.android.settings.category.ia.connect";
    public static final String CATEGORY_DEVICE = "com.android.settings.category.ia.device";
    public static final String CATEGORY_APPS = "com.android.settings.category.ia.apps";
    public static final String CATEGORY_APPS_DEFAULT =
            "com.android.settings.category.ia.apps.default";
    public static final String CATEGORY_BATTERY = "com.android.settings.category.ia.battery";
    public static final String CATEGORY_DISPLAY = "com.android.settings.category.ia.display";
    public static final String CATEGORY_SOUND = "com.android.settings.category.ia.sound";
    public static final String CATEGORY_STORAGE = "com.android.settings.category.ia.storage";
    public static final String CATEGORY_SECURITY = "com.android.settings.category.ia.security";
    public static final String CATEGORY_SECURITY_LOCKSCREEN =
            "com.android.settings.category.ia.lockscreen";
    public static final String CATEGORY_ACCOUNT = "com.android.settings.category.ia.accounts";
    public static final String CATEGORY_ACCOUNT_DETAIL =
            "com.android.settings.category.ia.account_detail";
    public static final String CATEGORY_SYSTEM = "com.android.settings.category.ia.system";
    public static final String CATEGORY_SYSTEM_LANGUAGE =
            "com.android.settings.category.ia.language";
    public static final String CATEGORY_SYSTEM_DEVELOPMENT =
            "com.android.settings.category.ia.development";
    public static final String CATEGORY_NOTIFICATIONS =
            "com.android.settings.category.ia.notifications";
    public static final String CATEGORY_DO_NOT_DISTURB = "com.android.settings.category.ia.dnd";
    public static final String CATEGORY_GESTURES = "com.android.settings.category.ia.gestures";
    public static final String CATEGORY_NIGHT_DISPLAY =
            "com.android.settings.category.ia.night_display";

... ...... ...

public static final String CATEGORY_HOMEPAGE = "com.android.settings.category.ia.homepage";

    // Top level category.
    public static final String CATEGORY_NETWORK = "com.android.settings.category.ia.wireless";
    public static final String CATEGORY_CONNECT = "com.android.settings.category.ia.connect";
    public static final String CATEGORY_DEVICE = "com.android.settings.category.ia.device";
    public static final String CATEGORY_APPS = "com.android.settings.category.ia.apps";
    public static final String CATEGORY_APPS_DEFAULT =
            "com.android.settings.category.ia.apps.default";
    public static final String CATEGORY_BATTERY = "com.android.settings.category.ia.battery";
    public static final String CATEGORY_DISPLAY = "com.android.settings.category.ia.display";
    public static final String CATEGORY_SOUND = "com.android.settings.category.ia.sound";
    public static final String CATEGORY_STORAGE = "com.android.settings.category.ia.storage";
    public static final String CATEGORY_SECURITY = "com.android.settings.category.ia.security";
    public static final String CATEGORY_SECURITY_LOCKSCREEN =
            "com.android.settings.category.ia.lockscreen";
    public static final String CATEGORY_ACCOUNT = "com.android.settings.category.ia.accounts";
    public static final String CATEGORY_ACCOUNT_DETAIL =
            "com.android.settings.category.ia.account_detail";
    public static final String CATEGORY_SYSTEM = "com.android.settings.category.ia.system";
    public static final String CATEGORY_SYSTEM_LANGUAGE =
            "com.android.settings.category.ia.language";
    public static final String CATEGORY_SYSTEM_DEVELOPMENT =
            "com.android.settings.category.ia.development";
    public static final String CATEGORY_NOTIFICATIONS =
            "com.android.settings.category.ia.notifications";
    public static final String CATEGORY_DO_NOT_DISTURB = "com.android.settings.category.ia.dnd";
    public static final String CATEGORY_GESTURES = "com.android.settings.category.ia.gestures";
    public static final String CATEGORY_NIGHT_DISPLAY =
            "com.android.settings.category.ia.night_display";

... ...

      我想把Mimo显示在设置的第一级菜单,则我把com.android.settings的value设置为com.android.settings.category.ia.homepage。

5. 设置为系统级App

     如果每个App都能够设置其AndroidManifest.xml,然后进入设置菜单那系统岂不是乱套了吗?为了防止这种现象出现,只有设置第三方APK为系统级App才能够进入设置菜单。

     如何设置一个第三方APK为系统级App呢?这个话题有点大,主要有两种方法:获得系统签名、获取root权限后push至系统app目录即可实现。这里不作赘述,会在之后的blog中提到。

 

     如有任何问题和疑问,欢迎大家关注我的微信公众号:

                                               

 

你可能感兴趣的:(Android,Android)