- 更新或者移除不合适的资源
- 在Notification里系统自动倒置操作图标,使用android.app.Notification.Builder.setColor()在你图标后的圆圈里设置一个颜色。
- 在操作图标和主要的Notification图标里,系统忽略所有无透明度的面板,你应该假设所有的图标都是有透明度的
如果你最近使用Ringtone.MediaPlayer或者Vibrator类添加声音和振动在你的Notification里,移除这些代码,因为系统现在是不被打扰模式,改为使用Notification.Builder方法添加Sounds和Vibrator。
当设备处于激活状态时(设备没有被锁住和屏幕开启),Notification出现在一个小的浮动窗口(也被称为heads-up Notification),这些Notification以紧凑的形式出现,除了heads-up notification,显示操作按钮。用户可以在不离开当前界面的情况下接受或者取消。
如果你的App使用远程控制客户端(RemoteControlClient)
在Android L 开发者预览版里,锁屏不会显示对RemoteControlClient的传输控制,反而是你的App可以在锁屏界面通过Notification提供视频的回放控制,这给予你的App展现更多的控制视频按钮,给予用户在锁屏和解锁设备上始终如一的体验。
Android L 开发者预览版介绍一种新的android.app.Notification.MediaStype模板,目的是使用Notification.Builder.addAction在你的App 视频回放Notification里添加简洁的按钮。
如果你使用新的android.media.session.MediaSession类,附上你的会话令牌在Notification.MediaStyle.setMediaToken()来确认系统在Notification上控制视频会话。
调用Notification.Builder.setVisibility(Notification.VISIBILITY_PUBLIC)来标记Notification安全的显示在任何锁屏上,更多的信息可以查看Lockscreen Notifications。
如果你的App使用ActivityManager.getRecentTasks()
随着新的并发文档和Activity 任务特性在即将发布的版本上介绍,ActivityManager.getRecentTask()方法现在被废弃来保护用户隐私。为了向后兼容,这个方法仍然会返回一个小的数据子集,包含调用程序自己的任务和一些其他的非敏感任务。如果你的App使用这个方法来取回自己的任务,使用andro.app.ActivityManager.getAppTask()来获取这些信息。
用户界面
材料设计支持(Meterial Design)
在即将发布的版本中,添加对Android最新的材料设计风格的支持,你可以使用材料设计来开发app,动态的视觉化和拥有UI元素的转换使用户感觉非常的自然化,这些支持包括:
- 材料主题
- 视图阴影
- RecyclerView Widget
- 可拉动画和视觉效果
- 材料设计动画和Activity切换效果
- 基于视图状态的视图参数动画
- 可定制的UI Widget和带有你控制的颜色调色板的App栏
想了解更多的新增材料设计功能,可以查看 Material Design.
锁屏通知(Notifications)
在L开发者预览版中,锁屏可以呈现Notification,用户可以通过设置来选择是否允许在锁屏显示敏感Notification内容。
当Notification呈现在锁屏上时,你的app可以控制可见详情权限,调用android.app.Notification.Builder.setVisibility()
来控制可见权限,其中设置值包括:
- VISIBILITY_PRIVATE,显示基本信息,例如Notification图标,隐藏Notification全部内容
- VISIBILITY_PUBLIC,显示Notification全部内容
- VISIBILITY_SECRET,不显示任何内容,包括Notification图标
当设置VISIBILITY_PRIVATE时,你可以提供已经编辑过的隐藏个人详情的Notification,例如,一个SMS app可能呈现一条Notification显示“你有3条新的短信”,但是隐藏短信内容和发送者。呈现这种替代方案的Notification,首先使用Notification.Builder创建更换Notification,当你创建私人的Notification对象,使用Notification.Builder.setPublicVersion()方法附加到它上面的更换通知
通知(Notification)元数据
Android L 开发者预览版使用与你的App Notification相关的元数据来更智能的排列,设置元数据,当初始化你的Notification时,可以使用在android.app.Notification.Builder里的这些方法:
- setCategory():根据消息分类,当设备处于非打扰模式时,告诉系统如何处理你的App Notification。
- setPriority():如果Notification有声音或者振动,设置优先级为PRIORITY_MAX或者PRIORITY_HIGH的Notification将会出现在小的浮动窗口上。
- addPerson():允许你添加人列表到Notification,你的app可以使用这些来暗示系统将这些人集中在一起通知,或者通知这些人是很重要的。
在最近界面的并发文档和Activitys
在上一个版本中,最近的界面在每个app中只呈现用户最近使用的单任务,现在您的应用程序可以打开更多任务所需的额外并发活动文档。此功能通过让用户快速的在个人活动和历史屏幕之间切换,所有应用程序切换体验一致。这种并发任务的示例可能包含 web 浏览器应用程序中打开的选项卡,在效率app中的文档,在游戏中的并发比赛或者是在短信app中的聊天信息。你的app可以通过android.app.ActivityManager.AppTask类来管理它的任务。
当使用startActivity()加载activity时,使用android.content.Intent.FLAG_ACTIVITY_NEW_DOCUMENT
插入一个逻辑跳出以便系统可以把你的activity作为一个新的任务,你也可以通过在清单文件中定义<activity>属性documentLaunchMode="intoExisting"
或者"always"来获取这种效果。
你也可以标记,当所有的activity关闭时,从历史记录中删除该任务。当开启任务的顶部activity,使用
android.content.Intent.FLAG_ACTIVITY_AUTO_REMOVE_FROM_RECENTS,你也可以通过在清单文件里设置<activity>属性autoRemoveFromRecents=“true”来实现该效果。
为了避免弄乱的历史屏幕,您可以在该屏幕中显示设置任务的最大数目,使用 <application> 属性 android:maxRecent来设置,可以设置的最大任务数量是每个用户100个。
WebView更新
在Android L 开发者预览版中,更新WebView支持Chromium M36,带来安全和稳定性的增强,并且修复了大量的bug。运行在L 开发者预览版的WebView 默认用户代理已经更新到36.0.0.0版本号。
此外,最新版本将带来对WebAudio、WebGL和WebRTC 开放标准的支持。了解更多关于这些的特性,可以查看 WebView for Android。
图像
对OpenGL ES 3.1的支持
Android L开发者预览版添加对OpenGL ES3.1的Jave 接口和Native支持,在OpenGL ES3.1上关键新功能的支持包括:
- 计算做色器
- 分离做色器对象
- 间接绘画指令
- 多重采样和纹理模板
- 做色语言改进
- 先进的混合模式和调试的扩展
- 对OpenGL ES2.0和3.0的向后支持
OpenGL ES3.1 Java接口支持GLES31,当使用OpenGL ES 3.1,请确认你在Mainfest文件进行声明<uses-feature>标签和android:glEsVersion属性,例如:
<manifest>
<uses-feature android:glEsVersion="0x00030001" />
...
</manifest>
关于更多的信息,可以查看 OpenGL ES API guide.
Android扩展包
除了OpenGL ES 3.1,新版本将提供支持先进图像功能的扩展包,这些扩展会被作为一个单独的包。
这个扩展包支持:
- 保证片段着色器支持着色器存储缓冲区,图像,和原子(片段着色器支持在OpenGL ES3.1是可选的)
- 棋盘花纹和几何着色器
- ASTC(LDR)纹理压缩格式
- 插值和阴影的预先样式
-
扩展包Java 接口提供GLES31Ext,在你的清单文件中,你可以需要声明扩展包的支持,使用<user-feature>标签,但具体的语法在L 开发预览版里还没有确定下来
多媒体
先进的照相功能的API
L 开发者预览版介绍新的android.hardware.camera2 API促进精密照片捕捉和图像处理。现在你可以通过编程方式使用CameraManager.getCameraIdList()访问摄像机设备对系统可用,使用CameraManager.openCamera()连接指定设备。捕捉照片,创建CameraCaptureSession和对捕捉照片指定Surface对象,CameraCaptureSession可以配置采取单一的镜头或多个图像。
需要注意的是,当新的照片被捕获时,实现CameraCaptureSession.CaptureListener()接口和设置你的捕获请求,当你的系统完成照片捕获请求时,CameraCaptureSession.CaptureListener()接收到回调onCaptureCompleted(),在CaptureResult里提供给你照片捕获元数据
看如何使用最新的Camera API例子,在最新的版本里查看Camera2Basic和Camera2Video实现案例
音频回放
最新的版本包括以下的AudioTrack改变
- 你的App提供浮点格式的音频数据(android.media.AudioFormat.ENCODING_PCM_FLOAT),这允许更大的动态范围,更加一致的精度和更大的回旋空间。在中间计算浮点算术尤其有用。回放终点使用整数格式音频数据
- 你的App提供ByteBuffer音频数据,由MediaCodec提供相同的格式。
- 在某些App里,WRITE_NON_BLOCKING选项可以简化缓冲和多线程
视频回放控制
你可以使用最新的android.media.session.MediaController类构建属于你自己的视频控制App,提供简化的传输控制APIs来替换RemoteControlClient。MediaController类允许在非UI线程以线程安全的形式控制回放,使在你的app用户界面可以非常容易的控制你的视频回放服务。
你也可以创建多控制器发送回放指令,或者其他和android.media.session.MediaSession类似的事件。当你添加一个控制器时,你必须调用MediaSession.getSessionToken()来请求一个访问令牌,以此使你的app与回话进行交互
你现在可以使用MediaController.TransportControls发送传输指令,例如"play","stop","skip"和"set rating"。处理主动的媒体传输命令控制器连接到会话,重写MediaSession.TransportControlsCallback回调方法
存储
目录选择
L开发者预览版扩展 Storage Access Framework 来让用户选择一个实体目录子数,每项不需要请求用户的确认,给予app对所有的文档读/写权限
选择目录子树,构建和发送 android.intent.action.OPEN_DOCUMENT_TREE
Intent 系统展现所有的支持子树选择的
DocumentsProvider实例,使用户浏览并且选择目录。返回的URI表示访问选定的子树,你可以使用DocumentsContract.buildChildDocumentsUriUsingTree()
和DocumentsContract.buildDocumentUriUsingTree()
,ContentResolver.query()来探索子树
新的DocumentsContract.createDocument()
方法允许您创建新文件或目录下的子树。管理已经存在的文档,使用 DocumentsContract.renameDocument()
和DocumentsContract.deleteDocument()
,在发行之前检查
DocumentsContract.Document.COLUMN_FLAGS来
验证提供者对这些调用的支持。
如果你实现 DocumentsProvider,希望支持子树选择,实现
DocumentsProvider.isChildDocument()和在你的
Root.COLUMN_FLAGS里
包括 Documents.Contract.FLAG_SUPPORTS_IS_CHILD
.
无线和连接
多网络连接
L开发者预览版提供新的多网络APIs,让你的App动态搜索有效网络,并且建立连接。这在你的app需要特定网络时非常有用,例如SUPL、MMS或者载波广告网络,或者当你希望使用特定类型的传输协议发送数据
通过以下几步动态选择和连接网络:
- 创建
ConnectivityManager
- 创建android.net.NetworkRequest对指定的网络和传输你的app需要的类型
- 搜索合适的网络,调用 ConnectivityManager.requestNetwork()或者ConnectivityManager.registerNetworkCallback(),传入NetworkRequest 和实现ConnectivityManager.NetworkCallbackListener接口
当系统查出一个合适网络时。就会连接该网络,回调NetworkCallbackListener.onAvailable(),你可以在回调中使用android.net.Network对象,获取附加的关于该网络的信息,或者直接使用选择的网络
蓝牙广播
Android4.3介绍对 Bluetooth Low Energy (BLE)平台支持,在L开发者预览版中,一个Android设备可以充当Bluetooth LE 外围设备角色。Apps 可以使用该功能使他们的存在被周围的设备所了解。例如,你可以构建apps,允许一个设备作为一个计步器、健康监控,与其他的BLE设备进行通信
这个新的android.bluetooth.le APIs使你的apps广播广告,搜索响应,和周围的BLE设备进行连接,你必须在清单文件里添加android.permission.BLUETOOTH_ADMIN权限来使用新的广告和搜索特性开启蓝牙LE广告以便使其他的设备能够发现你的app,调用android.bluetooth.le.BluetoothAdvertiser.startAdvisertising(),实现android.bluetooth.le.AdvertiseCallback 类,这个回调对象接受广播操作成功或者失败的结果。
L开发者预览版介绍 android.bluetooth.le.ScanFilter 类以便你的app可以搜索感兴趣的特定类型设备。开启搜索蓝牙LE设备,调用android.bluetooth.le.BluetoothLeScanner.startScan(),传入过滤器列表,在这个方法的调用,如果蓝牙LE广告没有被发现,你必须实现android.bluetooth.le.ScanCallback来获取结果
NFC增强功能
L开发者预览版添加这些增强功能来使NFC使用更灵活和广泛
- Android Beam现在在分享按钮中是可用的
- 通过调用android.nfc.NfcAdapter.invokeBeam(),你的app可以在用户的设备里调用Android Beam来分享数据。这就避免了用户需要手动点击设备来完成与另一台NFC设备完成数据传输
- 你可以使用新的
android.nfc.NdefRecord.createTextRecord()
方法来创建包含UTF-8数据的NDEF
- 如果你正在开发一款付款app,你现在通过调用 android.nfc.cardemulation.CardEmulation.registerAidsForService(),有能力动态注册一个NFC 应用ID(AID)来设置首选卡模拟服务,当一个特定的activity在后台运行时,它将被使用。
电源效率
调度工作
L开发者预览版提供新的android.app.job.JobScheduler
API,在之后或者特殊条件下,通过定义系统工作来异步运行,
以此让你优化电源生命周期。在这些情况下非常有用:
- 该app有可以延后执行的无用户界面的工作
- 该app有你希望单位时间插入的工作
- 该app有需要网络访问(或者需要WIFI连接)的任务
- 该app有大量的你希望定期运行的任务
工作单位被封装在 android.app.job.JobInfo对象,
这个对象提供了一个精确的描述标准用于调度。
使用android.app.job.JobInfo.Builder来设置调度任务如何运行,你可以调度该任务运行在特殊的情况下,例如:
- 该设备正在充电
- 该设备连接无计量网络
- 该系统认为该设备空闲
- 延迟或在一个特定的期限完成
例如,你可以像这样添加代码在计量网络运行你的任务:
<span style="font-family:Microsoft YaHei;font-size:14px;">$ adb shell dumpsys batterystats --charged <package-name>
</span>
Battery Historian
Battery Historian工具分析Android bug报告,创建一个可视化相关活动HTML页面,它还可以可视化电力监控能耗数据,并试图映射用电使用统计数据,你可以在 <sdk>/tools找到
Battery Historian
为了更好的结果,你应该首先使设备处于锁屏状态,以此让Battery Historian工具监控不间断一段时间
<span style="font-family:Microsoft YaHei;font-size:14px;">$ adb shell dumpsys batterystats --enable full-wake-history
</span>
你应该在测量的开始重置电源统计数据
<span style="font-family:Microsoft YaHei;font-size:14px;">$ adb shell dumpsys batterystats --reset
</span>
生成HTML可视化
<span style="font-family:Microsoft YaHei;font-size:14px;">$ historian.par [-p powerfile] bugreport.txt > out.html
</span>
企业级支持
管理配置
L开发者预览版为企业级环境运行的app提供新的功能。一个设备管理者可以在设备里初始化一个管理线程来添加共在并且独立管理概要,如果用户已经拥有一个存在的私人账户,与托管配置文件相关联的应用程序将会出现在非托管应用程序在用户的Launcher、 最近的应用程序屏幕和通知上。通过在Intent上发送ACTION_PROVISION_MANAGED_PROFILE 来开启管理线程,如果返回时成功的,系统会调用android.app.admin.DeviceAdminReceiver. onProfileProvisioningComplete() 回调,你可以调用app.admin.DevicePolicyManager. setProfileEnabled()开启管理
如果你开发一款Launcher App,你可以使用最新的android.content.pm.LauncherApps类来获取Launcher Activitys列表,你的Launcher可以使托管应用程序视觉上突出通过附加一个使用android.os.UserManager. getBadgeDrawableForUser().绘制的"工作"的徽章。
要查看如何使用新功能的示例,请参阅在此版本中的 BasicManagedProfile 实现示例。
任务锁定
L开发者预览版包括一个新的任务锁定API让你临时限制用户离开你的app或者被Notification打断,在这些情况下被使用,例如,如果你正在开发一款教育app,支持高风险评估,一旦你的app计划这种模式,用户将不会看到其他app发送的Notification,直到返回Home界面或者你的app退出该模式
以防止未经授权的使用,只有经过授权的应用程序可以激活任务锁定。此外,任务锁定必须由特殊配置设备拥有的app授权,通过
android.app.admin.DevicePolicyManager.setLockTaskComponents()
方法。
建立一款设备的拥有者,需要做一下几步:
- 附加一个设备到你的开发机器运行 Android userdebug。
- 安装你的设备拥有的app
- 创建device_owner.xml文件并且保存到你设备里的/data/system目录下
<span style="font-family:Microsoft YaHei;font-size:14px;">$ adb root
$ adb shell stop
$ rm /tmp/device_owner.xml
$ echo "<?xml version='1.0' encoding='utf-8' standalone='yes' ?>"
>> /tmp/device_owner.xml
$ echo "&device-owner package=\"<your_device_owner_package>\"
name=\"*<your_organization_name>\" />" >> /tmp/device_owner.xml
$ adb push /tmp/device_owner.xml /data/system/device_owner.xml
$ adb reboot
</span>
在你的app使用任务锁定API之前,通过调用DevicePolicyManager.isLockTaskPermitted()
.来检测你的activity是否被授权
在你被授权的activity里调用android.app.Activity.startLockTask()来激活任务锁定
当任务锁定被激活时,下面的行为将会产生影响:
- 状态栏是空白的,用户的Notification和状态栏信息时被隐藏的
- Home和最近的Apps按钮是被隐藏的
- 其他apps不会被加载新的activity
- 当前应用程序可能会启动新的活动,只要这样做不会创建新的任务。
- 用户仍然被锁定在你的app,直到一个被授权的activity调用
Activity.stopLockTask()
.
印刷框架
以位图的形式呈现PDF
你现在可以使用新的android.graphics.pdf.PdfRenderer类以位图的形式呈现PDF文档,你必须指定一个系统写入可打印内容的
ParcelFileDescriptor,你的app可以通过openPage()获取一页,然后调用render()来将打开的PdfRenderer.Page变为一个位图,如果你想将文档的一部分转换为位图,也可以设置额外的参数。
测试和可访问性
测试和可访问性的改进
L开发者预览版添加以下的测试和可访问性支持:
- 你可以使用新的android.app.UiAutomation.getWindowAnimationFrameStats()和
android.app.UiAutomation.getWindowContentFrameStats()
方法捕获帧统计信息的窗口动画和内容,这允许您编写仪器仪表测试来评估
测试应用程序是否渲染帧在足够的刷新频率,提供流畅的用户体验。
- 你可以在测试框架里使用新的android.app.UiAutomation.executeShellCommand()执行命令,该命令的执行与连接设备运行adb shell非常类似,允许你使用基于工具的shell,例如
dumpsys
,am
, content
, 和pm
.
- 辅助功能服务和使用的辅助功能 Api(如 uiautomator) 可以检索有关的详细信息的 windows 属性在正常用户的屏幕上的测试工具可以交互。调用android.accessibilityservice.AccessibilityService.getWindows()方法来检索android.view.accessibility.AccessibilityWindowInfo 对象列表呈现 windows 信息
你可以使用新的android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction接口来定义要在
AccessibilityNodeInfo
执行的标准或者自定义操作。新的AccessibilityAction类替换之前的
AccessibilityNodeInfo
.相关接口
输入法
输入语言之前的便捷切换
在L开发者预览版开启时,用户可以非常便捷的在所有的输入法编辑器(IME)中切换,执行指定的切换操作(通常触碰一个在软键盘的全局图标)将在所有的IMEs里循环,这些变化发生在
InputMethodManager.shouldOfferSwitchingToNextInputMethod()
.
除外,该框架会检测下一个输入法是否包含切换机制,一个拥有切换机制的输入法不会循环到没有该机制的输入法。该改变将发生在InputMethodManager.switchToNextInputMethod
.
查看如何使用最新的IME-切换APIs的例子,请参阅在此版本中更新的软键盘实现示例。
清单声明
需要声明的特性
现在支持以下值< uses-feature >元素,你可以确认你的app只被支持这些你的app需要特性的设备安装
FEATURE_LEANBACK,声明你的app智能被支持Android接口的设备所安装,例如
<uses-feature android:name="android.software.leanback"
android:required="true" />
FEATURE_WEBVIEW
,声明你的设备只能被实现所有
android.webkit.*APIs的设备所安装,例如
<span style="font-family:Microsoft YaHei;font-size:14px;"><uses-feature android:name="android.software.webview"
android:required="true" />
</span>