Android开发中的自我总结梳理-----7.0,8.0对开发者的影响及简单指南

Android 7.0

1,权限更改

Android N 做了一些权限更改,这些更改可能会影响您的应用。面向 Android N 或更高版本的应用私有目录被限制访问此项更改的

优点:可防止私有文件的元数据泄漏,如它们的大小或存在
缺点:私有文件的文件权限不应再由所有者放宽,为使用MODE_WORLD_READABLE 和/或MODE_WORLD_WRITEABLE 而进行的此类尝试将触发SecurityException。

注:迄今为止,这种限制尚不能完全执行。 应用仍可能使用原生 API 或 File API 来修改它们的私有目录权限。但是,我们强烈反对放宽私有目录的权限。

传递软件包网域外的 file:// URI 可能给接收器留下无法访问的路径。 因此,尝试传递 file:// URI 会触发 FileUriExposedException。 分享私有文件内容的推荐方法是使用 FileProvider。
DownloadManager 不再按文件名分享私人存储的文件。 旧版应用在访问 COLUMN_LOCAL_FILENAME 时可能出现无法访问的路径。 面向 Android N 或更高版本的应用在尝试访问 COLUMN_LOCAL_FILENAME 时会触发 SecurityException。 通过使用DownloadManager.Request.setDestinationInExternalFilesDir() 或DownloadManager.Request.setDestinationInExternalPublicDir() 将下载位置设置为公共位置的旧版应用仍可以访问 COLUMN_LOCAL_FILENAME 中的路径,但是我们强烈反对使用这种方法。 访问由 DownloadManager 公开的文件的首选方式是使用 ContentResolver.openFileDescriptor()。

2,应用间共享文件

对于针对Android 7.0的应用,Android framework执行的StrictMode API禁止向你的App外公开file://URI。如果一个包含文件URI的Intent发送到你的应用之外,App会发生FileUriExposedException异常。

若要在应用间共享文件,您应发送一项content://URI,并授予URI临时访问权限。进行此授权的最简单方式是使用FileProvider类。如需有关权限和共享文件的更多信息,请参阅共享文件。  

解决 Android N 上 安装Apk时报错:android.os.FileUriExposedException:       AndroidManifest.xml中添加如下代码
<provider                     android:name="android.support.v4.content.FileProvider"
android:authorities="app的包名.fileProvider"
android:grantUriPermissions="true"
android:exported="false">
<meta-data              android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider> 
 注意: 
 authorities:app的包名.fileProvider
 grantUriPermissions:必须是true,表示授予 URI 临时访问权限
 exported:必须是false
 resource:中的@xml/file_paths是我们接下来要添加的文件

 在res目录下新建一个xml文件夹,并且新建一个file_paths的xml文件(如下图)  这里写图片描述

这里写图片描述

 输入以下内容
<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-path path="Android/data/app的包名/" name="files_root" />
        <external-path path="." name="external_storage_root" />
</paths>

path:需要临时授权访问的路径(.代表所有路径)* 
name:就是你给这个访问路径起个名字*

最后修改代码:

Intent intent = new Intent(Intent.ACTION_VIEW);
//判断是否是AndroidN以及更高的版本
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    Uri contentUri = FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".fileProvider", apkFile);
    intent.setDataAndType(contentUri, "application/vnd.android.package-archive");
} else {
    intent.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive");
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
}
startActivity(intent);
//以前我们直接 Uri.fromFile(apkFile)构建出一个Uri,现在我们使用FileProvider.getUriForFile(context, BuildConfig.APPLICATIO

3,后台优化

Android N 删除了三项隐式广播,隐式广播会在后台频繁启动已注册侦听这些广播的应用。 删除这些广播可以显著提升设备性能和用户体验.

1, 侦听网络变化的主线程广播改为: CONNECTIVITY_CHANGE。
2,对所有应用都无法 发送和接受 ACTION_NEW_PICTURE 或 ACTION_NEW_VIDEO .

4,屏幕缩放

