Android7.x新特性分析

作者: 李景三 | 来源:发表于2017-04-24 13:51 被阅读173次

    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_PICTUREACTION_NEW_VIDEO 类型的广播。

    应对策略:

    • Android 框架提供多个解决方案来缓解对这些隐式广播的需求。

    例如,JobSchedulerAPI 提供了一个稳健可靠的机制来安排满足指定条件(例如连入无限流量网络)时所执行的网络操作。 您甚至可以使用 JobSchedulerAPI 来适应内容提供程序变化。

    3 NDK 应用链接至平台库

    从 Android 7.0 开始,系统将阻止应用动态链接非公开 NDK 库,这种库可能会导致您的应用崩溃。此行为变更旨在为跨平台更新和不同设备提供统一的应用体验。即使您的代码可能不会链接私有库,但您的应用中的第三方静态库可能会这么做。因此,所有开发者都应进行相应检查,确保他们的应用不会在运行Android 7.0 的设备上崩溃。如果您的应用使用原生代码,则只能使用公开 NDK API

    image

    实际案例:

    二、新特性介绍

    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 image

    Notification支持在通知栏内回复。

    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的手机。除此之外最快能搭载的设备有Nexus5XNexus 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桌面图标:

    image

    Android7.1桌面图标:

    image

    2 键盘支持图片输出

    键盘不仅能够打字,也能够支持图片、表情和动图等更多内容的输出。这类功能其实已经在许多第三方输入法上实现了,但在原生Android 自带输入法上尚属首次。

    包含常用脸部表情、小动物、食物、建筑、车辆、天气、月相、时钟、节日特色、运动、球类、扑克、乐器、学习用品、生活用品、工具、公共场所常见标志、星座、国旗等940个表情图片。

    image

    3 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不能被移除:

    image

    2 参考资料

    Android 8.0 预览版

    由于Android8.0现在只有预览版,很多新特性还不确定,暂不整理,日后补充。

    相关文章

      网友评论

        本文标题:Android7.x新特性分析

        本文链接:https://www.haomeiwen.com/subject/ldcpzttx.html