面向用户
一.通知
- 新的通知模版
- 聚合通知
- 直接回复
二.快速设置
- 用户:选择自己喜欢的快捷方式!
- 也可以重新排序
- 前五个可以出现在手机的最上面
对于开发者,我们也有机会让自己的应用放在这个快捷设置里面。通过在manifest文件中定义,就可以告诉系统,我们的应用也有一个类似的功能:
<service
android:name=".MyTileService"
android:label="@string/starting_label"
android:icon="android.permission.BIND_QUICK_SETTINGS_TILE">
<intent-filter>
<action android:name="android.service.quicksettings.action.QS_TILE"/>
</intent-filter>
</service>
我们也通过android.service.quicksettings.TileService提供了很多非常丰富的API,让开发者更好的去处理。像:
- onTileAdded()
- onStartListening()
- onStopListening()
- onTileRemoved()
//Get the Tile
Tile tile = TileService.this.getQstile();
//Change the UI of the tile.
tile.setlabel(newLabel);
tile.setIcon(newIcon);
tile.setState(newState);
//need to call updateTile for the tile to pick up changes.
tile.updateTile();
通过上面的代码,我们就可以在应用程序执行的时候,动态设置图标的展示,、说明文字等等,从而让一个静态的快捷方式变成用户容易理解,有上下文得快捷方式
三.Doze(睡眠模式)
Doze模式是在android M版本的时候就已经推出,但是这项功能比较鸡肋,因为在M上它必须要满足三个条件才能开启:
- 关闭屏幕
- 处于非充电状态
- 静止时间超过一定时长(不固定)
但就实际用户体验来讲,真正能同时满足上述三个条件的时间很少,所以,在N中对这一功能进行了加强,详见文档介绍
四.Svelte项目
N版本以前,我们都知道,当系统发生一些时间后,会发送系统广播,例如,网络切换,新增相片,开关机等等。而我们的应用常常会接受这些广播加以处理,比如,手机上很多应用都在沉睡,这时候出现一个系统广播,接收这个广播的应用就会被唤醒,如果应用很多,难免会造成卡顿和费电。那么Google就在N版本推出Svelte项目,去除了以下几个系统广播事件:
- ConnectivityManager.CONNECTIVITY_ACTION
- Camera.ACTION_NEW_VIDEO
- Camera.ACTION_NEW_PICTURE
如果大家以前去监听这几个事件,推荐改为使用JobScheduler去处理这些事件。它的好处就是系统会按照一定的情况,和用户使用的频率来决定该不该告诉你这个通知。
五.数据节省
在M版本也有这种类似的功能,是基于黑名单的,用户可以把一个不喜欢的应用加进去。但是如果用户的应用一多,该功能的使用方式就变得不太实际。所以在N中,我们把黑名单,变成了白名单,如果用户点击下数据节省模式,大部分的应用将被禁止访问网络。
这个时候,就需要我们的开发者进行判断,判断我们的应用是否进入了白名单:
getSystemService(Context.CONNECTIVITY_SERVICE);
ConnectivityManager.isActiveNetworkMetered();
ConnectivityManager.getRestrictBackgroundStatus();
在这里,Google员工吐槽了很多应用的充电锁屏,并呼吁开发者不要滥用充电锁屏的API。
六.直接启动
- 改进启动时间
- 异常重启后的应用打开
如果想让应用支持直接启动,可以在manifest文件中进行配置:
<activity
android:name=".DirectBootActivity"
android:directBootAware="true">
</activity>
<receiver
android:directBootAware="true">
<intent-filter>
<action
android:name="android.intent.action.ACTION_LOCKED_BOOT_COMPLETED"/>
<intent-filter>
</receiver>
这样,当手机重启以后,需要输入密码的时候,可以把你的应用启动起来。当然,系统增加了直接启动功能后,会有一个特殊的地方:N中增加了一个特殊的存储区,这个存储区,只有你的应用声明了上述权限并且是在锁屏状态下才可以访问的。这就需要我们注意,当你的手机进入到正常模式以后,需要开发者手动把锁屏状态下的用户数据取到正常的存储区内。这里我们建议开发者不要将过大过于复杂的数据在特殊存储里面。
Context directBootContext = appContext.createDeciceProtectedStorageContext();
//Access appDataFilename that lives in device encrypted storage
FileInputStream inStream = directBootContext.openFileInput(appDataFilename);
//Use inStream to read content...
android.intent.action.USER_UNLOCKED
七.指定目录访问
在M的时候,我们就加入了运行时权限,当时的运行时权限有8个,其中一个就是文件目录。如果应用想要访问某个文件,需要用户授权,但是用户一旦授权,手机的sd卡的目录还是会全部暴露给应用。那么在N中,我们做了细化,要求应用告诉系统具体想要访问哪个文件夹。
八.Android Work
- Work mode
- Work challenge
Android Work 国内用的不多,但比较像国内的双开。
九.多窗口
多窗口的支持使得我们可以同时打开两个应用,这个对于一些文档编写,聊天的同时看电影的场景提供了方便。开启方式是长按菜单键。同时也加大了研发的难度。之前的研发是基于单窗口,而在多窗口模式下,你需要对它做一些更多的处理,某些缺省情况下,你没有处理的话,可能会出现一些问题。
android:resizeableActivity=["true"|"false"]
<activity android:name=".MyActivity">
<layout android:defaultHeight="500dp"
android:defailtWidth="600dp"
android:minimalHeight="200dp"
android:minimalWidth="200dp"
android:gravity="top|end"/>
</activity>
Activity.isInMultiWindowMode()
Activity.onMultiWindowModeChanged()
Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT
十.Drag and Drop
有了多窗口以后,受影响比较大的就是Drag and Drop。之前的Drag and Drop是在单Activity中处理的,那么现在在多窗口模式下,用户可以从其中的一个Activity把东西拖到另外一个Activity里面。
android.view.DragAndDropPermission
View.startDragAndDrop()
View.DRAG_FLAG_GLOBAL
View.DRAG_FLAG_GLOBAL_URI_READ
View.DRAG_FLAG_GLOBAL_URI_WRITE
View.cancelDragAndDrop()
View.updateDragShadow()
十一.多窗口:画中画
N中,也对Android TV加入了一个新功能:画中画。有了这个功能,你可以在Android TV中预览你想要看的视频。
android.supportsPictureInPicture=["true"|"false"]
Activity.isInPictureInPictureMode()
Activity.onPictureInPictureModeChanged()
Activity.enterPictureInPictureMode()
十二.显示大小
之前版本,用户可以更改字体大小,但是用户更改后,仅仅是字体大小改变了,这样,会显得界面显示上很不协调。在N中,我们不仅能改变字体大小,还能改变显示大小。它不仅可以同比例放大字体,更重要的是可以把整个界面进行同比例缩小放大。
十三.多语言设置
- 用户可以选择多语言(并且排序)
- Also added new languages,variants Android是面向全球化的,之前的语言源代码是分成两部分,国家——语言,而这样的匹配方法相对简单粗暴,就是说是整个字符串必须是完全匹配一致的,才会使用当前的语言,否则会顺序向下找。而有了多语言设置之后呢,系统会直接去找离得最近的语言。这样用户只要拖拽想要显示的语言置顶,系统就可以直接更改。所以我们编程的时候,需要大家去处理一下,系统可以这样做,我们的应用也可以这样做。