Android 7.0支持用户设置显示尺寸,以放大或缩小屏幕上的所有元素,从而提升设备对视力不佳用户的可访问性。用户无法将屏幕缩放至低于最小屏幕宽度sw320dp,该宽度是Nexus 4的宽度,也是常规中等大小手机的宽度。

 当设备密度发生更改时,系统会以如下方式通知正在运行的应用:
    如果是面向API leve 23或更低版本系统的应用,系统会自动终止其所有后台进程。也就是说如果用户切换后离开你的App,打开“Settings”更改Display size设置,则系统会像处理内存不足的情况一样终止该应用。如果应用具有任何前台进程,则系统会如处理运行时变更中所述将配置变更通知给这些进程,就像对待设备屏幕方向变更一样,具体大家可以再看看这个超链接。

  如果是针对Android 7.0的App,则其所有进程(前台和后台)都会收到有关配置变更的通知,如处理运行时变更中所讲的那样。
   大多数App并不需要进行任何更改即可支持此功能,不过前提是这些应用遵循Android最佳实践。具体要检查的事项:

    在屏幕宽度为 sw320dp 的设备上测试你的App,并确保其正常运行。
    当设备Config发生变更时,更新任何与密度相关的缓存信息,例如缓存位图或从网络加载的资源。当应用从暂停状态恢复运行时,检查Config的变化。 

*注:如果你要缓存与配置相关的数据,则最好也包括相关元数据,例如该数据对应的屏幕尺寸或像素密度。保存这些元数据便于你在Config变更后决定是否需要刷新缓存数据。*

避免用像素单位指定尺寸,因为像素不会随屏幕密度缩放。应改为使用dp等单位。
用户可以在设置-显示-显示大小修改屏幕宽度,也可以在设置-开发人员选项-最小宽度随意设置指定宽度,开发人员特别需要注意适配

5,其他重要说明

如果一个针对较低API级别开发的App在Android 7.0上运行,那么在用户更改显示尺寸时,系统将终止此App进程。App必须能够正常处理此情景。否则,当用户从最近使用记录中恢复运行App时,App将会出现崩溃现象。您应测试应用以确保不会发生此行为。要进行此测试,您可以通过DDMS手动终止应用,可以造成相同的崩溃现象。在屏幕密度发生更改时,系统不会自动终止针对Android 7.0及更高版本开发的App;不过这些App仍可能对配置变更做出不良响应。

Android 7.0上的应用应能够正常处理配置变更,并且在后续启动时不会出现崩溃现象。你可以通过更改字体大小 (Setting > Display > Font size) 并随后从最近使用记录中恢复运行应用,来验证App行为。

由于之前的Android版本中的一项错误,系统没有对主线程上的一个TCP Socket的写入操作严格检查。Android 7.0修复了这个系统错误。之前有这种行为的App将会引发android.os.NetworkOnMainThreadException。一般情况下,不建议在主线程上执行网络操作,因为这些操作通常都有可能导致ANR和卡顿,这个应该是中所周知的,大家一般不会犯。

Debug.startMethodTracing()方法族现在默认在你的共享的存储空间上的软件包特定目录中存储输出,而非 SD卡顶级。这意味着应用不再需要请求WRITE_EXTERNAL_STORAGE权限就可以使用这些API。

许多平台API现在开始检查在Binder事务间发送的大负载,系统现在会将TransactionTooLargeExceptions再次作为RuntimeExceptions引发,而不再只是默默记录或不抛出这个错误。一个常见例子是在Activity.onSaveInstanceState())上存储过多数据,导致ActivityThread.StopInfo在你的App面向 Android 7.0时引发RuntimeException。

如果应用向View post Runnable任务,并且View未附加到窗口,系统会用View为Runnable任务排队;在 View附加到窗口之前,Runnable任务不会执行。 此行为会修复以下错误:

如果一个App是从并非预期Window UI线程的其他线程发布到View,则Runnable可能会因此运行错误。
如果Runnable任务是从并非looper thread的其他线程发布,则应用可能会曝光Runnable任务。
如果Android 7.0上有DELETE_PACKAGES权限的应用尝试删除一个软件包,但另一项应用已经安装了这个软件包,则系统可能要求用户确认。在这种情况下,应用在调用PackageInstaller.uninstall()) 时的返回状态应为STATUS_PENDING_USER_ACTION。

Android 8.0

1,画中画模式

Android O 现已支持 Activity 的画中画模式。PIP 是一种多窗口显示模式,多用于视频播放,即你可以一边发微信一边看视频。

 1.  关于生命周期

    PIP 模式不会改变 Activity 的生命周期。在指定时间只有最近与用户交互过的 Activity 为活动状态。 该 Activity 将被视为顶级 Activity。 所有其他 Activity 虽然可见,但均处于暂停状态。当一个 Activity 处于 PIP 模式时,其实它是出在暂停状态,但其内容会继续展示。

 2.  API变更

    在 Android O 中新增 PictureInPictureArgs 对象来指明你的 Activity 在 PIP 模式中的属性,比如长宽比等。

    Android O 还新增了以下方法来支持 PIP。

    Activity.enterPictureInPictureMode(PictureInPictureArgs args):将Activity置于 PIP 模式之下。
    Activity.setPictureInPictureArgs():用于更新 Activity 在 PIP 模式下的设置。如果 Activity 正处于 PIP 模式之下,那么更改的属性将立即生效。

2,通知渠道 — Notification Channels

通知渠道是由应用自行定义的通知内容类别,借助渠道,开发者可以让用户对不同种类的通知进行精细控制,用户可以单独拦截或更改每个渠道的行为,而不是统一管理应用的所有通知。

创建通知渠道的步骤:
 1. 创建 NotificationChannel 对象,并设置应用内唯一的通知 ID。
 1. 配置通知渠道的属性,比如提示声音等。
 1. 在 NotificationManager 中注册通知渠道对象。

3,自适应图标 — Adaptive Icons

Android 的屏幕适配一直以来都折磨着不少的开发者。为了帮助开发者更好的与设备 UI 集成,Android O 支持创建自适应图标,系统可以基于设备选择的蒙版将这些图标显示为不同形状。系统还将实现与图标的自动交互,并在启动器、快捷方式、设置、共享对话框以及概览屏幕中使用它们。

  1. 自适应图标支持多种形状

    通过定义两张图层(前景与背景)你可以制定你的桌面图标外观,你必须提供没有形状和阴影的 PNG 格式图象作为图层。
    
  2. 自适应图标由两张图层和一个形状来定义

    在以前的 Android 版本中,图标大小定义为 48 x 48 dp。现在你必须按照以下的规范定义你的图层大小:
    
    两张图层大小都必须为 108 x 108 dp。
    图层中心 72 x 72 dp 范围为可视范围。
    系统会保留四周外的 36dp 范围用于生成有趣的视觉效果(如视差和跳动)。
    
  3. 创建你的自适应图标

    首先你需要在 Application 标签中加入 Android:icon 属性,定义你的 icon 图标。其次如果你需要创建一个原型的 icon,你还需要加入 Android:roundIcon 属性。
    
    接下来,你需要 res/mipmap-anydpi/ic_launcher.xml 文件中定义您的图层。在 选项中加入您的前景和背景图层。
    

4,固定快捷方式和小部件 — Pinning shortcuts

Pinning shortcuts 是一个比 APP shortcuts 更小的快捷方式,放置于桌面上,用于更快速的打开某一 APP 的某单一任务。Pinning shortcuts 在桌面上可呈现不同的图标显示。

1,首先使isRequestPinShortcutSupported() 方法校验手机是否支持启动这种快捷方式。
2,创建 ShortcutInfo 对象。
3,用 requestPinShortcut() 方法应用 Pinning shortcuts。你可以通过 PendingIntent 来通知你的 shortcuts 有没有创建成功。

5,智能文本选择—Smart Text Selection

    在过去,你想要获取一个地址并导航到那个地方是需要很多步骤,首先是收到这些信息,然后选取文本、复制、打开地图、粘贴进去,然后开始导航。而在Android O中,将会省事许多。智能文本选择(Smart Text Selection)是使用谷歌的机器学习来检测何时选择地址或电话号码,然后自动将其应用于相应的应用程序的功能。如果你点击朋友发送给你的餐厅的地址,Google将会了解你想要的内容,并自动使用地图启动路线。电话号码,电子邮件地址等也可以这样做

总结

    Android 每次的更新,虽然表面上没有非常惊艳的新功能,但在内部,Google 为 Android 的性能做了很多的优化,让 Android 更快更强更有内涵。

    目前 Android 的市场占比已经超过85%,智能手机已经全面普及,对于广大手机厂商来说,适配 Google 的系统版本更新迭代是一个挑战。对于开发者来说,让自己的 APP 兼容新系统是首要任务。

参考文章链接:
https://developer.android.com/preview/index.html
https://developer.android.google.cn/about/versions/oreo/android-8.0-changes.html
http://www.cnblogs.com/dazhao/p/6547811.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值