当前位置: 编程技术>移动开发
本页文章导读:
▪URL示意举例 URL表示举例
URL的规范定义RFC 2396
其中在J2ME开发时,涉及到Connector.open(url)
下面列举这些url的例子:
清单 1. 调用基于 HTTP 的通信Connection conn = Connector.open(http://www.yahoo.com);清单 2. 调用基于流的.........
▪ OPhone自动化测试技术引见 OPhone自动化测试技术介绍
OPhone自动化测试技术介绍OPhone自动化测试技术介绍 OPhone平台除了为应用程序开发提供了丰富的API外,同时也为开展自动化测试提供了多种途径。本文将对OPhone平.........
▪ Application Fundamentals-Processes and lifecycles(历程生命周期) Application Fundamentals--Processes and lifecycles(进程生命周期)
Processes and lifecycles---进程生命周期 The Android system tries to maintain an application process for as long as possible, but eventually it will need to remove old.........
[1]URL示意举例
来源: 互联网 发布时间: 2014-02-18
URL表示举例
URL的规范定义RFC 2396
其中在J2ME开发时,涉及到Connector.open(url)
下面列举这些url的例子:
清单 1. 调用基于 HTTP 的通信
Connection conn = Connector.open(http://www.yahoo.com);
清单 2. 调用基于流的套接字通信
Connection conn = Connector.open("socket://localhost:9000");
清单 3. 调用基于数据报的套接字通信
Connection conn = Connector.open("datagram://:9000");
清单 4. 调用串口通信
Connection conn = Connector.open("comm:0;baudrate=9000");
清单 5. 调用文件 I/O 通信
file:///root1//work/packet.xml 模拟器调试
file:///SD//packet.xml 访问SD卡
[2] OPhone自动化测试技术引见
来源: 互联网 发布时间: 2014-02-18
OPhone自动化测试技术介绍
OPhone自动化测试技术介绍
OPhone自动化测试技术介绍
OPhone平台除了为应用程序开发提供了丰富的API外,同时也为开展自动化测试提供了多种途径。本文将对OPhone平台上可采用的几种自动化测试技术进行介绍,并对每种技术的优缺点做简要的总结。
基于JUnit+Instrumentation框架的自动化测试
OPhone平台中整合了JUnit测试框架和Instrumentation机制。图1是JUnit+Instrumentation自动化测试框架的架构图。
JUnit是广泛应用于Java程序开发中的单元测试框架。它定义了特定格式的方法做为测试用例,提供TestSuite测试套件和TestRunner测试执行器分别用于组织测试用例和运行测试用例并反馈测试结果。
Instrumentation则是一种操作系统和上层应用程序之间的监控机制。当应用程序运行时,若Instrumentation设置为开启,它将在应用程序运行前初始化,与应用程序运行在同一个进程中,监测应用程序与系统之间的交互,并可以对应用程序进行一定的控制,例如,监控应用中各Activity的调用情况,启动和结束Activity,对Activity生命周期中的各个状态进行切换,甚至可以向Activity发送按键事件和字符。
为了可以更加便捷的进行自动化测试,如图2所示,OPhone平台利用Instrumentation对JUnit框架进行扩展。
经过这样的扩展,框架的易用性得到了提高。举例来说,假设AppActivity是某应用的一个Activity,我们想测试AppActivity界面上的一些功能,可以实现一个ActivitityInstruemtationTestCase2<AppActivity>的子类,当这个子类运行时,AppActivity就会自动启动,而省去了通过Intent等手动启动的步骤。
更重要的是,扩展后原有的JUnit单元测试被赋予了更多的功能。例如,用AndroidTestCase.getContext()、Instrumentation.getTargetContext()等方法就可以在测试代码中得到测试程序和被测应用程序的Context,进而访问到资源文件,因此该框架特别适合用来做
OPhone应用的单元测试。
如果我们再利用Instrumentation模拟用户从图形界面发起的诸如点击或拖拽屏幕、输入字符、选择菜单项等操作,就可以实现自动化功能测试甚至系统测试。与数据库操作和View操作配合使用后,这种自动化测试能够实现与测试人员的手动测试具有同样的效果。
下面就是一段基于JUnit+Instrumentation框架对记事本应用进行测试的自动化测试代码:
public void testInsertSaveNum() throws Exception {
String TEST_TITLE = "Add-Save Number";
String TEST_NOTE = "Note";
//启动NotesList
mNotesList = (NotesList) mInstrumentation.startActivitySync(mIntent);
//调用NotesList界面菜单中的“添加”选项
mInstrumentation.invokeMenuActionSync(mNotesList, NotesList.INSERT_ID, 0);
mInstrumentation.waitForIdleSync();
//此时转到了NoteEditor界面,利用ActivityMonitor来得到NoteEditor对象
mNoteEditor = (NoteEditor) waitForActivity(mNoteEditorMonitor);
SystemClock.sleep(waitTime);
//在标题栏和内容栏输入内容
inputTitleNote(TEST_TITLE, TEST_NOTE);
//调用NoteEditor界面菜单中的“保存”选项
mInstrumentation.invokeMenuActionSync(mNoteEditor, SAVE_ID, 0);
mInstrumentation.waitForIdleSync();
SystemClock.sleep(waitTime);
//此时应用程序转回到NotesList界面,取ListView并校验数量
mNotesListView = (ListView) mNotesList.getListView();
assertTrue("fail to add and save a note",mNotesListView.getCount() == 1);
}
JUnit和Instrumentation相结合,既充分发挥了JUnit在测试用例开发、组织等方面的特点,又提供了对应用程序进行控制的有效途径。
本部分内容设定了隐藏,需要回复后才能看到
步骤 动作
1 Window Manager 收到来自于linux键盘驱动的按键事件。
2 Window Manager 把scancode映射成keycode。
3 Window Manager 把 scancode和keycode都发给应用程序。
4 应用程序对按键事件进行响应。
OPhone平台还提供了功能丰富的开发调试工具和工具库,如adb、sqlite3、viewserver和ddmlib等,这些为我们探索新的自动化测试方法提供了技术基础。
像上述的键盘事件,我们就可以通过adb shell input命令发送给设备,同时我们也可以通过adb shell sendevent命令实现对触摸屏的操作。例如,想实现这样的过程:一、进入DCD应用的主界面;二、用向左滑动的触摸屏手势做翻页操作;三、调起该界面的菜单;四、退出DCD主界面,就可以用如下命令实现:
//启动DCD主界面
adb shell am start -n oms.dcd/oms.dcd.DcdClient
//在x向坐标00000095、y向坐标00000007的位置点击屏幕,并保持按下状态
adb shell sendevent /dev/input/event0: 0003 0000 00000095
adb shell sendevent /dev/input/event0: 0003 0001 00000007
adb shell sendevent /dev/input/event0: 0001 014a 00000001
//保持y向坐标不变,沿00000055到00000010的x向路径横向滑动
adb shell sendevent /dev/input/event0: 0003 0000 00000055
adb shell sendevent /dev/input/event0: 0000 0000 00000000
……
adb shell sendevent /dev/input/event0: 0003 0000 00000010
adb shell sendevent /dev/input/event0: 0000 0000 00000000
//结束按下状态
adb shell sendevent /dev/input/event0: 0001 014a 00000000
//发送一个菜单键值,调起菜单
adb shell input keyevent 1
//发送一个Back键值,收回菜单
adb shell input keyevent 4
//再发送一个Back键值,退出DCD界面
adb shell input keyevent 4
如果把这样的方法应用到具体测试用例上,那么就是一个完整的自动化测试过程了。
而对于需要操作数据库的情况,可通过adb shell sqlite3命令实现。
不过测试必须有检验结果的校验点才行。这里可以使用图像识别的方式进行结果的校验。识别可以采用两种方法:
1、利用系统viewserver中提供的接口获得当前界面上控件的属性信息,通过对比测试前后属性信息的变化进行结果校验;
2、利用ddmlib包中提供的接口自动截取测试前后的屏幕截图,通过对比两幅截图相同位置的图像信息是否存在差异来进行结果校验。
以上是基于键盘事件和图像识别的自动化测试方法的基本原理。在实际实现过程中,还需要做大量的工作,如提供友好的用户使用界面、提供更简单易懂的脚本格式、支持循环或分支等复杂的测试逻辑、支持更复杂的触摸屏操作、实现多设备互通及交互操作、支持测试结果的自动生成等。
这种自动化测试的实现方式不受系统应用程序进程间安全机制的限制,突破了JUnit+Instrumentation框架下自动化测试不易跨应用测试的限制,而且也能实现多部终端的交互操作,为实现交互性系统测试的自动化提供了,同时也非常适合于替代重复性的压力测试类型的手动测试。
该方式的缺点是:首先,获取屏幕信息时存在时延,测试执行起来的效率会降低。第二,如果大量采用基于屏幕坐标上的触摸屏点击操作,需要维护多套测试脚本已适应不同屏幕分辨率的产品。第三,与UI实现紧耦合,如果应用的UI设计变化,则需同步修改测试用例甚至重新设计测试用例。
基于OPhone API的自动化测试
OPhone平台开放的API中,很多都适合于开发测试程序。如利用ContentResolver可以操作应用的数据库,利用Graphic、Media、OpenGL等包中提供的接口可以实现对图片编解码、音视频媒体编解码、图形绘制能力等方面的测试。
也可根据需要,同时在测试程序中加入Instrumentation以扩展功能。
利用API的这种方式,最适合于开发小巧的自动化测试工具,例如生成联系人记录的数据生成工具,可以连续拨打电话的压力测试工具、可以评估系统性能的Benchmark类工具等。由于它没有基于特定的测试框架,很难满足测试任务调度和组织的需要。
总结
以上介绍的三种自动化测试技术各有所长,如能在实际的工作中根据不同的测试类型
和测试需求灵活使用,一定能提高OPhone平台及产品的测试效率和测试质量。
作者简介
金镝,中国移动通信研究院终端技术研究所项目经理。OPhone测试与质量团队成
员,目前主要负责OPhone平台自动化测试方面的工作。
OPhone自动化测试技术介绍
OPhone自动化测试技术介绍
OPhone平台除了为应用程序开发提供了丰富的API外,同时也为开展自动化测试提供了多种途径。本文将对OPhone平台上可采用的几种自动化测试技术进行介绍,并对每种技术的优缺点做简要的总结。
基于JUnit+Instrumentation框架的自动化测试
OPhone平台中整合了JUnit测试框架和Instrumentation机制。图1是JUnit+Instrumentation自动化测试框架的架构图。
JUnit是广泛应用于Java程序开发中的单元测试框架。它定义了特定格式的方法做为测试用例,提供TestSuite测试套件和TestRunner测试执行器分别用于组织测试用例和运行测试用例并反馈测试结果。
Instrumentation则是一种操作系统和上层应用程序之间的监控机制。当应用程序运行时,若Instrumentation设置为开启,它将在应用程序运行前初始化,与应用程序运行在同一个进程中,监测应用程序与系统之间的交互,并可以对应用程序进行一定的控制,例如,监控应用中各Activity的调用情况,启动和结束Activity,对Activity生命周期中的各个状态进行切换,甚至可以向Activity发送按键事件和字符。
为了可以更加便捷的进行自动化测试,如图2所示,OPhone平台利用Instrumentation对JUnit框架进行扩展。
经过这样的扩展,框架的易用性得到了提高。举例来说,假设AppActivity是某应用的一个Activity,我们想测试AppActivity界面上的一些功能,可以实现一个ActivitityInstruemtationTestCase2<AppActivity>的子类,当这个子类运行时,AppActivity就会自动启动,而省去了通过Intent等手动启动的步骤。
更重要的是,扩展后原有的JUnit单元测试被赋予了更多的功能。例如,用AndroidTestCase.getContext()、Instrumentation.getTargetContext()等方法就可以在测试代码中得到测试程序和被测应用程序的Context,进而访问到资源文件,因此该框架特别适合用来做
OPhone应用的单元测试。
如果我们再利用Instrumentation模拟用户从图形界面发起的诸如点击或拖拽屏幕、输入字符、选择菜单项等操作,就可以实现自动化功能测试甚至系统测试。与数据库操作和View操作配合使用后,这种自动化测试能够实现与测试人员的手动测试具有同样的效果。
下面就是一段基于JUnit+Instrumentation框架对记事本应用进行测试的自动化测试代码:
public void testInsertSaveNum() throws Exception {
String TEST_TITLE = "Add-Save Number";
String TEST_NOTE = "Note";
//启动NotesList
mNotesList = (NotesList) mInstrumentation.startActivitySync(mIntent);
//调用NotesList界面菜单中的“添加”选项
mInstrumentation.invokeMenuActionSync(mNotesList, NotesList.INSERT_ID, 0);
mInstrumentation.waitForIdleSync();
//此时转到了NoteEditor界面,利用ActivityMonitor来得到NoteEditor对象
mNoteEditor = (NoteEditor) waitForActivity(mNoteEditorMonitor);
SystemClock.sleep(waitTime);
//在标题栏和内容栏输入内容
inputTitleNote(TEST_TITLE, TEST_NOTE);
//调用NoteEditor界面菜单中的“保存”选项
mInstrumentation.invokeMenuActionSync(mNoteEditor, SAVE_ID, 0);
mInstrumentation.waitForIdleSync();
SystemClock.sleep(waitTime);
//此时应用程序转回到NotesList界面,取ListView并校验数量
mNotesListView = (ListView) mNotesList.getListView();
assertTrue("fail to add and save a note",mNotesListView.getCount() == 1);
}
JUnit和Instrumentation相结合,既充分发挥了JUnit在测试用例开发、组织等方面的特点,又提供了对应用程序进行控制的有效途径。
本部分内容设定了隐藏,需要回复后才能看到
步骤 动作
1 Window Manager 收到来自于linux键盘驱动的按键事件。
2 Window Manager 把scancode映射成keycode。
3 Window Manager 把 scancode和keycode都发给应用程序。
4 应用程序对按键事件进行响应。
OPhone平台还提供了功能丰富的开发调试工具和工具库,如adb、sqlite3、viewserver和ddmlib等,这些为我们探索新的自动化测试方法提供了技术基础。
像上述的键盘事件,我们就可以通过adb shell input命令发送给设备,同时我们也可以通过adb shell sendevent命令实现对触摸屏的操作。例如,想实现这样的过程:一、进入DCD应用的主界面;二、用向左滑动的触摸屏手势做翻页操作;三、调起该界面的菜单;四、退出DCD主界面,就可以用如下命令实现:
//启动DCD主界面
adb shell am start -n oms.dcd/oms.dcd.DcdClient
//在x向坐标00000095、y向坐标00000007的位置点击屏幕,并保持按下状态
adb shell sendevent /dev/input/event0: 0003 0000 00000095
adb shell sendevent /dev/input/event0: 0003 0001 00000007
adb shell sendevent /dev/input/event0: 0001 014a 00000001
//保持y向坐标不变,沿00000055到00000010的x向路径横向滑动
adb shell sendevent /dev/input/event0: 0003 0000 00000055
adb shell sendevent /dev/input/event0: 0000 0000 00000000
……
adb shell sendevent /dev/input/event0: 0003 0000 00000010
adb shell sendevent /dev/input/event0: 0000 0000 00000000
//结束按下状态
adb shell sendevent /dev/input/event0: 0001 014a 00000000
//发送一个菜单键值,调起菜单
adb shell input keyevent 1
//发送一个Back键值,收回菜单
adb shell input keyevent 4
//再发送一个Back键值,退出DCD界面
adb shell input keyevent 4
如果把这样的方法应用到具体测试用例上,那么就是一个完整的自动化测试过程了。
而对于需要操作数据库的情况,可通过adb shell sqlite3命令实现。
不过测试必须有检验结果的校验点才行。这里可以使用图像识别的方式进行结果的校验。识别可以采用两种方法:
1、利用系统viewserver中提供的接口获得当前界面上控件的属性信息,通过对比测试前后属性信息的变化进行结果校验;
2、利用ddmlib包中提供的接口自动截取测试前后的屏幕截图,通过对比两幅截图相同位置的图像信息是否存在差异来进行结果校验。
以上是基于键盘事件和图像识别的自动化测试方法的基本原理。在实际实现过程中,还需要做大量的工作,如提供友好的用户使用界面、提供更简单易懂的脚本格式、支持循环或分支等复杂的测试逻辑、支持更复杂的触摸屏操作、实现多设备互通及交互操作、支持测试结果的自动生成等。
这种自动化测试的实现方式不受系统应用程序进程间安全机制的限制,突破了JUnit+Instrumentation框架下自动化测试不易跨应用测试的限制,而且也能实现多部终端的交互操作,为实现交互性系统测试的自动化提供了,同时也非常适合于替代重复性的压力测试类型的手动测试。
该方式的缺点是:首先,获取屏幕信息时存在时延,测试执行起来的效率会降低。第二,如果大量采用基于屏幕坐标上的触摸屏点击操作,需要维护多套测试脚本已适应不同屏幕分辨率的产品。第三,与UI实现紧耦合,如果应用的UI设计变化,则需同步修改测试用例甚至重新设计测试用例。
基于OPhone API的自动化测试
OPhone平台开放的API中,很多都适合于开发测试程序。如利用ContentResolver可以操作应用的数据库,利用Graphic、Media、OpenGL等包中提供的接口可以实现对图片编解码、音视频媒体编解码、图形绘制能力等方面的测试。
也可根据需要,同时在测试程序中加入Instrumentation以扩展功能。
利用API的这种方式,最适合于开发小巧的自动化测试工具,例如生成联系人记录的数据生成工具,可以连续拨打电话的压力测试工具、可以评估系统性能的Benchmark类工具等。由于它没有基于特定的测试框架,很难满足测试任务调度和组织的需要。
总结
以上介绍的三种自动化测试技术各有所长,如能在实际的工作中根据不同的测试类型
和测试需求灵活使用,一定能提高OPhone平台及产品的测试效率和测试质量。
作者简介
金镝,中国移动通信研究院终端技术研究所项目经理。OPhone测试与质量团队成
员,目前主要负责OPhone平台自动化测试方面的工作。
[3] Application Fundamentals-Processes and lifecycles(历程生命周期)
来源: 互联网 发布时间: 2014-02-18
Application Fundamentals--Processes and lifecycles(进程生命周期)
Processes and lifecycles---进程生命周期
The Android system tries to maintain an application process for as long as possible, but eventually it will need to remove old processes when memory runs low. To determine which processes to keep and which to kill, Android places each process into an "importance hierarchy" based on the components running in it and the state of those components. Processes with the lowest importance are eliminated first, then those with the next lowest, and so on. There are five levels in the hierarchy. The following list presents them in order of importance:
翻译:Android 系统通常总是尽可能延长应用程序所属进程的生命期的,但是,系统最终还是会因为系统资源问题要关闭进程的。关闭进程之前,系统需要判定哪些进程需要继续维持哪些可以被关闭,Android系统是根据每个进程上关联的组件实例以及组件实例的最新状态做为判定每个进程重要程度的依据的,最低重要程度的进程将首先被系统关闭, 重要程度共分五个等级(重要程度1-5逐次降低,重要程度在这里也可以理解成系统维护进程等级):
1. A foreground process is one that is required for what the user is currently doing. A process is considered to be in the foreground if any of the following conditions hold:---翻译:符合下列四个条件的进程属于前端进程(foreground process):
* It is running an activity that the user is interacting with (the Activity object's onResume() method has been called).--翻译:进程中存在某个activity实例,该实例处于和用户交互状态。(该实例的onResume()方法已经被系统调用)。
* It hosts a service that's bound to the activity that the user is interacting with.--翻译:进程中某个服务被绑定到某个正在与用户交互的activity实例上。
* It has a Service object that's executing one of its lifecycle callbacks (onCreate(), onStart(), or onDestroy()).
--翻译:进程中某个Service实例的回调方法:onCreate(), onStart(), 或 onDestroy()正在被系统执行。
* It has a BroadcastReceiver object that's executing its onReceive() method.---翻译:进程中某个BroadcastReceiver实例的onReceive()方法正在执行中(广播消息响应处理中)。
Only a few foreground processes will exist at any given time. They are killed only as a last resort — if memory is so low that they cannot all continue to run. Generally, at that point, the device has reached a memory paging state, so killing some foreground processes is required to keep the user interface responsive.
翻译:由于系统同时只能维护少数几个前端进程,系统关闭前端进程是最不得以的做法,比如内存不足以维持前端进程的运行的时候才会发生。另外,为了保证与用户快速交互,某些前端进程也会被系统关闭的。
2.A visible process is one that doesn't have any foreground components, but still can affect what the user sees on screen. A process is considered to be visible if either of the following conditions holds:
翻译:可视进程中没有任何组件处于前台与用户交互,但是在屏幕上对用户视觉还是影响,符合下面条件的进程属于可视进程:
* It hosts an activity that is not in the foreground, but is still visible to the user (its onPause() method has been called). This may occur, for example, if the foreground activity is a dialog that allows the previous activity to be seen behind it.---翻译:进程中某个activity组件实例已经不在前台,但是对于用户而言依然是可见状态(该实例的 onPause() 方法已经被系统调用过),例如,当前处于前台与客户交互的是一个对话框,那么前一个activity界面作为背景依然是用户可见状态。
* It hosts a service that's bound to a visible activity.---翻译:进程中某个服务实例与某个可视状态的activity有着绑定关系。
A visible process is considered extremely important and will not be killed unless doing so is required to keep all foreground processes running.---翻译:可视进程是非常重要的,除非系统需要维护所有的前端进程,否则可视进程是不会被系统关闭的。
3. A service process is one that is running a service that has been started with the startService() method and that does not fall into either of the two higher categories. Although service processes are not directly tied to anything the user sees, they are generally doing things that the user cares about (such as playing an mp3 in the background or downloading data on the network), so the system keeps them running unless there's not enough memory to retain them along with all foreground and visible processes.
翻译:服务进程 ,是正在运行某个由 startService() 方法启动的服务的进程,尽管说服务进程并没有直接与用户发生交互,但是它所做的事是用户关注的事,比如在后台播放MP3音乐或是在后台通过网络下载数据,所以系统通常总是维持这样的进程的,除非前端进程、可视进程需要更多内存的时候。可以这样理解前端进程、可视进程的重要程度要高于服务进程。
4. A background process is one holding an activity that's not currently visible to the user (the Activity object's onStop() method has been called). These processes have no direct impact on the user experience, and can be killed at any time to reclaim memory for a foreground, visible, or service process. Usually there are many background processes running, so they are kept in an LRU (least recently used) list to ensure that the process with the activity that was most recently seen by the user is the last to be killed. If an activity implements its lifecycle methods correctly, and captures its current state, killing its process will not have a deleterious effect on the user experience.
翻译:后台进程 是持有某个当前用户不可见的activity实例的进程,(被持有的Activity实例的 onStop() 方法已经被系统调用过). 后台进程就用户体验来说没有什么影响,一旦前端进程、可视进程或服务进程需要更多内存资源,系统将会随时杀死后台进程。通常有很多后台进程会处于系统维护中状态,系统把所有这些后台进程放在一个 LRU (least recently used) list中,这样做的目的是保证最后被用户看到的activity所属的进程总是最后一个被系统杀死。只要一个activity的回调方法被开发者正确实现、并能够及时俘捉到自身最新状态信息,那么,该实例所属的进程即使被系统关闭也不会影响到客户体验的。
5.An empty process is one that doesn't hold any active application components. The only reason to keep such a process around is as a cache to improve startup time the next time a component needs to run in it. The system often kills these processes in order to balance overall system resources between process caches and the underlying kernel caches.
翻译:空进程是不持有应用的任何组件实例的进程。系统维护这样的进程的目的是处于缓存的考虑,可以提高组件实例的启动效率。系统也常常杀死这样的进程以换取系统资源、进程缓存、底层核心缓存之间的平衡。
Android ranks a process at the highest level it can, based upon the importance of the components currently active in the process. For example, if a process hosts a service and a visible activity, the process will be ranked as a visible process, not a service process.
翻译:Android系统尽可能授予进程更高的维护级别,具体说是根据当前进程中关联的activity实例的状态来给定当前进程维护级别,例如一个进程中关联到一个服务和一个可视的activity实例,该进程将被给定为可视级别。
In addition, a process's ranking may be increased because other processes are dependent on it. A process that is serving another process can never be ranked lower than the process it is serving. For example, if a content provider in process A is serving a client in process B, or if a service in process A is bound to a component in process B, process A will always be considered at least as important as process B.
翻译:另外,一个进程的系统维护级别可能会由于被其他进程依赖而提高,被依赖的进程的级别总是高于依赖进程。例如:进程A中的内容提供组件是为进程B的一个组件服务的,或是如果进程A中的一个服务实例被绑定到进程B的某个组件实例,那么进程A至少具有和进程D同样的系统维护级别。
Because a process running a service is ranked higher than one with background activities, an activity that initiates a long-running operation might do well to start a service for that operation, rather than simply spawn a thread — particularly if the operation will likely outlast the activity. Examples of this are playing music in the background and uploading a picture taken by the camera to a web site. Using a service guarantees that the operation will have at least "service process" priority, regardless of what happens to the activity. As noted in the Broadcast receiver lifecycle section earlier, this is the same reason that broadcast receivers should employ services rather than simply put time-consuming operations in a thread.
翻译:由于服务进程(执行某个服务的进程)的系统维护级别总是高于某个关联了一个activity实例的后台进程的系统维护级别,这就意味这服务进程要比这个关联了一个activity实例的后台进程活的更长。所以,使用服务执行长时间操作要比使用一个activity实例来执行同样的耗时操作要更为合适。例如:后台音乐播放和把用照相功能俘获的图像信息上次到某个网站这样 的耗时操作,如果使用的是服务组件,那么当前进程就是服务进程维护级别。在Broadcast receiver lifecycle章节中,也说到过类似的问题,都是出于同样的考虑,广播接收组件实例的onReceive()方法中不应该用独立线程的方式执行耗时操作,而是应该使用服务组件执行这样的操作。
Processes and lifecycles---进程生命周期
The Android system tries to maintain an application process for as long as possible, but eventually it will need to remove old processes when memory runs low. To determine which processes to keep and which to kill, Android places each process into an "importance hierarchy" based on the components running in it and the state of those components. Processes with the lowest importance are eliminated first, then those with the next lowest, and so on. There are five levels in the hierarchy. The following list presents them in order of importance:
翻译:Android 系统通常总是尽可能延长应用程序所属进程的生命期的,但是,系统最终还是会因为系统资源问题要关闭进程的。关闭进程之前,系统需要判定哪些进程需要继续维持哪些可以被关闭,Android系统是根据每个进程上关联的组件实例以及组件实例的最新状态做为判定每个进程重要程度的依据的,最低重要程度的进程将首先被系统关闭, 重要程度共分五个等级(重要程度1-5逐次降低,重要程度在这里也可以理解成系统维护进程等级):
1. A foreground process is one that is required for what the user is currently doing. A process is considered to be in the foreground if any of the following conditions hold:---翻译:符合下列四个条件的进程属于前端进程(foreground process):
* It is running an activity that the user is interacting with (the Activity object's onResume() method has been called).--翻译:进程中存在某个activity实例,该实例处于和用户交互状态。(该实例的onResume()方法已经被系统调用)。
* It hosts a service that's bound to the activity that the user is interacting with.--翻译:进程中某个服务被绑定到某个正在与用户交互的activity实例上。
* It has a Service object that's executing one of its lifecycle callbacks (onCreate(), onStart(), or onDestroy()).
--翻译:进程中某个Service实例的回调方法:onCreate(), onStart(), 或 onDestroy()正在被系统执行。
* It has a BroadcastReceiver object that's executing its onReceive() method.---翻译:进程中某个BroadcastReceiver实例的onReceive()方法正在执行中(广播消息响应处理中)。
Only a few foreground processes will exist at any given time. They are killed only as a last resort — if memory is so low that they cannot all continue to run. Generally, at that point, the device has reached a memory paging state, so killing some foreground processes is required to keep the user interface responsive.
翻译:由于系统同时只能维护少数几个前端进程,系统关闭前端进程是最不得以的做法,比如内存不足以维持前端进程的运行的时候才会发生。另外,为了保证与用户快速交互,某些前端进程也会被系统关闭的。
2.A visible process is one that doesn't have any foreground components, but still can affect what the user sees on screen. A process is considered to be visible if either of the following conditions holds:
翻译:可视进程中没有任何组件处于前台与用户交互,但是在屏幕上对用户视觉还是影响,符合下面条件的进程属于可视进程:
* It hosts an activity that is not in the foreground, but is still visible to the user (its onPause() method has been called). This may occur, for example, if the foreground activity is a dialog that allows the previous activity to be seen behind it.---翻译:进程中某个activity组件实例已经不在前台,但是对于用户而言依然是可见状态(该实例的 onPause() 方法已经被系统调用过),例如,当前处于前台与客户交互的是一个对话框,那么前一个activity界面作为背景依然是用户可见状态。
* It hosts a service that's bound to a visible activity.---翻译:进程中某个服务实例与某个可视状态的activity有着绑定关系。
A visible process is considered extremely important and will not be killed unless doing so is required to keep all foreground processes running.---翻译:可视进程是非常重要的,除非系统需要维护所有的前端进程,否则可视进程是不会被系统关闭的。
3. A service process is one that is running a service that has been started with the startService() method and that does not fall into either of the two higher categories. Although service processes are not directly tied to anything the user sees, they are generally doing things that the user cares about (such as playing an mp3 in the background or downloading data on the network), so the system keeps them running unless there's not enough memory to retain them along with all foreground and visible processes.
翻译:服务进程 ,是正在运行某个由 startService() 方法启动的服务的进程,尽管说服务进程并没有直接与用户发生交互,但是它所做的事是用户关注的事,比如在后台播放MP3音乐或是在后台通过网络下载数据,所以系统通常总是维持这样的进程的,除非前端进程、可视进程需要更多内存的时候。可以这样理解前端进程、可视进程的重要程度要高于服务进程。
4. A background process is one holding an activity that's not currently visible to the user (the Activity object's onStop() method has been called). These processes have no direct impact on the user experience, and can be killed at any time to reclaim memory for a foreground, visible, or service process. Usually there are many background processes running, so they are kept in an LRU (least recently used) list to ensure that the process with the activity that was most recently seen by the user is the last to be killed. If an activity implements its lifecycle methods correctly, and captures its current state, killing its process will not have a deleterious effect on the user experience.
翻译:后台进程 是持有某个当前用户不可见的activity实例的进程,(被持有的Activity实例的 onStop() 方法已经被系统调用过). 后台进程就用户体验来说没有什么影响,一旦前端进程、可视进程或服务进程需要更多内存资源,系统将会随时杀死后台进程。通常有很多后台进程会处于系统维护中状态,系统把所有这些后台进程放在一个 LRU (least recently used) list中,这样做的目的是保证最后被用户看到的activity所属的进程总是最后一个被系统杀死。只要一个activity的回调方法被开发者正确实现、并能够及时俘捉到自身最新状态信息,那么,该实例所属的进程即使被系统关闭也不会影响到客户体验的。
5.An empty process is one that doesn't hold any active application components. The only reason to keep such a process around is as a cache to improve startup time the next time a component needs to run in it. The system often kills these processes in order to balance overall system resources between process caches and the underlying kernel caches.
翻译:空进程是不持有应用的任何组件实例的进程。系统维护这样的进程的目的是处于缓存的考虑,可以提高组件实例的启动效率。系统也常常杀死这样的进程以换取系统资源、进程缓存、底层核心缓存之间的平衡。
Android ranks a process at the highest level it can, based upon the importance of the components currently active in the process. For example, if a process hosts a service and a visible activity, the process will be ranked as a visible process, not a service process.
翻译:Android系统尽可能授予进程更高的维护级别,具体说是根据当前进程中关联的activity实例的状态来给定当前进程维护级别,例如一个进程中关联到一个服务和一个可视的activity实例,该进程将被给定为可视级别。
In addition, a process's ranking may be increased because other processes are dependent on it. A process that is serving another process can never be ranked lower than the process it is serving. For example, if a content provider in process A is serving a client in process B, or if a service in process A is bound to a component in process B, process A will always be considered at least as important as process B.
翻译:另外,一个进程的系统维护级别可能会由于被其他进程依赖而提高,被依赖的进程的级别总是高于依赖进程。例如:进程A中的内容提供组件是为进程B的一个组件服务的,或是如果进程A中的一个服务实例被绑定到进程B的某个组件实例,那么进程A至少具有和进程D同样的系统维护级别。
Because a process running a service is ranked higher than one with background activities, an activity that initiates a long-running operation might do well to start a service for that operation, rather than simply spawn a thread — particularly if the operation will likely outlast the activity. Examples of this are playing music in the background and uploading a picture taken by the camera to a web site. Using a service guarantees that the operation will have at least "service process" priority, regardless of what happens to the activity. As noted in the Broadcast receiver lifecycle section earlier, this is the same reason that broadcast receivers should employ services rather than simply put time-consuming operations in a thread.
翻译:由于服务进程(执行某个服务的进程)的系统维护级别总是高于某个关联了一个activity实例的后台进程的系统维护级别,这就意味这服务进程要比这个关联了一个activity实例的后台进程活的更长。所以,使用服务执行长时间操作要比使用一个activity实例来执行同样的耗时操作要更为合适。例如:后台音乐播放和把用照相功能俘获的图像信息上次到某个网站这样 的耗时操作,如果使用的是服务组件,那么当前进程就是服务进程维护级别。在Broadcast receiver lifecycle章节中,也说到过类似的问题,都是出于同样的考虑,广播接收组件实例的onReceive()方法中不应该用独立线程的方式执行耗时操作,而是应该使用服务组件执行这样的操作。
最新技术文章: