Android8.0适配要点

Android开发精进

Posted by dks on November 28, 2018

Android开发,学习不能停

Android8.0适配要点

适配前务必查看行为变更详细说明官方介绍

1. 通知

Android 8.0 引入了通知渠道,其允许您为要显示的每种通知类型创建用户可自定义的渠道。 targetSdkVersion 为 26 的应用创建通知时必须传入 channelId,否则通知将不会显示。示例代码如下,也可查看官方示例

// 创建通知渠道
NotificationChannel chan1 = new NotificationChannel(PRIMARY_CHANNEL,
	getString(R.string.noti_channel_default), NotificationManager.IMPORTANCE_DEFAULT);
chan1.setLightColor(Color.GREEN);
chan1.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE);
NotificationManager manager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
manager.createNotificationChannel(chan1)
// 创建通知时传入channelId
Notification.Builder builder = Notification.Builder(getApplicationContext(), PRIMARY_CHANNEL)
             .setContentTitle(title)
             .setContentText(body)
             .setSmallIcon(getSmallIcon())
             .setAutoCancel(true);
             
 manager.notify(id, builder.build())

2. 安装未知来源应用

针对 8.0 的应用(targetSdkVersion 26)需要在 AndroidManifest.xml 中声明 REQUEST_INSTALL_PACKAGES 权限,否则将无法进行应用内升级。

<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />

3. 后台执行限制

具体变更见官方说明

大意有两点:一、应用进入已缓存状态时,如果没有活动的组件。二、系统将解除应用具有的所有唤醒锁在后台运行的应用对后台服务的访问受到限制,无法使用其清单注册大部分隐式广播(即,并非专门针对此应用的广播)。三、应用尝试在不允许其创建后台服务的情况下使用 startService() 函数,则该函数将引发一个 IllegalStateException。四、调用Context.startForegroundService()后,应用必须在五秒内调用该服务的 startForeground() 函数。

应对方法

  • 将静态广播改为动态广播
  • 要保证后台服务不被 kill ,需要5秒内startForeground()启动一个前台通知,使得服务成为前台任务。
  • try catch startService() 函数,捕获可能出现的异常。(“不允许其创建后台服务的情况”是指什么 ,有待探究)

    4. 后台位置限制

    在运行 Android 8.0 的设备上使用后台应用时,降低了后台应用接收位置更新的频率,不超过每小时几次。对于需要频繁获取位置的应用显然这是不可行的。 应对方法:启动一个前台通知,使得服务成为前台任务,并注意上述3中的要点。(百度、高德都是这样的方案)

5. 透明 Activity 设置屏幕方向

针对 8.0 的应用(targetSdkVersion 26),设置了透明主题的Activity,再设置屏幕方向,代码如下:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="android:windowIsTranslucent">true</item>
</style>

<activity
    android:name=".MainActivity"
    android:screenOrientation="portrait"
    android:theme="@style/AppTheme">
</activity>
复制代码

将会抛出以下异常:

java.lang.IllegalStateException: Only fullscreen opaque activities can request orientation

大意是:只有不透明的全屏Activity可以自主设置界面方向。

应对方法:透明还是方向,任选其一,不可兼得。

6. 桌面图标适配

(targetSdkVersion 26)的应用如果不进行图标适配,则应用图标在 Launcher 中将会被添加白色背景,可能会导致图标变成白色,甚至点击无法进入应用。 应对方法:看这篇:一起来学习Android 8.0系统的应用图标适配吧

7. 动态权限

在 Android 8.0 之前,如果应用在运行时请求权限并且被授予该权限,系统将属于同一权限组并且在清单中注册的其他权限也一起授予应用。官方认为这是错误,并在 8.0 中修复了,因此,用到的每一项权限都需要动态申请。

8. 其他

以上7项是你必须要注意的变动,其他变更如:API 变更,自动调整 TextView 的大小,自动填充框架,应用快捷键,语言区域和国际化等,按需适配吧。

参考