Presentation is loading. Please wait.

Presentation is loading. Please wait.

第4章 Android生命周期.

Similar presentations


Presentation on theme: "第4章 Android生命周期."— Presentation transcript:

1 第4章 Android生命周期

2 本章学习目标 了解Android系统的四大基本组件 了解Activity的生命周期中各状态的变化关系

3 4.1 程序生命周期 程序的生命周期 程序的生命周期是在Android系统中进程从启动到终止的所有阶段,也就是Android程序启动到停止的全过程 程序的生命周期由Android系统进行调度和控制的

4 4.1 程序生命周期 Android系统中的进程优先级由高到低 前台进程 可见进程 服务进程 后台进程 空进程

5 4.1 程序生命周期 前台进程 前台进程是Android系统中最重要的进程,是与用户正在交互的进程,包含以下四种情况
进程中的Activity正在与用户进行交互 进程服务被Activity调用,而且这个Activity正在与用户进行交互 进程服务正在执行声明周期中的回调函数,如onCreate()、onStart()或onDestroy() 进程的BroadcastReceiver正在执行onReceive()函数 Android系统在多个前台进程同时运行时,可能会出现资源不足的情况,此时会清除部分前台进程,保证主要的用户界面能够及时响应

6 4.1 程序生命周期 可见进程 可见进程指部分程序界面能够被用户看见,却不在前台与用户交互,不响应界面事件的进程
如果一个进程包含服务,且这个服务正在被用户可见的Activity调用,此进程同样被视为可见进程 Android系统一般存在少量的可见进程,只有在特殊的情况下,Android系统才会为保证前台进程的资源而清除可见进程

7 4.1 程序生命周期 服务进程 服务进程是指包含已启动服务的进程
没有用户界面 在后台长期运行 Android系统除非不能保证前台进程或可视进程所必要的资源,否则不强行清除服务进程

8 4.1 程序生命周期 后台进程 后台进程是指不包含任何已经启动的服务,而且没有任何用户可见的Activity的进程
Android系统中一般存在数量较多的后台进程,在系统资源紧张时,系统将优先清除用户较长时间没有见到的后台进程

9 4.1 程序生命周期 空进程 除了以上的优先级外,以下两方面也决定他们的优先级 空进程是不包含任何活跃组件的进程
空进程在系统资源紧张时会被首先清除 但为了提高Android系统应用程序的启动速度,Android系统会将空进程保存在系统内存中,在用户重新启动该程序时,空进程会被重新使用 除了以上的优先级外,以下两方面也决定他们的优先级 进程的优先级取决于所有组件中的优先级最高的部分 进程的优先级会根据与其他进程的依赖关系而变化

10 4.2 Android组件 组件是可以调用的基本功能模块,Android应用程序就是由组件组成的
Android系统有四个重要的组件,分别是Activity、Service、BroadcaseReceiver和ContentProvider

11 4.2 Android组件 Activity Service Service用于没有用户界面,但需要长时间在后台运行的应用
Activity是Android程序的呈现层,显示可视化的用户界面,并接收与用户交互所产生的界面事件 Android应用程序可以包含一个或多个Activity,一般在程序启动后会呈现一个Activity,用于提示用户程序已经正常启动 在界面上的表现形式:全屏窗体,非全屏悬浮窗体,对话框 Service Service用于没有用户界面,但需要长时间在后台运行的应用

12 4.2 Android组件 BroadcaseReceiver BroadcaseReceiver是用来接受并响应广播消息的组件
不包含任何用户界面 可以通过启动Activity或者Notification通知用户接收到重要信息 Notification能够通过多种方法提示用户,包括闪动背景灯、震动设备、发出声音或在状态栏上放置一个持久的图标

13 4.2 Android组件 ContentProvider
ContentProvider是Android系统提供的一种标准的共享数据的机制,应用程序可以通过ContentProvider访问其他应用程序的私有数据 私有数据可以是存储在文件系统中的文件,也可以是SQLite中的数据库 Android系统内部也提供一些内置的ContentProvider,能够为应用程序提供重要的数据信息

