Android跳转系统Settings界面
当应用没有权限、没有打开通知等情况时,需要引导用户跳转到对应的系统设置界面手动操作。Settings提供了丰富的ACTION_跳转设置界面,让我们来看一下。
以Android refs/tags/android-14.0.0_r66为例,设置源码中ACTION_共110个:
①hide和system ACTION_有15个,普通应用无法跳转
②其79个设置跳转ACTION_不需要带package,若携带Uri跳转反而会报错
③16个ACTION_需要带package启动,这其中又有7个ACTION_可带可不带package均可跳转(跳转效果不同)。
1、带package启动设置界面
比如跳转应用信息设置界面,通过ACTION_APPLICATION_DETAILS_SETTINGS跳转:
val uri = Uri.parse("package:$packageName")
val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS ,uri)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
startActivity(intent)
如果用不带包含package信息的Intent启动:
val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
startActivity(intent)
则启动会报错,找不到对应界面:android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.settings.APPLICATION_DETAILS_SETTINGS flg=0x10000000 }
需要携带package指定打开哪个应用的应用信息界面。而有些ACTION_的跳转如果带了package反而无法跳转,这个需要开发者阅读源码注释说明。
2、不带package启动设置界面
绝大多数ACTION_都是不需要带package信息启动的:
val intent = Intent(Settings.ACTION_ALL_APPS_NOTIFICATION_SETTINGS)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
startActivity(intent)
除非源码中有指定说明要带package信息启动:“The Intent's data URI specifies the application package name to be shown, with the "package" scheme.”
/**
* Activity Action: Show the "Open by Default" page in a particular application's details page.
* <p>
* In some cases, a matching Activity may not exist, so ensure you safeguard against this.
* <p>
* Input: The Intent's data URI specifies the application package name
* to be shown, with the "package" scheme. That is "package:com.my.app".
* <p>
* Output: Nothing.
*/
@SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
public static final String ACTION_APP_OPEN_BY_DEFAULT_SETTINGS =
"android.settings.APP_OPEN_BY_DEFAULT_SETTINGS";
3、常用系统设置ACTION
系统设置Settings中定义的一些常用的界面ACTION_常量如下:
ACTION | 界面 |
ACTION_SETTINGS | 系统设置界面 |
ACTION_APN_SETTINGS | APN设置界面 |
ACTION_LOCATION_SOURCE_SETTINGS | 定位设置界面 |
ACTION_AIRPLANE_MODE_SETTINGS | 更多连接方式设置界面 |
ACTION_DATA_ROAMING_SETTINGS | 双卡和移动网络设置界面 |
ACTION_ACCESSIBILITY_SETTINGS | 无障碍设置界面/辅助功能界面 |
ACTION_SYNC_SETTINGS | 同步设置界面 |
ACTION_ADD_ACCOUNT | 添加账户界面 |
ACTION_NETWORK_OPERATOR_SETTINGS | 选取运营商的界面 |
ACTION_SECURITY_SETTINGS | 安全设置界面 |
ACTION_PRIVACY_SETTINGS | 备份重置设置界面 |
ACTION_VPN_SETTINGS | VPN设置界面,可能不存在 |
ACTION_WIFI_SETTINGS | 无线网设置界面 |
ACTION_WIFI_IP_SETTINGS | WIFI的IP设置 |
ACTION_BLUETOOTH_SETTINGS | 蓝牙设置 |
ACTION_CAST_SETTINGS | 投射设置 |
ACTION_DATE_SETTINGS | 日期时间设置 |
ACTION_SOUND_SETTINGS | 声音设置 |
ACTION_DISPLAY_SETTINGS | 显示设置 |
ACTION_LOCALE_SETTINGS | 语言设置 |
ACTION_VOICE_INPUT_SETTINGS | 辅助应用和语音输入设置 |
ACTION_INPUT_METHOD_SETTINGS | 语言和输入法设置 |
ACTION_USER_DICTIONARY_SETTINGS | 个人字典设置界面 |
ACTION_INTERNAL_STORAGE_SETTINGS | 存储空间设置的界面 |
ACTION_SEARCH_SETTINGS | 搜索设置界面 |
ACTION_APPLICATION_DEVELOPMENT_SETTINGS | 开发者选项 |
ACTION_DEVICE_INFO_SETTINGS | 手机状态信息的界面 |
ACTION_DREAM_SETTINGS | 互动屏保设置的界面 |
ACTION_NOTIFICATION_LISTENER_SETTINGS | 通知使用权设置的界面 |
ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS | 勿扰权限设置的界面 |
ACTION_CAPTIONING_SETTINGS | 字幕设置的界面 |
ACTION_PRINT_SETTINGS | 打印设置界面 |
ACTION_BATTERY_SAVER_SETTINGS | 节电助手界面 |
ACTION_HOME_SETTINGS | 主屏幕设置界面 |
ACTION_APPLICATION_DETAILS_SETTINGS | 根据包名跳转到系统自带的应用程序信息 |
ACTION_APPLICATION_SETTINGS | 应用程序列表 |
ACTION_MANAGE_ALL_APPLICATIONS_SETTINGS | 应用程序界面【所有的】 |
ACTION_MANAGE_APPLICATIONS_SETTINGS | 应用程序列表界面【已安装的】 |
ACTION_INPUT_METHOD_SUBTYPE_SETTINGS | 【API 11及以上】语言选择界面 【多国语言选择】 |
ACTION_NFCSHARING_SETTINGS | 显示NFC共享设置【API 14及以上】 |
ACTION_NFC_SETTINGS | 显示NFC设置【API 16及以上】 |
ACTION_QUICK_LAUNCH_SETTINGS | 快速启动设置界面 |
可以优先携带package信息进行跳转,可先通过queryIntentActivities()查询是否可以跳转打开,如果不能则去掉package信息。
val uri = Uri.parse("package:$packageName")
val intent = Intent(action, uri)
if (packageManager.queryIntentActivities(intent, 0).size != 0) {
startActivity(intent)
} else {
intent.setData(null)
startActivity(intent)
}
有些ACTION_可带可不带package跳转,带和不带package跳转的效果或界面不一样,比如ACTION_USAGE_ACCESS_SETTINGS,带package打开详细某个应用的界面:
不带package则打开的是包含全部应用的使用情况访问权限界面: