Android 7.0篇
一、高版本适配
1 应用间共享文件
在Android7.0系统上,Android 框架强制执行了 StrictMode API 政策禁止向你的应用外公开 file:// URI。 如果一项包含文件 file:// URI类型 的 Intent 离开你的应用,应用失败,并出现 FileUriExposedException 异常,如调用系统相机拍照或裁切图片。
实际案例:
2 删除三项隐式广播
1.在 Android 7.0上 应用不会收到 CONNECTIVITY_ACTION广播,即使你在manifest清单文件中设置了请求接受这些事件的通知。但,在前台运行的应用如果使用BroadcastReceiver 请求接收通知,则仍可以在主线程中侦听 CONNECTIVITY_CHANGE。
2.在 Android 7.0上应用无法发送或接收ACTION_NEW_PICTURE 或ACTION_NEW_VIDEO 类型的广播。
应对策略:
- Android 框架提供多个解决方案来缓解对这些隐式广播的需求。
例如,JobSchedulerAPI 提供了一个稳健可靠的机制来安排满足指定条件(例如连入无限流量网络)时所执行的网络操作。 您甚至可以使用 JobSchedulerAPI 来适应内容提供程序变化。
3 NDK 应用链接至平台库
image从 Android 7.0 开始,系统将阻止应用动态链接非公开 NDK 库,这种库可能会导致您的应用崩溃。此行为变更旨在为跨平台更新和不同设备提供统一的应用体验。即使您的代码可能不会链接私有库,但您的应用中的第三方静态库可能会这么做。因此,所有开发者都应进行相应检查,确保他们的应用不会在运行Android 7.0 的设备上崩溃。如果您的应用使用原生代码,则只能使用公开 NDK API。
实际案例:
二、新特性介绍
1 多窗口Playground
1.1 在相邻的窗口启动Activity
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
intent.addFlags(
Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT |
Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
image
1.2 启动一个禁止分屏的Activity
<activity
android:name=".sample.UnresizableActivity"
android:resizeableActivity="false"
android:taskAffinity="" />
image
1.3 跨窗口拖动数据
image imageNotification支持在通知栏内回复。
4 直接启动
当设备已开机但用户尚未解锁设备时,AndroidN 将在安全的“直接启动”模式下运行。 为支持此操作,系统为数据提供两个存储位置:
- 凭据加密存储,这是默认存储位置,仅在用户解锁设备后可用。
- 设备加密存储,该存储位置在“直接启动”模式下和用户解锁设备后均可使用。
开启方式(该操作会清除用户数据并重启设备):设置->开发者选项->转换为文件加密
5 作用域目录访问
应用(如照片应用)通常只需要访问外部存储中的特定目录,例如Pictures 目录。现有的外部存储访问方法未经专门设计,无法轻松地为这些类型的应用提供目标目录访问。 例如:
在您的清单中请求 READ_EXTERNAL_STORAGE 或 WRITE_EXTERNAL_STORAGE 将允许访问外部存储上的所有公共目录,这可能导致访问的内容超出应用需要的内容。
使用存储访问框架通常会让您的用户通过一个系统 UI 选取目录,如果应用始终访问同一个外部目录,则该操作没有任何必要。
Android N 提供简化的全新 API 以访问通用外部存储目录。
系统尝试授予对外部目录的访问权限,并使用一个简化的UI 向用户确认访问权限(如果需要):
image image随着Pixel/XL的发布。曾今的Nexus如今也沦为干儿子了。
这一次Pixel和Pixel XL售价与iPhone7和iPhone7Plus一致($649/$769),并宣称不再做性价比手机,进军高端手机市场。
Pixel/XL是首批搭载Android7.1的手机。除此之外最快能搭载的设备有Nexus5X 、Nexus 6P以及Pixel C平板。不过,在 Pixel/XL 手机上出现的Google Assistant、Pixel Launcher 则不会出现在 Android 7.1 上,这些功能是Pixel们专享的。
Android 7.1新特性
1 圆形应用图标
在 Pixel/XL 我们已经看到原生 Android 图标圆形化的趋势,而 Google 打算将这一趋势推广到 Android 7.1 上。
Android6.0桌面图标:
imageAndroid7.1桌面图标:
image2 键盘支持图片输出
键盘不仅能够打字,也能够支持图片、表情和动图等更多内容的输出。这类功能其实已经在许多第三方输入法上实现了,但在原生Android 自带输入法上尚属首次。
包含常用脸部表情、小动物、食物、建筑、车辆、天气、月相、时钟、节日特色、运动、球类、扑克、乐器、学习用品、生活用品、工具、公共场所常见标志、星座、国旗等940个表情图片。
image3 App Shortcuts
这一功能与 iPhone 上 3D Touch 的功能相类似,就是可以在应用图标上直接添加快捷选项,点击就直接到达相关界面;但这一功能需要开发者的支持。目前开发者可以设置5 个动态和静态的快捷选项。
3.1 注册方式
- 静态注册:定义一个xml文件,并在AndroidManifest.xml中注册
- 动态添加:java代码动态添加
类似广播接收器(BroadcastReceiver)的静动态注册,但略有不同。
3.2 静态注册
先在res文件夹下新建一个xml文件夹,再在xml文件夹下简历一个shortcuts.xml
<?xml version="1.0" encoding="utf-8"?>
<shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
<shortcut
android:shortcutId="add_website"
android:enabled="true"
android:icon="@drawable/add"
android:shortcutLongLabel="@string/add_new_website"
android:shortcutShortLabel="@string/add_new_website_short"
android:shortcutDisabledMessage="@string/disabled">
<intent
android:action="android.intent.action.VIEW"
android:targetPackage="wang.relish.android7"
android:targetClass="wang.relish.android7.MainActivity" />
<categories android:name="android.shortcut.conversation" />
</shortcut>
</shortcuts>
字段说明:
- shortcutId:唯一id,string类型
- enable:是否可用,默认为true
- shortcutShortLabel:短名称,长名称显示不下时显示
- shortcutLongLabel:长名称
- shortcutDisabledMessage,:当前shortcut不可用时弹出的Toast信息
- action:点击shortcut时触发的事件
- targetPackage:应用包名。不是类包名
- targetClass:完整类名
- categories:目前官方只给提供了android.shortcut.conversation
3.3 动态注册
// 添加单个Shortcut
ShortcutManager mManager = getSystemService(ShortcutManager.class);
ShortcutInfo shortcut = new ShortcutInfo
.Builder(this, id) //(Context, String)
//必填项,显示文字
.setShortLabel(shortLabel) //(String)
//必填项,点击后触发该意图
.setIntent(intent) //(Intent)
//选填,显示图标
.setIcon(icon) //(Icon)
.build();
//(List<ShortcutInfo>)
//Arrays.asList(shortcut)
mManager.addDynamicShortcuts(Collections.singletonList(shortcut));
3.4 App Shortcuts-相关……坑
- 静态的Shortcuts使用场景:添加一个新联系人,添加一个对话等。(不可移除,不可更改)
- 静态的Shortcuts一定是定义在Manifest里的(isDeclaredInManifest),一定是不可变的(isImmutable)
- 动态的Shortcuts如果被放置到桌面快捷方式(pinned),即便被disable了,我们仍能取到它(getPinnedShortcuts),但它已经不在app的快捷方式栏中了,桌面图标也会变灰。
- 动态的Shortcuts被disable后,再次enable。也无法在app的快捷方式栏里出现。
- shortcutDisabledMessage的默认值是“无法使用快捷方式”。为了更友好,可以设置更为人性化的提醒。
- 放置在桌面的Shortcuts(Pinned),不能被代码移除(remove),只能使其失效(disable),促使用户去手动移除。
- 一个App最多5个Shortcuts,再次添加会报错: IllegalArgumentException: Max number of dynamic shortcutsexceeded
3.5 相关动态图
动态添加Shortcuts:
image失效的后的Shortcuts再次生效,也无法回到菜单栏:
image哪些Shorrcuts不能被移除:
image2 参考资料
- Android7.0行为变更:https://developer.android.com/about/versions/nougat/android-7.0-changes.html
- Android7.0示例:https://developer.android.com/about/versions/nougat/android-7.0-samples.html
- 安卓7.1开发者预览版10月底发布,正式版12月推出: https://www.oschina.net/news/77985/android-7-1-released-at-october
- Android 7.1 for Developers: https://developer.android.com/about/versions/nougat/android-7.1.html
- Android 7.0 Nougat Made for you: https://www.android.com/versions/nougat-7-0/
Android 8.0 预览版
由于Android8.0现在只有预览版,很多新特性还不确定,暂不整理,日后补充。
网友评论