一、同一个api在不同版本都存在,只是api的一些接口方法有变更。
这种情况是最好处理的,只要对版本号做判断,对应的系统版本用相应的api方法就好了。为了好维护,建议做一个简单的封装。
举例说明如下:
比如Notification在不同版本的兼容,举例如下:
首先打开谷歌官方文档,看看文档里面的一些说明:
1.Notification这个类是added in API level 1,一直都有,只是具体某些方法有变更。继续往下看。
2.这个类有个说明,意思是Notification.Builder是新增的一个内部类,用它创建通知更方便。接着往下看。
A class that represents how a persistent notification is to
be presented to the user using the NotificationManager.
The Notification.Builder has been added to make it easier
to construct Notifications.
3.Public constructors公共的构造方法,其中有3个参数的这个在api 11过时,它被Notification.Builder替代了。
Notification(int icon, CharSequence tickerText, long when)
This constructor was deprecated in API level 11.
Use Notification.Builder instead.
4.常量
EXTRA_LARGE_ICON
This constant was deprecated in API level 26. Use getLargeIcon(), which supports a wider variety of icon sources.(在API级别26中已弃用。使用getLargeIcon(),它支持更多种图标源。)EXTRA_SMALL_ICON
This constant was deprecated in API level 26. Use getSmallIcon(), which supports a wider variety of icon sources.(在API级别26中已弃用。使用getSmallIcon(),它支持更多种图标源。)FLAG_HIGH_PRIORITY
This constant was deprecated in API level 16. Use priority with a positive value.(在api16被弃用,请使用正数priority值替代)FLAG_SHOW_LIGHTS
This constant was deprecated in API level 26. use shouldShowLights().(在API级别26中已弃用。请使用shouldShowLights()
替代)PRIORITY_DEFAULT
This constant was deprecated in API level 26. use IMPORTANCE_DEFAULT instead.(在API级别26中已弃用。请使用IMPORTANCE_DEFAULT
替代)PRIORITY_HIGH
This constant was deprecated in API level 26. use IMPORTANCE_HIGH instead.(在API级别26中已弃用。请使用IMPORTANCE_HIGH
替代)PRIORITY_LOW
This constant was deprecated in API level 26. use IMPORTANCE_LOW instead.(在API级别26中已弃用。请使用IMPORTANCE_LOW
替代)PRIORITY_MAX
This constant was deprecated in API level 26. use IMPORTANCE_HIGH instead.(在API级别26中已弃用。请使用IMPORTANCE_HIGH
替代)PRIORITY_MIN
This constant was deprecated in API level 26. use IMPORTANCE_MIN instead.(在API级别26中已弃用。请使用IMPORTANCE_MIN
替代)STREAM_DEFAULT
This constant was deprecated in API level 21. Use getAudioAttributes() instead.(在API级别21中已弃用。请使用getAudioAttributes()
替代)
5.字段Fields
audioAttributes
在api 26弃用. 使用getAudioAttributes()
替代.audioStreamType
在api 21弃用. 使用audioAttributes
替代.defaults
此字段在API 26弃用。使用getSound()
和shouldShowLights()
和shouldVibrate()
。icon
此字段已在API级别26中弃用。使用setSmallIcon(Icon)
替代。largeIcon
This field was deprecated in API level 23. Use `setLargeIcon(Icon) instead.ledARGB
This field was deprecated in API level 26. use `shouldShowLights().ledOffMS
This field was deprecated in API level 26. use `shouldShowLights().ledOnMS
This field was deprecated in API level 26. useshouldShowLights().
priority
This field was deprecated in API level 26. usegetImportance()
instead.sound
This field was deprecated in API level 26. usegetSound()
instead.vibrate
This field was deprecated in API level 26. usegetVibrationPattern()
.
二、Android 8.0适配报错:Only fullscreen opaque activities can request orientation解决方案:
出现的原因:绝大多数都是因为我们为了提高用户体验,手动取消App启动白屏或者黑屏的时候,将Splash界面设为了透明,然后这个时候又设置了方向为垂直,从而导致了这个问题。
解决方案:
1.找到你设置透明的Activity,然后在他的theme中将android:windowIsTranslucent改为false
<item name="android:windowIsTranslucent">false</item>
2.再加入下面这行代码就搞定了。
<item name="android:windowDisablePreview">true</item>
这个坑来自于博客: https://www.jianshu.com/p/d0d907754603
三、Android8.0版本更新相关api适配
- 创建通知渠道
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationManager manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
NotificationChannel mChannel = new NotificationChannel("channel_01",
"消息推送", NotificationManager.IMPORTANCE_DEFAULT);
manager.createNotificationChannel(mChannel);
}
- 创建Notification
Context context = DJApplication.getInstance();
Notification.Builder builder = new Notification.Builder(context);
builder.setTicker("开始下载");
builder.setSmallIcon(R.mipmap.ic_launcher);
builder.setLargeIcon(BitmapFactory.decodeResource(DJApplication.getInstance().getResources(),
R.mipmap.ic_launcher));
builder.setAutoCancel(true);
PendingIntent pIntent = PendingIntent.getActivity(context, 0, new Intent(), PendingIntent.FLAG_UPDATE_CURRENT);
builder.setContentTitle("下载中");
builder.setContentIntent(pIntent);
builder.setContentText(text);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
builder.setChannelId("channel_01");//设置有效的通知渠道 ID,这个ID要和之前创建时候的Channel_ID相同
}
manager.notify(1, builder.build());
- 安装apk权限
在 Android 8.0 中,安装未知应用权限提高了安装未知来源应用时的安全性。此权限与其他运行时权限一样,会与应用绑定,在安装时进行提示,确保用户授予使用安装来源的权限后,此权限才会提示用户安装应用。在运行 Android 8.0 或更高版本的设备上使用此权限时,恶意下载程序将无法骗取用户安装未获得预先授权的应用,所以我们需要加入安装apk文件的权限。
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />