Android11新API归纳总结

Android11新增的API归纳总结中


Android 11 中首次发布了支持动态资源加载的公开接口

1
2
3
4
5
6
String sdkroot = getApplicationInfo().dataDir + "/customfile";
ResourcesLoader rl = new ResourcesLoader();
rl.addProvider(ResourcesProvider.loadFromDirectory(sdkroot, null));
Resources res = getResources();
res.addLoaders(rl);
final AssetManager assetManager = res.getAssets();

隐私和权限

Android 11 新增了关于位置、麦克风和摄像头的一次性权限许可。也就是说,获得一次性权限许可的 APP 在下次使用时,依然要询问用户获取授权。下次再使用该应用程序并希望使用该权限时,还会再重新授予它访问权限。

应用进程退出原因

Android 11 引入了 ActivityManager.getHistoricalProcessExitReasons() 方法,用于报告近期任何进程终止的原因。应用可以使用此方法收集崩溃诊断信息,例如进程终止是由于 ANR、内存问题还是其他原因所致。此外,您还可以使用新的 setProcessStateSummary() 方法存储自定义状态信息,以便日后进行分析。

getHistoricalProcessExitReasons() 方法会返回 ApplicationExitInfo 类的实例,该类包含与应用进程终止相关的信息。通过对此类的实例调用 getReason(),您可以确定应用进程终止的原因。例如,REASON_CRASH 的返回值表示应用中发生了未处理的异常。如果应用需要确保退出事件的唯一性,可以保留特定于应用的标识符,例如基于 getTimestamp() 方法的时间戳的哈希值。

APK 签名方案 v4

Android 11 添加了对 APK 签名方案 v4 的支持。此方案会在单独的文件 (apk-name.apk.idsig) 中生成一种新的签名,但在其他方面与 v2 和 v3 类似。没有对 APK 进行任何更改。此方案支持 ADB 增量 APK 安装,这样会加快 APK 安装速度。

动态 intent 过滤器

如需接收 intent,应用必须通过在其清单中定义 intent 过滤器,在编译时声明它能够接收哪些类型的数据。

  • 在 Android 10 及更低版本中,应用无法在运行时更改其 intent 过滤器。
    1
    2
    3
    4
    5
    6
    7
    <activity android:name=".ViewerActivity">
    <intent-filter>
    <action android:name="android.intent.action.VIEW"/>
    <category android:name="android.intent.category.DEFAULT"/>
    <data android:mimeType="image/jpeg"/>
    </intent-filter>
    </activity>
  • 在Android 11中,可以在应用程序端动态设置此MIME类型部分。
    1
    2
    3
    4
    5
    6
    7
    <activity android:name=".ViewerActivity">
    <intent-filter>
    <action android:name="android.intent.action.VIEW"/>
    <category android:name="android.intent.category.DEFAULT"/>
    <data android:mimeGroup="myGroup"/>
    </intent-filter>
    </activity>
  • 为组设置MIME类型
    1
    2
    3
    pm = requireContext().packageManager
    val types = setOf("image/jpg", "image/jpeg")
    pm.setMimeGroup("myGroup", types)
  • 删除设置的MIME类型
    如果出于某种原因要删除MIME类型集,请Set传递一个空的类似这样的内容:
    1
    2
    3
    val pm = requireContext().packageManager
    val types = setOf()
    pm.setMimeGroup("myGroup", types)
    setMimeGroup()用参数中接收到的MIME类型集覆盖。
    因此,请注意,如果您一次设置MIME类型并且要添加更多内容,则需要包括第一组而不是diff。