14 4.2 Android组件 组件生命周期 所有Android组件都具有自己的生命周期,是从组件建立到组件销毁的整个过程
在生命周期中,组件会在可见、不可见、活动、非活动等状态中不断变化

15 4.3 Activity生命周期 Activity生命周期 Activity生命周期指Activity从启动到销毁的过程

16 4.3 Activity生命周期 Activity的四种状态的变换关系图

17 4.3 Activity生命周期 Activity栈 遵循“后进先出”的规则

18 4.3 Activity生命周期 事件的回调函数 public class MyActivity extends Activity {
protected void onCreate(Bundle savedInstanceState); protected void onStart(); protected void onRestart(); protected void onResume(); protected void onPause(); protected void onStop(); protected void onDestroy(); }

19 4.3 Activity生命周期 Activity生命周期的事件回调函数 函数 是否 可终止 说明 onCreate() 否
Activity启动后第一个被调用的函数,常用来进行Activity的初始化,例如创建View、绑定数据或恢复信息等。 onStart() 当Activity显示在屏幕上时,该函数被调用。 onRestart() 当Activity从停止状态进入活动状态前,调用该函数。 onResume() 当Activity能够与用户交互,接受用户输入时,该函数被调用。此时的Activity位于Activity栈的栈顶。 onPause() 当Activity进入暂停状态时,该函数被调用。一般用来保存持久的数据或释放占用的资源。 onStop() 当Activity进入停止状态时,该函数被调用。 onDestroy() 在Activity被终止前,即进入非活动状态前,该函数被调用。

20 4.3 Activity生命周期 Activity状态保存/恢复的事件回调函数 函数 是否 可终止 说明
onSaveInstanceState() Android系统因资源不足终止Activity前调用该函数,用以保存Activity的状态信息,供onRestoreInstanceState()或onCreate()恢复之用。 onRestoreInstanceState() 恢复onSaveInstanceState()保存的Activity状态信息,在onStart()和onResume ()之间被调用。

21 4.3 Activity生命周期 Activity事件回调函数的调用顺序 Activity生命周期分类
每种生命周期中包含不同的事件回调函数

22 4.3 Activity生命周期 全生命周期 全生命周期是从Activity建立到销毁的全部过程,始于onCreate(),结束于onDestroy() 使用者通常在onCreate()中初始化Activity所能使用的全局资源和状态,并在onDestroy()中释放这些资源 在一些极端的情况下,Android系统会不调用onDestroy()函数,而直接终止进程

23 4.3 Activity生命周期 可视生命周期 可视生命周期是Activity在界面上从可见到不可见的过程,开始于onStart(),结束于onStop()

24 4.3 Activity生命周期 可视生命周期 onStart()一般用来初始化或启动与更新界面相关的资源
onStop()一般用来暂停或停止一切与更新用户界面相关的线程、计时器和服务 onRestart()函数在onSart()前被调用,用来在Activity从不可见变为可见的过程中,进行一些特定的处理过程 onStart()和onStop()会被多次调用 onStart()和onStop()也经常被用来注册和注销BroadcastReceiver

25 4.3 Activity生命周期 活动生命周期 活动生命周期是Activity在屏幕的最上层,并能够与用户交互的阶段,开始于onResume(),结束于onPause() 在Activity的状态变换过程中onResume()和onPause()经常被调用,因此这两个函数中应使用更为简单、高效的代码

26 4.3 Activity生命周期 活动生命周期 onPause()是第一个被标识为“可终止”的函数
在onPause()返回后,onStop()和onDestroy()随时能被Android系统终止 onPause()常用来保存持久数据,如界面上的用户的输入信息等

27 4.3 Activity生命周期 onPause()和onSaveInstanceState()的区别
这两个函数都可以用来保存界面的用户输入数据,他们的区别在于 onPause()一般用于保存持久性数据,并将数据保存在存储设备上的文件系统或数据库系统中的 onSaveInstanceState()主要用来保存动态的状态信息,信息一般保存在Bundle中 Bundle是能够保存多种格式数据的对象 在onSaveInstanceState()保存在Bundle中的数据,系统在调用onRestoreInstanceState()和onCreate()时,会同样利用Bundle将数据传递给函数

28 4.3 Activity生命周期 举例:建立一个新的Android工程 工程名称:ActivityLifeCycle
包名称:edu.hrbeu.ActivityLifeCycle Activity名称:ActivityLifeCycle

29 4.3 Activity生命周期 ActivityLifeCycle.java文件的代码
package edu.hrbeu.ActivityLifeCycle; import android.app.Activity; import android.os.Bundle; import android.util.Log; public class ActivityLifeCycle extends Activity { private static String TAG = "LIFTCYCLE"; @Override //完全生命周期开始时被调用,初始化Activity public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Log.i(TAG, "(1) onCreate()"); } @Override //可视生命周期开始时被调用,对用户界面进行必要的更改 public void onStart() { super.onStart(); Log.i(TAG, "(2) onStart()");

30 4.3 Activity生命周期 ActivityLifeCycle.java文件的代码 }
@Override //在onStart()后被调用,用于恢复onSaveInstanceState()保存的用户界面信息 public void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); Log.i(TAG, "(3) onRestoreInstanceState()"); @Override //在活动生命周期开始时被调用,恢复被onPause()停止的用于界面更新的资源 public void onResume() { super.onResume(); Log.i(TAG, "(4) onResume()"); 33. @Override // 在onResume()后被调用,保存界面信息 public void onSaveInstanceState(Bundle savedInstanceState) {

31 4.3 Activity生命周期 ActivityLifeCycle.java文件的代码
super.onSaveInstanceState(savedInstanceState); Log.i(TAG, "(5) onSaveInstanceState()"); } @Override //在重新进入可视生命周期前被调用,载入界面所需要的更改信息 public void onRestart() { super.onRestart(); Log.i(TAG, "(6) onRestart()"); @Override //在活动生命周期结束时被调用,用来保存持久的数据或释放占用的资源 public void onPause() { super.onPause(); Log.i(TAG, “(7) onPause()”);、 51. @Override //在可视生命周期结束时被调用,一般用来保存持久的数据或释放占用的资源

32 4.3 Activity生命周期 ActivityLifeCycle.java文件的代码
上面的程序主要通过在生命周期函数中添加“日志点”的方法进行调试,程序的运行结果将会显示在LogCat中 为了显示结果易于观察和分析,在LogCat设置过滤器LifeCycleFilter,过滤方法选择by Log Tag,过滤关键字为LIFTCYCLE public void onStop() { super.onStop(); Log.i(TAG, "(8) onStop()"); } @Override //在完全生命周期结束时被调用,释放资源,包括线程、数据连接等 public void onDestroy() { super.onDestroy(); Log.i(TAG, "(9) onDestroy()");

33 4.3 Activity生命周期 全生命周期 LogCat输出结果 启动和关闭ActivityLifeCycle 的LogCat输出
按下模拟器的“返回键” 关闭ActivityLifeCycle LogCat输出结果

34 4.3 Activity生命周期 全生命周期 函数的调用顺序:onCreate() → onStart()→ onResume() → onPause()→ onStop()→ onDestroy() 调用onCreate()函数分配资源 调用onStart()将Activity显示在屏幕上 调用onResume()获取屏幕焦点 调用onPause()、onStop()和onDestroy(),释放资源并销毁进程

35 4.3 Activity生命周期 可视生命周期 状态转换 可视生命周期的LogCat输出结果 启动ActivityLifeCycle
按“呼出/接听键”启动内置的拨号程序 再通过“返回键”退出拨号程序 ActivityLifeCycle重新显示在屏幕中 可视生命周期的LogCat输出结果

