Android N 新特性

Posted imock

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android N 新特性相关的知识,希望对你有一定的参考价值。

2016年5月19日,谷歌在美国加州的山景城举办了 Google I/O 开发者大会中发布。2016年6月,Android N正式命名为“牛轧糖” 本届I/O开发者大会上,Google重点介绍了android系统三个维度:分别是性能、安全和生产力。其中性能主要新增了Vulkan API与JIT编译器(前者优化图形性能、或者加快软件安装速度);安全性包括新的数据加密方式、恶意网站识别、系统的实时更新;生产力方面加入了分屏多任务功能、程序的快速切换,所有应用都可以支持“多窗口模式”。

  • 支持Vulkan API
  • 多窗口模式 (Multi-Window Support)
  • 通知机制 (Notifications)
  • 流量节省程序(Data Saver)
  • Android框架中提供部分ICU4J API支持
  • 开始支持Java 8
  • Direct Boot(直接启动)
  • VR支持

虽说整个大会的重心偏向了人工智能(Google assistant、Allo&Duo 、Google Home),但Android操作系统作为智能设备的“核心”(Android系统从手表、手机覆盖到电视、汽车,去年有超过600款Android智能手机上市,目前有100款汽车支持Android系统),Android N依旧是I/O大会最为重要看点之一。

Android N新功能汇总

本届I/O开发者大会上,Google发布的新一代的Android系统:Android N(7.0),今年的Android N重点关注了三个维度:分别是性能、安全和生产力。其中性能主要新增了Vulkan API与JIT编译器(前者优化图形性能、或者加快软件安装速度);安全性包括新的数据加密方式、恶意网站识别、系统的实时更新;生产力方面加入了分屏多任务功能、程序的快速切换,所有应用都可以支持“多窗口模式”。当然,也可以通过修改配置,让应用不支持多窗口模式。

Android N新功能最亮点

1、支持Vulkan API

Vulkan是OpenGL的下一代版本,和DirectX 12一样都是基于AMD私有的Mantle API,不同的是Vulkan是开源的图形API。Vulkan API是可以直接操纵GPU的一套3D绘图API.。Vulkan与OpenGl想比占用的GPU更少。游戏开发可以使用更华丽的特效

2、分屏多任务

随着手机的尺寸不断刷新上限,智能手机与平板电脑之间的界限正被不断打破。大尺寸屏幕带来极佳视觉体验的同时,也使人们能够操控的屏幕面积增大了不少。大尺寸屏幕也为实现分屏多任务带来了可能性。

早先只能在PC上实现的分屏多任务,如今可以在智能手机上运行。但不同Android ROM实现该功能的方式不一,对软件的兼容也大有不同,很难使全部APP完美兼容。而Android N新增分屏多任务,除了让第三方ROM开发商可以参照这个模板进行二次开发,软件开发商也能根据Android N分屏多任务功能的实现方式去进行软件的开发。大大加快开发速度,由此支持该功能的软件会更多,兼容性也会更好。

在运行 Android N 的手机和平板电脑上,用户可以并排运行两个App,或者处于分屏模式时一个App位于另一个App之上。对于Android TV设备,应用程序可以将自己置身于画中画面模式,能够继续显示在用户浏览或与其他应用程序进行交互的内容。

开启分屏多任务的方法十分简单。只要进入后台,按住其中一个卡片向上拖动至顶部即可。当然这项功能支持左右与上下分屏,并且可以拖动中间的分割线来调整两个App的比例。

多窗口模式配置

多窗口模式

android:resizeableActivity=["true" | "false"]
 
  • 1
  • 1

在清单文件的 或 节点中设置该属性,启用或禁用多窗口显示:

  • 如果该属性设置为 true,Activity 将能以分屏和自由形状模式启动。
  • 如果此属性设置为 false,Activity 将不支持多窗口模式。
  • 如果该值为 false,且用户尝试在多窗口模式下启动 Activity,该 Activity 将全屏显示。
  • 如果应用未对该属性指定值,则该属性的值默认设为 true。

画中画 
在清单文件的 节点中设置该属性,指明 Activity 是否支持画中画显示。

如果 android:resizeableActivity 为 false,将忽略该属性。

android:supportsPictureInPicture=["true" | "false"]
 
  • 1
  • 1

layout属性

属性 功能描述
<activity> 节点新增的节点,注:处属性应用于画中画模式
android:defaultWidth 以自由形状模式启动时 Activity 的默认宽度
android:defaultHeight 以自由形状模式启动时 Activity 的默认高度
android:gravity 以自由形状模式启动时 Activity 的初始位置
android:minimalSize 分屏和自由形状模式中 Activity 的最小高度和最小宽度


如果用户在分屏模式中移动分界线,使 Activity 尺寸低于指定的最小值,系统会将 Activity 裁剪为用户请求的尺寸。例如:

<activity android:name=".MyActivity">
    <layout 
        android:defaultHeight="500dp"
        android:defaultWidth="600dp"
        android:gravity="top|end"
        android:minimalSize="450dp" />
</activity>  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

3、通知

在Android N中重新设计了通知,可以达到更容易、更快使用的效果。一些主要的变化包括:

模板更新:更新了通知模板重点内容和头像。开发者将能够利用的新模板的优势,在他们的代码中实现最低限度的调整。

捆绑通知:Android N的通知功能也更加人性化,现在会自动将相同应用的通知捆绑在一起,实现分组显示,并且通过两指滑动实现预览,理论上用户可以在通知界面直接阅读邮件等内容。

直接回复:对于实时通信应用程序,Android系统支持在线回复,使用户可以以短信或短信通知界面内快速、直接响应。

自定义视图:两个新的 API 让用户在通知中使用自定义视图。

Android N 开发者预览版的通知系统中还加入了两个全新的 API 接口:Direct Replies 和 Bundling。前者支持为第三方应用的通知加入快速回复和快捷操作,后者则允许同时发出多条通知的应用进行通知拆分。

当一款应用完美的适配了 Android N,当收到一条消息时就可以直接在下拉通知抽屉甚至是锁屏中直接呼出输入框进行回复,或是选择事先设定好的快速处理操作(标记为已读、转发等)。而当用户同时收到来自不同联系人的消息时,可以点击知卡片上的通知拆分按钮对已经合并的通知进行拆分,拆分后的通知可以像其他的独立通知一样进行回复和处理。

当然,现阶段适配了这两个特性的应用屈指可数,除了 Google 的环聊、Messenger 以及 Gmail 等应用以外,目前仅发现第三方 Telegram 客户端 Plus Messenger 支持以上功能。

面对各种应用的通知推送, Android N取以优先级为核心的通知管理方式,而在 Android N中,通知管理也变得更加简单:只需在需要在相应的通知上左右轻扫便能看见一个设置图标,点击该图标就能在通知上方呼出一个简洁的通知优先级设定界面,在这个界面可以将应用通知设定为“静默显示”、“阻拦所有通知”和“默认”三个等级。

如果在”系统界面调谐器 - 其它“中打开了”Show full importance settings”功能,这三个等级又将变为”屏蔽 - 低 - 一般 - 高 - 紧急”5 个,设定的方式也由纵列选项变为左右滑动。这个看似新颖的设计实际上是对现有通知管理操作的一次简化,在 Android 6.0 中需要在两个界面来回跳转才能完成的操作,在Android 7.0只用在一个界面就可以搞定。

同时,Google 也将其对通知优先级的定义从”幕后”搬到了”台前”,在进行完整的五层次优先级设定时 Google 还会提醒不同优先级所对应的通知效果。最后,勿扰模式也在 Android N 中得到了完善,加入了自动规则并允许用户在“请勿打扰”模式下屏蔽静音通知的弹窗甚至是手机的通知指示灯。

发送一个通知

private int i = 0;
private NotificationManager mNotificationManager;
private static final String GROUP_NAME = "com.heima.notification_type";

//[1]获取一个NotificationManager
mNotificationManager = (NotificationManager) getSystemService(
        Context.NOTIFICATION_SERVICE);
//[2]创建一个Notification
//[2.1]需要给这个Notification对象指定icon,标题,内容,
final Notification builder = new NotificationCompat.Builder(this)
        .setSmallIcon(R.mipmap.ic_notification)
        .setContentTitle(getString(R.string.app_name))
        .setContentText("这是一个消息通知")
        .setAutoCancel(true)
        .setGroup(GROUP_NAME)
        .build();
//[3]发送一个通知 需要指定一个Notification对象和一个id,这个id必须是唯一的
mNotificationManager.notify(i++, builder);
updateNotificationSummary(); 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

多个通知放入到一个组内

//[4]创建一个notification组
String notificationContent = "传智播客" + i;
final NotificationCompat.Builder builder = new NotificationCompat.Builder(this)
        .setSmallIcon(R.mipmap.ic_notification)
        .setStyle(new NotificationCompat.BigTextStyle()
                .setSummaryText(notificationContent))
        .setGroup(GROUP_NAME)
        .setGroupSummary(true);
final Notification notification = builder.build();
//[5]发送这个notification组
mNotificationManager.notify(101, notification); 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

可以回复的通知

private NotificationManager mNotificationManager;
//[1]获取一个NotificationManager
mNotificationManager = (NotificationManager) getSystemService(
        Context.NOTIFICATION_SERVICE);
//[2]创建remoteInput对象,这个对象指定了这个notification的标题和一个key
String replyLabel = getResources().getString(R.string.app_name);
RemoteInput remoteInput = new RemoteInput.Builder("heima")
        .setLabel(replyLabel)
        .build();
//[3]创建一个Action对象 可以指定用户一个友好的输入提示,可以指定跳转意图,
Intent deleteIntent = new Intent("");
Notification.Action action =
        new Notification.Action.Builder(R.mipmap.ic_launcher,
                "请输入内容", PendingIntent.getActivity(this, 10002, deleteIntent, 0))
                .addRemoteInput(remoteInput)
                .build();

//[3]创建一个Notification对象
Notification notification =
        new Notification.Builder(this)
                .setSmallIcon(R.mipmap.ic_notification)
                .setContentTitle("传智播客")
                .setContentText("消息通知")
                .addAction(action)
                .build();

//[4]发送这个notification 
mNotificationManager.notify(1, notification);
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
public class MainActivity extends Activity 
    private int i = 0;
    private NotificationManager mNotificationManager;
    private static final String GROUP_NAME = "com.heima.notification_type";
    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    

    public void sendNotification(View v)
        //[1]获取一个NotificationManager
        mNotificationManager = (NotificationManager) getSystemService(
                Context.NOTIFICATION_SERVICE);
        //[2]创建一个Notification
        //[2.1]需要给这个Notification对象指定icon,标题,内容,
        final Notification builder = new NotificationCompat.Builder(this)
                .setSmallIcon(R.mipmap.ic_notification)
                .setContentTitle(getString(R.string.app_name))
                .setContentText("这是一个消息通知")
                .setAutoCancel(true)
                .setGroup(GROUP_NAME)
                .build();
        //[3]发送一个通知 需要指定一个Notification对象和一个id,这个id必须是唯一的
        mNotificationManager.notify(i++, builder);
    

    public void sendGroup(View v)

        //[1]获取一个NotificationManager
        mNotificationManager = (NotificationManager) getSystemService(
                Context.NOTIFICATION_SERVICE);
        //[2]创建一个Notification
        //[2.1]需要给这个Notification对象指定icon,标题,内容,
             final Notification builder = new NotificationCompat.Builder(this)
                .setSmallIcon(R.mipmap.ic_notification)
                .setContentTitle(getString(R.string.app_name))
                .setContentText("这是一个消息通知")
                .setAutoCancel(true)
                .setGroup(GROUP_NAME)
                .build();
        //[3]发送一个通知 需要指定一个Notification对象和一个id,这个id必须是唯一的
        mNotificationManager.notify(i++, builder);


        //[4]创建一个notification组
        String notificationContent = "传智播客" + i;
        final NotificationCompat.Builder builder1 = new NotificationCompat.Builder(this)
                .setSmallIcon(R.mipmap.ic_notification)
                .setStyle(new NotificationCompat.BigTextStyle()
                        .setSummaryText(notificationContent))
                .setGroup(GROUP_NAME)
                .setGroupSummary(true);
        final Notification notification = builder1.build();
        //[5]发送这个notification组
        mNotificationManager.notify(101, notification);

    

    public void send(View v)

        //[1]获取一个NotificationManager
        mNotificationManager = (NotificationManager) getSystemService(
                Context.NOTIFICATION_SERVICE);
        //[2]创建remoteInput对象,这个对象指定了这个notification的标题和一个key
        String replyLabel = getResources().getString(R.string.app_name);
        RemoteInput remoteInput = new RemoteInput.Builder("heima")
                .setLabel(replyLabel)
                .build();
        //[3]创建一个Action对象 可以指定用户一个友好的输入提示,可以指定跳转意图,
        Intent deleteIntent = new Intent(this,MainActivity.class);
        Notification.Action action =
                new Notification.Action.Builder(R.mipmap.ic_launcher,
                        "请输入内容", PendingIntent.getActivity(this, 10002, deleteIntent, 0))
                        .addRemoteInput(remoteInput)
                        .build();

        //[3]创建一个Notification对象
        Notification notification =
                new Notification.Builder(this)
                        .setSmallIcon(R.mipmap.ic_notification)
                        .setContentTitle("传智播客")
                        .setContentText("消息通知")
                        .addAction(action)
                        .build();

        //[4]发送这个notification
        mNotificationManager.notify(1, notification);

    

 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91