不同 API 级别的不同 AndroidManifest 文件

Different AndroidManifest files for different API levels

我正在创建一个需要收集状态栏通知的应用程序。系统提示用户允许我实施 NotificationListenerService (API >= 18) 或 AccessibilityService(其他设备),然后他们将被重定向到设置屏幕。

当我在 API < 18 时,用户被重定向到辅助功能设置屏幕,他允许辅助功能服务,一切正常。但是,当用户处于 18>= 时,即使用户被重定向到通知设置,他仍然可以导航到辅助功能设置以允许辅助功能服务。然后我的两个服务都在注册通知并通知我。

显然我可以检查消息来自哪个服务并做出相应的反应,但我更喜欢一些更清洁的解决方案。我不希望用户能够允许这两种服务(它们都出现在设置中)。

有没有办法做一些事情,比如为不同的 API 级别定义单独的清单文件,或者在 <application> 标签内声明 <uses-sdk> 以便它们将用于不同的 API 水平?当然,我们不能以编程方式创建服务 - 我们必须在清单中声明它们。

第 1 步:在 res/values/ 中创建一个名为 is18 的布尔资源,设置为 false,并创建第二个名为 isLessThan18 的布尔资源,设置为 true.

步骤 #2:在 res/values-v18/ 中创建名为 is18 的布尔资源,设置为 true,并创建第二个名为 isLessThan18 的布尔资源,设置为 false.

第 3 步:使用 android:enabled="@boolean/is18" 作为 <service> 元素作为 NotificationListenerService

第 4 步:使用 android:enabled="@boolean/isLessThan18" 作为 <service> 元素作为 AccessibilityService

这将只为每台设备启用一项服务,适当的服务由 API 级别决定。