36 4.3 Activity生命周期 可视生命周期 函数的调用顺序: onSaveInstanceState ()→ onPause()→ onStop() → onRestart()→ onStart()→ onResume() 调用onSaveInstanceState()函数保存Activity状态 调用onPause()和onStop(),停止对不可见Activity的更新 调用onRestart()恢复需要界面上需要更新的信息 调用onStart()和onResume()重新显示Activity,并接受用户交互

37 4.3 Activity生命周期 可视生命周期 开启IDA的可视生命周期:Dev Tools → Development Settings → Immediately destroy activities (IDA)下开启IDA

38 4.3 Activity生命周期 可视生命周期 开启IDA的可视生命周期的函数调用顺序:onSaveInstanceState()→ onPause()→ onStop()→ onDestroy()→ onCreate()→ onStart()→ onRestoreInstanceState()→ onResume() 调用onRestoreInstanceState()恢复Activity销毁前的状态 其他的函数调用顺序与程序启动过程的调用顺序相同

39 4.3 Activity生命周期 活动生命周期 活动生命周期的LogCat输出 LogCat的输出结果
启动ActivityLifeCycle 通过“挂断键”使模拟器进入休眠状态 再通过“挂断键”唤醒模拟器 LogCat的输出结果

40 4.3 Activity生命周期 活动生命周期 函数调用顺序如下:onSaveInstanceState() → onPause() → onResume() 调用onSaveInstanceState ()保存Activity的状态 调用onPause()停止与用户交互 调用onResume()恢复与用户的交互

41 4.4 程序调试 Android系统提供了两种调试工具LogCat和DevTools,用于定位、分析及修复程序中出现的错误
LogCat是用来获取系统日志信息的工具,并可以显示在Eclipse集成开发环境中 功能:能够捕获的信息包括Dalvik虚拟机产生的信息、进程信息、ActivityManager信息、PackagerManager信息、Homeloader 信息、WindowsManager信息、Android运行时信息和应用程序信息等

42 4.4 程序调试 4.4.1 LogCat 打开方式:Window → Show View → Other
打开Show View的选择菜单,然后在Andoird → LogCat中选择LogCat

43 4.4 程序调试 4.4.1 LogCat LogCat打开后,便显示在Eclipse的下方区域

44 4.4 程序调试 4.4.1 LogCat LogCat的右上方的五个字母表示五种不同类型的日志信息 ,他们的级别依次增高
[V]:详细(Verbose)信息 [D]:调试(Debug)信息 [I]:通告(Info)信息 [W]:警告(Warn)信息 [E] :错误(Error)信息

45 4.4 程序调试 4.4.1 LogCat 在LogCat中,用户可以通过五个字母图标选择显示的信息类型,级别高于所选类型的信息也会在LogCat中显示,但级别低于所选类型的信息则不会被显示

46 4.4 程序调试 4.4.1 LogCat LogCat提供了“过滤”功能,在右上角的“+”号和“-”号,分别是添加和删除过滤器。用户可以根据日志信息的标签(Tag)、产生日志的进程编号(Pid)或信息等级(Level),对显示的日志内容进行过滤

47 4.4 程序调试 4.4.1 LogCat 程序调试原理 引入android.util.Log包
使用Log.v()、 Log.d()、 Log.i() 、Log.w() 和 Log.e()五个函数在程序中设置“日志点” 当程序运行到“日志点”时,应用程序的日志信息便被发送到LogCat中 判断“日志点”信息与预期的内容是否一致 进而判断程序是否存在错误 Log.v()用来记录详细信息,Log.d()用来记录调试信息,Log.i()用来记录通告信息, Log.w()用来记录警告信息,Log.e()用来记录通错误信息

48 4.4 程序调试 4.4.1 LogCat 演示了Log类的具体使用方法 package edu.hrbeu.LogCat;
import android.app.Activity; import android.os.Bundle; import android.util.Log; public class LogCat extends Activity { final static String TAG = "LOGCAT"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main);

