虽然 Android 9.0 都已经面世了,本篇文章写的有点迟了。 可是迟到好过不到,所以基于此这边仍是记录一下项目中遇到的 Android 8.0 的坑及对应解决方法。android
每次系统升级,虽然系统功能更增强大了,各方面性能也提升了。git
可是对于开发者而言,一个困扰的问题也是随之而来——兼容。github
尤为对于一些已经上市的 App 而言,在新系统发布以前就要了解到底有哪些改动,以免用户升级新系统后致使 App 无法正常运行。bash
好了,回归主题,说说 Android 8.0 里面的几个坑吧。app
若是你的 App 提供了更新功能,用户点击更新,你下载完 Apk 以后会自动弹出安装界面。性能
这个安装界面的弹出就是依赖于系统的安装器。ui
假设你在 Android 8.0 如下的手机操做正常,可是在 8.0 的手机上,你会发现,下载完以后彻底没反应。google
这个时候 spa
假设你觉得说弹个提示让用户本身安装,我想说 3d
用户才不会理你。用户分分钟就不更新了。
因此说咱们要解决这个问题。让这个安装器在 Android 8.0 的手机也能正常唤起。
其实解决方法很是简单。
只须要在 AndroidManifest.xml 中声明如下权限便可。
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
复制代码
并且还不须要你在代码动态申请,是否是 So easy。
一行代码解决这个兼容性问题。
假设你的 App 须要在任务栏显示通知。若是你是按照 Android 8.0 以前的写法的话。那么在 8.0 的手机上面你是显示不了的。
那怎么办呢?
关于通知的基本写法这边就再也不赘余,若是不清楚的小伙伴自行查阅资料。这边重点说下解决方法。
首先说下下面代码出现的几个变量:
private static NotificationManager manager;
public static final String NOTIFICATION_CHANNEL = "your app pkg name";
private static final String NOTIFICATION_CHANNEL_NAME = "App Channel";
复制代码
第一个写过通知的都知道,一个管理类。
第二个是通知的一个 CHANNEL,这个也是 8.0 以后才引入的。取值 App 包名便可。
第三个自定义,只要保证惟一便可。
兼容有两步须要操做。
private static void createChannel() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel notifyChannel = new NotificationChannel(NOTIFICATION_CHANNEL,
NOTIFICATION_CHANNEL_NAME,
NotificationManager.IMPORTANCE_DEFAULT);
notifyChannel.setLightColor(Color.GREEN);
notifyChannel.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE);
manager.createNotificationChannel(notifyChannel);
}
}
复制代码
private Notification.Builder getNotificationBuilder(Context sourceContext) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
return new Notification.Builder(sourceContext, NOTIFICATION_CHANNEL);
} else {
return new Notification.Builder(sourceContext);
}
}
复制代码
能够看到,上面的操做都以 8.0 做为分界处理。
作完这两步,以前不能显示通知的 App 就能够显示了。
更多内容能够看官方示例: github.com/googlesampl…