原文:http://android.eoe.cn/topic/summary
翻译:【eoeAndroid原创团队】kris、流风而逝、贼寇在何方、snowxwyo、lsy4833406
更新日期:2012-06-28
Android 4.1 (Jelly Bean)发布了,这次发布包含了一些性能及用户体验上面的优化。也为用户和开发人员添加了一些新的功能。本文主要介绍了一些对于开发人员来说比较关注或者说有用的api。
对于应用开发人员来说,Android 4.1里面包括了SDK编译包(可以编译你应用程序用于在android 4.1平台上面运行),和一个可以在模拟器中运行的系统镜像。开发人员应该尽快下载SDK编译包及系统镜像,并且在Android 4.1平台上面编译与测试你的应用程序。如果想在Android 4.1平台上面从事开发和测试工作,请使用Android SDK Manager来下载相关的最新内容。
隔离服务 - Isolated services
通过指定的[http://developer.android.com/guide/topics/manifest/service-element.html#isolatedandroid:isolatedProcess=true]中的"<service>标签,您的Service将在没有自身权限的被隔离的用户ID进程下运行。
内存管理 - Memory management
新的ComponentCallbacks2常数,例如TRIM_MEMORY_RUNNING_LOW和TRIM_MEMORY_RUNNING_CRITICAL在系统调用onLowMemory())方法之前就提供前台进程的内存状态。
新的getMyMemoryState(ActivityManager.RunningAppProcessInfo))方法允许您直接查询一般的内存状态。
Content providers
一个新的方法,acquireUnstableContentProviderClient())允许您可能以一种“不稳定”的方式访问ContentProviderClient以至于如果这个content provider在工作,你的应用就不会崩溃。当你在用content provider在一个单独应用交互的时候这个方法很有用。
动态壁纸 - Live Wallpapers
新的intent协议直接启动动态壁纸预览的activity来帮助用户在不需要强迫离开您的程序就能简单地选择动态壁纸并且通过手机壁纸选择器进行导航。
为了启动这个动态壁纸选择器,通过一个使用ACTION_CHANGE_LIVE_WALLPAPER的intent和额外的一个以EXTRA_LIVE_WALLPAPER_COMPONENT作为您指定的动态壁纸ComponentName的一个字符串来调用[startActivity()]方法
应用程序堆栈导航 - App stack navigation
Android4.1采用了更容易的实现向上导航的设计模式。你所需要做的就是在你的manifest文件之中把android:parentActivityName增加到每个元素中去。这个系统通过该信息在当用户按操作栏中向上按钮(同时也完成当时的activity)来打开相应的活动。所以如果您为每一个activity都声明了android:parentActivityName,您就不需要用onOptionsItemSelected())这个方法处理点击操作栏的应用程序事件图标————现在的系统处理这一事件,并恢复或建立适当的活动。
在某些特定情况之下,当用户通过一个“深潜”的intent进入你到您应用中的某一个activity就好像从其它应用程序的一个通知或者意图中进入(就如设计指南中描述应用程序之间的导航那样)。当用户以这样的方式进入您的activity,您的程序也许会有不自然的回栈的activity可以用来恢复用户导航。然而,当您为您的activities提供android:parentActivityName这个属性,系统会识别您的程序是否包含了返回堆栈的父类activities,如果没有,系统将会为您的程序构建一个人工合成的返回堆栈包含所有的父类activities。
注意:当用户进入您应用中的一个深度的activity时并且在您的应用程序中创建一个新的任务,系统实际上是将父类activities的的堆栈插入到这个任务中。正因为如此,按下“Back”按钮也从父类的activities堆栈中导航返回。
当系统为您的应用程序创建一个合成的回栈,它也有个基本的Intent来为每一个父类activity来创建一个新的实例。所以它没有像你期望的那种以用户自然的通过每一个activity来进行导航的方式为父类的activities保存状态。如果任何的父类activities通常显示一个依赖于用户将要丢失的上下文的界面,那么您应该在用户从堆栈中导航返回的时候记录下来。例如,如果一个用户正在一个音乐的应用中浏览一个专辑,导航也许会为带他进入到一个列选选定的音乐流派的所有专辑的activity。在这种情况之下,如果必须创建堆栈,您很有必要通知这个父类的activity当前的这个专辑属于什么流派,以此来让这个activity显示正确的列表就好像用户确实是从原来那个activity过来的一样。为了在一个合成的父类的activity中实现这些信息,您必须重写这个onPrepareNavigateUpTaskStack())方法。该方法为您提供了一个TaskStackBuilder对象以供系统创建来合成父类的activities。这个TaskStackBuilder对象包含系统用来创建每个父类的activity的Intent对象。在您实现
onPrepareNavigateUpTaskStack())的方法的时候,你可以修改对应的Intent来增加额外的数据使父类activity能够用来决定对应的上下文和显示相应的界面。
当系统创建了这个TaskStackBuilder类之后,它会增加用来创建那些在他们逻辑顺序从activity树顶端开始的父类activities的Intent对象。因此,最后添加到内部数组的的Intent就是当前活动的直接父类。如果你想为这个activity的父类修改这个Intent,首先要通过[http://developer.android.com/reference/android/app/TaskStackBuilder.html#getIntentCountgetIntentCount]方法来确定这个数组的长度并且将值放在[http://developer.android.com/reference/android/app/TaskStackBuilder.html#editIntentAt(int)editIntentAt]方法之中。()
如果您的应用程序结构比较复杂,还有一些其他可用的APIs来帮助你处理向上导航的行为以及完全定制合成的回栈。这些APIs中的一部分还给你一些额外的控制包括:
重写这个方法是为了当用户按下“UP”按钮时定义一些自定义的操作。
调用该方法是为了结束当前的activity并且跳到根据提供的Intent所显示的那个activity上去。如果这个activity在回栈中存在,但是不是最近的一个父类,那么所有在当前activity和指定activity之间的其它的activities也全部结束。
调用这个方法类获得启动在逻辑上是当前activity的父类的Intent。
调用此方法是用来查询一个合层的回栈是否必须为了导航来创建。如果一个合成的栈需要被创建就返回true,如果该堆栈存在就返回false。
调用该方法是为了结束当前的activity和所有与当前activity有相同任务关系的所有父类activities。如果你重写了默认的行为例如onNavigateUp(