49 4.4 程序调试 4.4.1 LogCat 程序第5行引入android.util.Log包
第14行记录一个详细信息,Log.v()函数的第一个参数是日志的标签,第二个参数是实际的信息内容 第15行到第18行分别产生了调试信息、通告信息、警告信息和错误信息 Log.v(TAG,"Verbose"); Log.d(TAG,"Debug"); Log.i(TAG,"Info"); Log.w(TAG,"Warn"); Log.e(TAG,"Error"); }

50 4.4 程序调试 4.4.1 LogCat LogCat工程的运行结果 LogCat对不同类型的信息使用了不同的颜色加以区别

51 4.4 程序调试 4.4.1 LogCat 添加过滤器 单击“+” 填入过滤器的名称:LogcatFilter

52 4.4 程序调试 4.4.1 LogCat LogCat过滤后的输入结果
无论什么类型的日志信息,属于哪一个进程,只要标签为LOGCAT,都将显示在LogcatFilter区域内

53 4.4 程序调试 4.4.2 DevTools DevTools是用于调试和测试的工具
包括了一系列用户各种用途的小工具:Development Settings、Exception Browser、Google Login Service、Instrumentation、Media Scanner、Package Browser、Pointer Location、Raw Image Viewer、Running processes和Terminal Emulator

54 4.4 程序调试 4.4.2 DevTools DevTools的使用界面

55 4.4 程序调试 4.4.2 DevTools Development Settings
单击功能前面选择框,出现绿色的“对号”表示功能启用 模拟器会自动保存设置

56 4.4 程序调试 4.4.2 DevTools Development 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 允许同时运行进程的数量上限。

57 4.4 程序调试 4.4.2 DevTools Immediately destroy activites
Activity进入停止状态后立即销毁,用于测试在函数 onSaveInstanceState()、onRestoreInstanceState()和onCreate()中的代码。 Show CPU usage 在屏幕顶端显示CPU使用率,上层红线显示总的CPU使用率,下层绿线显示当前进程的CPU使用率。 Show background 应用程序没有Activity显示时,直接显示背景面板,一般这种情况仅在调试时出现。 Show Sleep state on LED 在休眠状态下开启LED。 Windows Animation Scale Transition Animation Light Hinting Show GTalk service connection status 显示GTalk服务连接状态。

58 4.4 程序调试 4.4.2 DevTools Package Browser
Package Browser是Android系统中的程序包查看工具,能够详细显示已经安装到Android系统中的程序信息,包括包名称、应用程序名称、图标、进程、用户ID、版本、apk文件保存位置和数据文件保存位置 进一步查看应用程序所包含Activity、Service、BroadcastReceiver和Provider的详细信息

59 4.4 程序调试 4.4.2 DevTools Package Browser查看ActivityLifeCycle程序的相关信息

60 4.4 程序调试 4.4.2 DevTools Pointer Location
Pointer Location是屏幕点位置查看工具,能够显示触摸点的X轴坐标和Y轴坐标 Pointer Location的使用画面

61 4.4 程序调试 4.4.2 DevTools Running processes
Running processes能够查看在Android系统中正在运行的进程,并能查看进程的详细信息,包括进程名称和进程所调用的程序包 Andoird模拟器缺省情况下运行的进程和com.android.phone进程的详细信息

62 4.4 程序调试 4.4.2 DevTools Andoird模拟器缺省情况下运行的进程 com.android.phone进程的详细信息

63 4.4 程序调试 4.4.2 DevTools Terminal Emulator
Terminal Emulator可以打开一个连接底层Linux系统的虚拟终端,但具有的权限较低,且不支持提升权限的su命令 如果需要使用root权限的命令,可以使用ADB工具 右图是Terminal Emulator运行时的画面,输入ls命令,显示出根目录下的所有文件夹

64 习题: 1. 简述Android系统前台进程、可见进程、服务进程、后台进程和空进程的优先级排序原因。
2. 简述Android系统的四种基本组件Activity、Service、BroadcaseReceiver和ContentProvider的用途。 3. 简述Activity生命周期的四种状态,以及状态之间的变换关系。 4. 简述Activity事件回调函数的作用和调用顺序。


Download ppt "第4章 Android生命周期."

Similar presentations


Ads by Google