Android生命周期(1).ppt
第第4章章 Android生命周期生命周期本章学习目标n 了解Android系统的进程优先级的变化方式n 了解Android系统的四大基本组件n 了解Activity的生命周期中各状态的变化关系n 掌握Activity事件回调函数的作用和调用顺序n 掌握Android应用程序的调试方法和工具4.1 程序生命周期n程序的生命周期q程序的生命周期是在Android系统中进程从启动到终止的所有阶段,也就是Android程序启动到停止的全过程q程序的生命周期由Android系统进行调度和控制的 4.1 程序生命周期nAndroid系统中的进程优先级由高到低q前台进程q可见进程q服务进程q后台进程q空进程4.1 程序生命周期n前台进程q前台进程是Android系统中最重要的进程,是与用户正在交互的进程,包含以下四种情况n进程中的Activity正在与用户进行交互n进程服务被Activity调用,而且这个Activity正在与用户进行交互n进程服务正在执行声明周期中的回调函数,如onCreate()、onStart()或onDestroy()n进程的BroadcastReceiver正在执行onReceive()函数qAndroid系统在多个前台进程同时运行时,可能会出现资源不足的情况,此时会清除部分前台进程,保证主要的用户界面能够及时响应4.1 程序生命周期n可见进程q可见进程指部分程序界面能够被用户看见,却不在前台与用户交互,不响应界面事件的进程q如果一个进程包含服务,且这个服务正在被用户可见的Activity调用,此进程同样被视为可见进程qAndroid系统一般存在少量的可见进程,只有在特殊的情况下,Android系统才会为保证前台进程的资源而清除可见进程4.1 程序生命周期n服务进程q服务进程是指包含已启动服务的进程n没有用户界面n在后台长期运行qAndroid系统除非不能保证前台进程或可视进程所必要的资源,否则不强行清除服务进程4.1 程序生命周期n后台进程q后台进程是指不包含任何已经启动的服务,而且没有任何用户可见的Activity的进程qAndroid系统中一般存在数量较多的后台进程,在系统资源紧张时,系统将优先清除用户较长时间没有见到的后台进程4.1 程序生命周期n空进程q空进程是不包含任何活跃组件的进程q空进程在系统资源紧张时会被首先清除q但为了提高Android系统应用程序的启动速度,Android系统会将空进程保存在系统内存用,在用户重新启动该程序时,空进程会被重新使用q除了以上的优先级外,以下两方面也决定他们的优先级n进程的优先级取决于所有组件中的优先级最高的部分n进程的优先级会根据与其他进程的依赖关系而变化4.2 Android组件n组件是可以调用的基本功能模块,Android应用程序就是由组件组成的nAndroid系统有四个重要的组件,分别是Activity、Service、BroadcaseReceiver和ContentProvider4.2 Android组件nActivityqActivity是Android程序的呈现层,显示可视化的用户界面,并接收与用户交互所产生的界面事件qAndroid应用程序可以包含一个或多个Activity,一般在程序启动后会呈现一个Activity,用于提示用户程序已经正常启动q在界面上的表现形式:全屏窗体,非全屏悬浮窗体,对话框nServiceqService用于没有用户界面,但需要长时间在后台运行的应用4.2 Android组件nBroadcaseReceiverqBroadcaseReceiver是用来接受并响应广播消息的组件q不包含任何用户界面q可以通过启动Activity或者Notification通知用户接收到重要信息nNotification能够通过多种方法提示用户,包括闪动背景灯、震动设备、发出声音或在状态栏上放置一个持久的图标4.2 Android组件nContentProviderqContentProvider是Android系统提供的一种标准的共享数据的机制,应用程序可以通过ContentProvider访问其他应用程序的私有数据n私有数据可以是存储在文件系统中的文件,也可以是SQLite中的数据库qAndroid系统内部也提供一些内置的ContentProvider,能够为应用程序提供重要的数据信息4.2 Android组件n组件生命周期q所有Android组件都具有自己的生命周期,是从组件建立到组件销毁的整个过程q在生命周期中,组件会在可见、不可见、活动、非活动等状态中不断变化4.3 Activity生命周期nActivity生命周期qActivity生命周期指Activity从启动到销毁的过程qActivity表现为四种状态,分别是活动状态、暂停状态、停止状态和非活动状态n活动状态,Activity在用户界面中处于最上层,完全能不用户看到,能够与用户进行交互n暂停状态,Activity在界面上被部分遮挡,该Activity不再处于用户界面的最上层,且不能够与用户进行交互n停止状态,Activity在界面上完全不能被用户看到,也就是说这个Activity被其他Activity全部遮挡n非活动状态不在以上三种状态中的Activity则处于非活动状态4.3 Activity生命周期nActivity的四种状态的变换关系图4.3 Activity生命周期nActivity栈q遵循“后进先出”的规则4.3 Activity生命周期n事件的回调函数1.public class MyActivity extends Activity 2.protected void onCreate(Bundle savedInstanceState);3.protected void onStart();4.protected void onRestart();5.protected void onResume();6.protected void onPause();7.protected void onStop();8.protected void onDestroy();9.4.3 Activity生命周期nActivity生命周期的事件回调函数函数函数是否是否可终止可终止说明说明onCreate()否Activity启动后第一个被调用的函数,常用来进行Activity的初始化,例如创建View、绑定数据或恢复信息等。onStart()否当Activity显示在屏幕上时,该函数被调用。onRestart()否当Activity从停止状态进入活动状态前,调用该函数。onResume()否当Activity能够与用户交互,接受用户输入时,该函数被调用。此时的Activity位于Activity栈的栈顶。onPause()是当Activity进入暂停状态时,该函数被调用。一般用来保存持久的数据或释放占用的资源。onStop()是当Activity进入停止状态时,该函数被调用。onDestroy()是在Activity被终止前,即进入非活动状态前,该函数被调用。4.3 Activity生命周期nActivity状态保存/恢复的事件回调函数函数函数是否是否可终止可终止说明说明onSaveInstanceState()否Android系统因资源不足终止Activity前调用该函数,用以保存Activity的状态信息,供onRestoreInstanceState()或onCreate()恢复之用。onRestoreInstanceState()否恢复onSaveInstanceState()保存的Activity状态信息,在onStart()和onResume()之间被调用。4.3 Activity生命周期nActivity事件回调函数的调用顺序nActivity生命周期分类qActivity的生命周期可分为全生命周期、可视生命周期和活动生命周期q每种生命周期中包含不同的事件回调函数4.3 Activity生命周期n全生命周期q全生命周期是从Activity建立到销毁的全部过程,始于onCreate(),结束于onDestroy()n使用者通常在onCreate()中初始化Activity所能使用的全局资源和状态,并在onDestroy()中释放这些资源n在一些极端的情况下,Android系统会不调用onDestroy()函数,而直接终止进程4.3 Activity生命周期n可视生命周期q可视生命周期是Activity在界面上从可见到不可见的过程,开始于onStart(),结束于onStop()4.3 Activity生命周期n可视生命周期nonStart()一般用来初始化或启动与更新界面相关的资源nonStop()一般用来暂停或停止一切与更新用户界面相关的线程、计时器和服务nonRestart()函数在onSart()前被调用,用来在Activity从不可见变为可见的过程中,进行一些特定的处理过程nonStart()和onStop()会被多次调用nonStart()和onStop()也经常被用来注册和注销BroadcastReceiver4.3 Activity生命周期n活动生命周期q活动生命周期是Activity在屏幕的最上层,并能够与用户交互的阶段,开始于onResume(),结束于onPause()q在Activity的状态变换过程中onResume()和onPause()经常被调用,因此这两个函数中应使用更为简单、高效的代码4.3 Activity生命周期n活动生命周期nonPause()是第一个被标识为“可终止”的函数n在onPause()返回后,onStop()和onDestroy()随时能被Android系统终止nonPause()常用来保存持久数据,如界面上的用户的输入信息等4.3 Activity生命周期nonPause()和onSaveInstanceState()的区别 这两个函数都可以用来保存界面的用户输入数据,他们的区别在于qonPause()一般用于保存持久性数据,并将数据保存在存储设备上的文件系统或数据库系统中的qonSaveInstanceState()主要用来保存动态的状态信息,信息一般保存在Bundle中nBundle是能够保存多种格式数据的对象n在onSaveInstanceState()保存在Bundle中的数据,系统在调用onRestoreInstanceState()和onCreate()时,会同样利用Bundle将数据传递给函数4.3 Activity生命周期n举例:建立一个新的Android工程q工程名称:ActivityLifeCycleq包名称:edu.hrbeu.ActivityLifeCycleqActivity名称:ActivityLifeCycle4.3 Activity生命周期nActivityLifeCycle.java文件的代码1.package edu.hrbeu.ActivityLifeCycle;2.3.import android.app.Activity;4.import android.os.Bundle;5.import android.util.Log;6.7.public class ActivityLifeCycle extends Activity 8.private static String TAG=LIFTCYCLE;9.Override /完全生命周期开始时被调用,初始化Activity10.public void onCreate(Bundle savedInstanceState)11.super.onCreate(savedInstanceState);12.setContentView(R.layout.main);13.Log.i(TAG,(1)onCreate();14.15.16.Override /可视生命周期开始时被调用,对用户界面进行必要的更改 17.public void onStart()18.super.onStart();19.Log.i(TAG,(2)onStart();4.3 Activity生命周期nActivityLifeCycle.java文件的代码20.21.22.Override /在onStart()后被调用,用于恢复onSaveInstanceState()保存的用户界面信息23.public void onRestoreInstanceState(Bundle savedInstanceState)24.super.onRestoreInstanceState(savedInstanceState);25.Log.i(TAG,(3)onRestoreInstanceState();26.27.28.Override /在活动生命周期开始时被调用,恢复被onPause()停止的用于界面更新的资源29.public void onResume()30.super.onResume();31.Log.i(TAG,(4)onResume();32.33.34.Override /在onResume()后被调用,保存界面信息35.public void onSaveInstanceState(Bundle savedInstanceState)4.3 Activity生命周期nActivityLifeCycle.java文件的代码36.super.onSaveInstanceState(savedInstanceState);37.Log.i(TAG,(5)onSaveInstanceState();38.39.40.Override /在重新进入可视生命周期前被调用,载入界面所需要的更改信息41.public void onRestart()42.super.onRestart();43.Log.i(TAG,(6)onRestart();44.45.46.Override /在活动生命周期结束时被调用,用来保存持久的数据或释放占用的资源47.public void onPause()48.super.onPause();49.Log.i(TAG,“(7)onPause()”);、50.51.51.52.Override/在可视生命周期结束时被调用,一般用来保存持久的数据或释放占用的资源4.3 Activity生命周期nActivityLifeCycle.java文件的代码n上面的程序主要通过在生命周期函数中添加“日志点”的方法进行调试,程序的运行结果将会显示在LogCat中n为了显示结果易于观察和分析,在LogCat设置过滤器LifeCycleFilter,过滤方法选择by Log Tag,过滤关键字为LIFTCYCLE53.public void onStop()54.super.onStop();55.Log.i(TAG,(8)onStop();56.57.58.Override/在完全生命周期结束时被调用,释放资源,包括线程、数据连接等59.public void onDestroy()60.super.onDestroy();61.Log.i(TAG,(9)onDestroy();62.63.4.3 Activity生命周期n全生命周期q启动和关闭ActivityLifeCycle 的LogCat输出n启动ActivityLifeCyclen按下模拟器的“返回键”n关闭ActivityLifeCycleqLogCat输出结果4.3 Activity生命周期n全生命周期q函数的调用顺序:onCreate()onStart()onResume()onPause()onStop()onDestroy()n调用onCreate()函数分配资源n调用onStart()将Activity显示在屏幕上n调用onResume()获取屏幕焦点n调用onPause()、onStop()和onDestroy(),释放资源并销毁进程4.3 Activity生命周期n可视生命周期q状态转换n启动ActivityLifeCyclen按“呼出/接听键”启动内置的拨号程序n再通过“返回键”退出拨号程序nActivityLifeCycle重新显示在屏幕中q可视生命周期的LogCat输出结果4.3 Activity生命周期n可视生命周期q函数的调用顺序:onSaveInstanceState()onPause()onStop()onRestart()onStart()onResume()n调用onSaveInstanceState()函数保存Activity状态n调用onPause()和onStop(),停止对不可见Activity的更新n调用onRestart()恢复需要界面上需要更新的信息n调用onStart()和onResume()重新显示Activity,并接受用户交互4.3 Activity生命周期n可视生命周期q开启IDA的可视生命周期:Dev Tools Development Settings Immediately destroy activities(IDA)下开启IDA4.3 Activity生命周期n可视生命周期q开启IDA的可视生命周期的函数调用顺序:onSaveInstanceState()onPause()onStop()onDestroy()onCreate()onStart()onRestoreInstanceState()onResume()n调用onRestoreInstanceState()恢复Activity销毁前的状态n其他的函数调用顺序与程序启动过程的调用顺序相同4.3 Activity生命周期n活动生命周期q活动生命周期的LogCat输出n启动ActivityLifeCyclen通过“挂断键”使模拟器进入休眠状态n再通过“挂断键”唤醒模拟器qLogCat的输出结果4.3 Activity生命周期n活动生命周期q函数调用顺序如下:onSaveInstanceState()onPause()onResume()n调用onSaveInstanceState()保存Activity的状态n调用onPause()停止与用户交互n调用onResume()恢复与用户的交互4.4 程序调试 Android系统提供了两种调试工具LogCat和DevTools,用于定位、分析及修复程序中出现的错误n4.4.1 LogCatqLogCat是用来获取系统日志信息的工具,并可以显示在Eclipse集成开发环境中q功能:能够捕获的信息包括Dalvik虚拟机产生的信息、进程信息、ActivityManager信息、PackagerManager信息、Homeloader 信息、WindowsManager信息、Android运行时信息和应用程序信息等4.4 程序调试n4.4.1 LogCatq打开方式:Window Show View Other 打开Show View的选择菜单,然后在Andoird LogCat中选择LogCat4.4 程序调试n4.4.1 LogCatqLogCat打开后,便显示在Eclipse的下方区域4.4 程序调试n4.4.1 LogCatqLogCat的右上方的五个字母表示五种不同类型的日志信息,他们的级别依次增高 V:详细(Verbose)信息 D:调试(Debug)信息I:通告(Info)信息 W:警告(Warn)信息 E:错误(Error)信息4.4 程序调试n4.4.1 LogCatq在LogCat中,用户可以通过五个字母图标选择显示的信息类型,级别高于所选类型的信息也会在LogCat中显示,但级别低于所选类型的信息则不会被显示4.4 程序调试n4.4.1 LogCatqLogCat提供了“过滤”功能,在右上角的“+”号和“-”号,分别是添加和删除过滤器。用户可以根据日志信息的标签(Tag)、产生日志的进程编号(Pid)或信息等级(Level),对显示的日志内容进行过滤4.4 程序调试n4.4.1 LogCatq程序调试原理n引入android.util.Log包n使用Log.v()、Log.d()、Log.i()、Log.w()和 Log.e()五个函数在程序中设置“日志点”n当程序运行到“日志点”时,应用程序的日志信息便被发送到LogCat中n判断“日志点”信息与预期的内容是否一致n进而判断程序是否存在错误q Log.v()用来记录详细信息,Log.d()用来记录调试信息,Log.i()用来记录通告信息,Log.w()用来记录警告信息,Log.e()用来记录通错误信息4.4 程序调试n4.4.1 LogCatq演示了Log类的具体使用方法1.package edu.hrbeu.LogCat;2.3.import android.app.Activity;4.import android.os.Bundle;5.import android.util.Log;6.7.public class LogCat extends Activity 8.final static String TAG=LOGCAT;9.Override10.public void onCreate(Bundle savedInstanceState)11.super.onCreate(savedInstanceState);12.setContentView(R.layout.main);13.4.4 程序调试n4.4.1 LogCatn程序第5行引入android.util.Log包n第8行定义标签。标签帮助用户在LogCat中找到目标程序生成的日志信息,同时也能够利用标签对日志进行过滤n第14行记录一个详细信息,Log.v()函数的第一个参数是日志的标签,第二个参数是实际的信息内容n第15行到第18行分别产生了调试信息、通告信息、警告信息和错误信息14.Log.v(TAG,Verbose);15.Log.d(TAG,Debug);16.Log.i(TAG,Info);17.Log.w(TAG,Warn);18.Log.e(TAG,Error);19.20.4.4 程序调试n4.4.1 LogCatqLogCat工程的运行结果nLogCat对不同类型的信息使用了不同的颜色加以区别4.4 程序调试n4.4.1 LogCatq添加过滤器n单击“+”n填入过滤器的名称:LogcatFiltern设置过滤条件为“标签=LOGCAT”4.4 程序调试n4.4.1 LogCatq LogCat过滤后的输入结果n无论什么类型的日志信息,属于哪一个进程,只要标签为LOGCAT,都将显示在LogcatFilter区域内4.4 程序调试n4.4.2 DevToolsqDevTools是用于调试和测试的工具q包括了一系列用户各种用途的小工具:Development Settings、Exception Browser、Google Login Service、Instrumentation、Media Scanner、Package Browser、Pointer Location、Raw Image Viewer、Running processes和Terminal Emulator4.4 程序调试n4.4.2 DevToolsqDevTools的使用界面4.4 程序调试n4.4.2 DevToolsq Development SettingsnDevelopment Settings中包含了程序调试的相关选项n单击功能前面选择框,出现绿色的“对号”表示功能启用n模拟器会自动保存设置4.4 程序调试n4.4.2 DevToolsnDevelopment Settings选项选项选项说明说明Debug App为Wait for debugger选项指定应用程序,如果不指定(选择none),Wait for debugger选项将适用于所有应用程序。Debug App可以有效的防止Android程序长时间停留在断点而产生异常。Wait for debugger阻 塞 加 载 应 用 程 序,直 到 关 联 到 调 试 器(Debugger)。用于在Activity的onCreate()函数的进行断点调试。Show running processs在屏幕右上角显示运行中的进程。Show screen updates选中该选项时,界面上任何被重绘的矩形区域会闪现粉红色,有利于发现界面中不必要的重绘区域。No App Process limit允许同时运行进程的数量上限。4.4 程序调试n4.4.2 DevToolsImmediately destroy activitesActivity进入停止状态后立即销毁,用于测试在函数 onSaveInstanceState()、onRestoreInstanceState()和onCreate()中的代码。Show CPU usage在屏幕顶端显示CPU使用率,上层红线显示总的CPU使用率,下层绿线显示当前进程的CPU使用率。Show background应用程序没有Activity显示时,直接显示背景面板,一般这种情况仅在调试时出现。Show Sleep state on LED在休眠状态下开启LED。Windows Animation ScaleTransition AnimationLight HintingShow GTalk service connection status显示GTalk服务连接状态。4.4 程序调试n4.4.2 DevToolsqPackage BrowsernPackage Browser是Android系统中的程序包查看工具,能够详细显示已经安装到Android系统中的程序信息,包括包名称、应用程序名称、图标、进程、用户ID、版本、apk文件保存位置和数据文件保存位置n进一步查看应用程序所包含Activity、Service、BroadcastReceiver和Provider的详细信息4.4 程序调试n4.4.2 DevToolsnPackage Browser查看ActivityLifeCycle程序的相关信息4.4 程序调试n4.4.2 DevToolsqPointer LocationnPointer Location是屏幕点位置查看工具,能够显示触摸点的X轴坐标和Y轴坐标nPointer Location的使用画面4.4 程序调试n4.4.2 DevToolsqRunning processesnRunning processes能够查看在Android系统中正在运行的进程,并能查看进程的详细信息,包括进程名称和进程所调用的程序包nAndoird模拟器缺省情况下运行的进程和com.android.phone进程的详细信息4.4 程序调试n4.4.2 DevToolsnAndoird模拟器缺省情况下运行的进程ncom.android.phone进程的详细信息4.4 程序调试n4.4.2 DevToolsqTerminal EmulatornTerminal Emulator可以打开一个连接底层Linux系统的虚拟终端,但具有的权限较低,且不支持提升权限的su命令n如果需要使用root权限的命令,可以使用ADB工具n右图是Terminal Emulator运行时的画面,输入ls命令,显示出根目录下的所有文件夹