Android 12 变更

1、前台服务启动限制
在 Android 12上应用再也无法在后台运行时启动前台服务,
如果应用尝试在后台运行时启动前台服务,则会引发异常(少数特殊情况除外)。
当您的应用在后台运行时,请考虑使用 WorkManager 来计划和启动工作。
2、无法通过服务或广播接收器创建通知 trampoline
为了改进应用性能和用户体验,以 Android 12 为目标平台的应用无法从用作通知 trampoline 的服务或广播接收器中启动 activity。
换言之,当用户点按通知或通知中的操作按钮时,您的应用无法在服务或广播接收器内调用 startActivity()。
3、包含 intent 过滤器的应用组件必须声明导出的属性
包含 intent 过滤器的应用组件必须显式设置 android:exported 属性。
未设置该属性的应用无法安装在 Android 12 上。
4、待处理 intent 必须声明可变性
如果您的应用以 Android 12 为目标平台,您必须为您的应用创建的每个 PendingIntent 对象指定可变性
如需声明特定 PendingIntent 对象是否可变,请分别使用 PendingIntent.FLAG_MUTABLE 或 PendingIntent.FLAG_IMMUTABLE 标志。
如果您的应用试图在不设置任何可变标志的情况下创建 PendingIntent 对象,系统会抛出 IllegalArgumentException
5、在 Android 12上嵌套使用Intent 会发出警告
嵌套 intent 是在其他 intent 中作为 extra 传递的 intent
如要使用,使用 PendingIntent 代替嵌套 intent
6、WebView 中的 SameSite Cookie 行为
7、自定义通知变更
Android 12 改变了完全自定义通知的外观

Android 11 新特性

Android 11 引入了一些变更和限制来加强用户隐私保护

1,单次授权
从 Android 11 开始,每当应用请求与位置信息、麦克风或摄像头相关的权限时,面向用户的权限对话框会包含仅限这一次选项。如果用户在对话框中选择此选项,系统会向应用授予临时的单次授权。如果您的应用已遵循与权限相关的最佳做法,无需更改。

2,自动重置未使用的应用的权限
如果应用以 Android 11 或更高版本为目标平台并且数月未使用,系统会通过自动重置用户已授予应用的运行时敏感权限来保护用户数据。此操作与用户在系统设置中查看权限并将应用的访问权限级别更改为拒绝的做法效果一样。如果您的应用已遵循与权限相关的最佳做法,无需更改。
3,权限对话框的可见

从 Android 11 开始,在应用安装到设备上后,如果用户在使用过程中多次针对某项特定的权限点按拒绝,那么在您的应用再次请求该权限时,用户将不会看到系统权限对话框。该操作表示用户希望“不再询问”。在之前的版本中,除非用户先前已选中“不再询问”对话框或选项,否则每当您的应用请求权限时,用户都会看到系统权限对话框。Android 11 中的这一行为变更旨在避免重复请求用户已选择拒绝的权限。
如果您的应用已遵循与权限相关的最佳做法,无需更改。

4,电话号码
Android 11 更改了您的应用在读取电话号码时使用的与电话相关的权限。
如果您的应用以 Android 11 或更高版本为目标平台,并且需要访问以下列表中显示的电话号码 API,则必须请求 READ_PHONE_NUMBERS 权限,而不是 READ_PHONE_STATE 权限。
如果您的应用声明 READ_PHONE_STATE 以调用前面列表中的方法以外的方法,您可以继续在所有 Android 版本中请求 READ_PHONE_STATE。不过,如果您仅对前面列表中的方法使用 READ_PHONE_STATE 权限,请按以下方式更新您的清单文件:

更改 READ_PHONE_STATE 的声明,以使您的应用仅在 Android 10(API 级别 29)及更低版本中使用该权限。
添加 READ_PHONE_NUMBERS 权限。

5,Android 11 中的软件包可见性
Android 11 更改了应用查询用户已在设备上安装的其他应用以及与之交互的方式。使用 queries元素,应用可以定义一组自身可访问的其他软件包。通过告知系统应向您的应用显示哪些其他软件包,此元素有助于鼓励最小权限原则。如果您的应用以 Android 11 或更高版本为目标平台,您需要在应用的清单文件中添加 queries元素。在queries 元素中,您可以按软件包名称、intent 签名或提供程序授权指定软件包。

6,系统提醒窗口变更
在 Android 11 中,向应用授予 SYSTEM_ALERT_WINDOW 权限的方式发生了一些变更。这些变更可以让权限的授予更有目的性,从而达到保护用户的目的。
根据请求自动向某些应用授予 SYSTEM_ALERT_WINDOW 权限
系统会根据请求自动向某些类型的应用授予 SYSTEM_ALERT_WINDOW 权限:
系统会自动向具有 ROLE_CALL_SCREENING 且请求 SYSTEM_ALERT_WINDOW 的所有应用授予该权限。如果应用失去 ROLE_CALL_SCREENING,就会失去该权限。
系统会自动向通过 MediaProjection 截取屏幕且请求 SYSTEM_ALERT_WINDOW 的所有应用授予该权限,除非用户已明确拒绝向应用授予该权限。当应用停止截取屏幕时,就会失去该权限。此用例主要用于游戏直播应用。
这些应用无需发送 ACTION_MANAGE_OVERLAY_PERMISSION 以获取 SYSTEM_ALERT_WINDOW 权限,它们只需直接请求 SYSTEM_ALERT_WINDOW 即可。
MANAGE_OVERLAY_PERMISSION intent 始终会将用户转至系统权限屏幕
从 Android 11 开始,ACTION_MANAGE_OVERLAY_PERMISSION intent 始终会将用户转至顶级设置屏幕,用户可在其中授予或撤消应用的 SYSTEM_ALERT_WINDOW 权限。intent 中的任何 package: 数据都会被忽略。
在更低版本的 Android 中,ACTION_MANAGE_OVERLAY_PERMISSION intent 可以指定一个软件包,它会将用户转至应用专用屏幕以管理权限。从 Android 11 开始将不再支持此功能,而是必须由用户先选择要授予或撤消哪些应用的权限。此变更可以让权限的授予更有目的性,从而达到保护用户的目的。

7,Android 11以上弃用了Handler() 无参构造方法和 Handler(Handler.Callback) 构造方法,要显示配置Looper

8,Toast更新
强调:自定义的Toast 不能在 app 处于后台时show(),普通的 text toast 不受影响;
普通的 text toast 不支持自定义,setGravity 和 setMargin 方法失去效果,而自定义的 toast 不受影响,text toast的getView()方法返回null;
setView() 方法被标记弃用,新增 Toast.Callback 回调,以通知 Toast 显示和隐藏

9,Android 11 添加5G功能
1、检查是否按流量计费性,NET_CAPABILITY_TEMPORARILY_NOT_METERED可根据移动网络运营商提供的信息,告知您正在使用的网络是否不按流量计费
2、5G检测 ,可通过TelephonyManager.listen() 传入LISTEN_DISPLAY_INFO_CHANGED检测用户是否连接5G网络
3、带宽估测,通过NetworkCapabilities 对象可以获取带宽估测值