应用清单文件中android:priority运用

需求

Android车机集成了高德地图,地图中涉及到在线地图、实时路况等,需要网络可用,会有跳转wifi设置的快捷按键,通过该按键能成功跳转至系统WiFi设置界面。

分析

地图使用Android标准的action进行跳转。调用示例如下:

Intent intent = new Intent(Settings.ACTION_WIFI_SETTINGS); 
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(intent);

而车机系统中除了原生Settings应用可以响应外,针对项目功能和UI需求添加了新的设置应用,该设置应用中同样存在wifi设置项。故希望WiFi快捷响应能跳转到产品自研的设置应用中。

实现

一、原生设置中应用清单文件如下:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
        package="com.android.settings"
        coreApp="true"
        android:sharedUserId="android.uid.system">
        ...
        <activity
            android:name="Settings$WifiSettingsActivity"
            android:label="@string/wifi_settings"
            android:icon="@drawable/ic_settings_wireless"
            android:configChanges="orientation|keyboardHidden|screenSize|mcc|mnc"
            android:taskAffinity="com.android.settings"
            android:parentActivityName="Settings">
            <intent-filter android:priority="1">
                <action android:name="android.settings.WIFI_SETTINGS" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.VOICE_LAUNCH" />
                <category android:name="com.android.settings.SHORTCUT" />
            </intent-filter>
            <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
                android:value="com.android.settings.wifi.WifiSettings" />
            <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
                android:value="true" />
        </activity>

查看官方android:priority有如下说明:【https://developer.android.google.cn/guide/topics/manifest/intent-filter-element.html

android:priority 就处理过滤器所描述类型的 intent 而言,应该为父组件指定的优先级。此属性对 Activity和广播接收器都有意义:
它说明了某个 Activity 对与过滤器匹配的 Intent 的响应能力,这是相对于也可以响应该 Intent的其他 Activity 的响应能力。当 Intent 可由优先级不同的多个 Activity 处理时,Android 只会将优先级值较高的 Activity 视为 Intent 的潜在目标。
它控制按什么顺序执行广播接收器以接收广播消息。优先级值越高,调用顺序越靠前。(该顺序仅适用于同步消息;对于异步消息,系统会忽略该顺序。)

只有在您确实需要对接收广播施加特定顺序或想要强制 Android 优先选用某个 Activity 时,才能使用此属性。

值必须是一个整数,如“100”。数值越高,优先级也就越高。默认值为 0。

二、故在自研的设置应用中,同样添加该过滤器,设置一个更高的priority即可。

  <intent-filter android:priority="1000">
        <action android:name="android.settings.WIFI_SETTINGS" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>

经验证,使用示例代码或am start -a android.settings.WIFI_SETTINGS均可自动跳转至自研的设置应用中。

另外发现,原生的settings应用处于/system/priv-app下,覆盖的应用优先级也需要处于该目录,才能生效。没去看源码,怀疑是/system/priv-app的应用响应优先级比/system/app要高。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