资源描述
本章(bn zhn)学习目标: 了解Android系统的四大基本组件(z jin) 了解Android系统的进程优先级的变化方式 了解Activity的生命周期中各状态的变化关系 掌握Activity事件回调函数的作用和调用顺序 掌握Android应用程序的调试方法和工具第一页,共57页。4.1 Android组件(z jin) Android系统四大(s d)组件 (调用的基本模块) Activity Android程序的呈现层,显示可视化的用户界面,并接收与用户交互所产生的界面事件 Android应用程序可以包含一个或多个Activity,一般需要指定一个程序启动时显示的Activity Service Service一般用于没有用户界面,但需要长时间在后台运行的应用 可公开Service的程序接口,供其他进程调用第二页,共57页。4.1 Android组件(z jin) Android系统四大组件 (调用的基本模块) BroadcaseReceiver 用来接收广播消息的组件,不包含任何用户界面 可以启动Activity或者Notification通知用户接收到重要信息 Notification能够通过多种方法提示用户,包括闪动背景灯、震动设备、发出声音或在状态栏上放置一个图标 ContentProvider 是Android系统提供的一种标准的共享数据的机制,其他程序通过ContentProvider访问程序的私有数据 Android系统内部(nib)提供一些内置的ContentProvider,能够为应用程序提供重要的数据信息 联系人信息 通话记录第三页,共57页。4.2 程序(chngx)生命周期 Android系统的进程( jnchng)优先级从高到低分别为: 前台进程( jnchng) 可见进程( jnchng) 服务进程( jnchng) 后台进程( jnchng) 空进程( jnchng)第四页,共57页。4.2 程序(chngx)生命周期前台进程前台进程是Android系统中最重要的进程进程中的Activity正在与用户进行交互;Service被Activity调用,而且这个(zh ge)Activity正在与用户进行交互;Service正在执行声明周期中的回调函数,如onCreate()、onStart()或onDestroy();进程的BroadcastReceiver正在执行onReceive()函数;第五页,共57页。4.2 程序(chngx)生命周期 可见进程 可见进程指部分程序界面能够被用户看见,却不在前台与用户交互,不响应界面事件的进程 如果一个进程包含Service,且这个Service正在被用户可见的Activity调用,此进程同样被视为可见进程 服务进程 包含已启动服务的进程 Android系统除非不能保证前台进程或可视进程所必要的资源,否则不强行(qingxng)清除服务进程第六页,共57页。4.2 程序(chngx)生命周期 后台进程 指不包含任何已经启动的服务,而且没有任何用户(yngh)可见的Activity的进程 Android系统中一般存在数量较多的后台进程 空进程 空进程是不包含任何活跃组件的进程第七页,共57页。4.2 程序(chngx)生命周期 优先级决定与变化规则 进程( jnchng)的优先级取决于所有组件中的优先级最高的部分 进程( jnchng)的优先级会根据与其他进程( jnchng)的依赖关系而变化第八页,共57页。4.3 Android组件(z jin) 组件生命周期 所有Android组件都具有自己的生命周期,是从组件建立到组件销毁的整个过程 在生命周期中,组件会在可见(kjin)、不可见(kjin)、活动、非活动等状态中不断变化第九页,共57页。4.3 Activity生命周期 Activity生命周期 Activity生命周期指Activity从启动到销毁的过程 Activity表现为四种状态 活动状态,Activity在用户界面中处于最上层,完全能不用户看到,能够与用户进行交互( jioh) 暂停状态,Activity在界面上被部分遮挡,该Activity不再处于用户界面的最上层,且不能够与用户进行交互( jioh) 停止状态,Activity在界面上完全不能被用户看到,也就是说这个Activity被其他Activity全部遮挡 非活动状态,不在以上三种状态中的Activity则处于非活动状态第十页,共57页。4.3 Activity生命周期 Activity的四种状态(zhungti)的变换关系图第十一页,共57页。4.3 Activity生命周期 Activity栈 遵循(zn xn)“后进先出”的规则第十二页,共57页。4.3 Activity生命周期 随着Activity自身(zshn)状态的变化,Android系统会调用不同的事件回调函数 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(); 第十三页,共57页。4.3 Activity生命周期 函数(hnsh) Activity生命周期的事件回调函数(hnsh) 函数函数是否是否可终止可终止说明说明onCreate()否Activity启动后第一个被调用的函数,常用来进行Activity的初始化,例如创建View、绑定数据或恢复信息等。onStart()否当Activity显示在屏幕上时,该函数被调用。onRestart()否当Activity从停止状态进入活动状态前,调用该函数。onResume()否当Activity可以接受用户输入时,该函数被调用。onPause()否当Activity进入暂停状态时,该函数被调用。主要用来保存持久数据、关闭动画、释放CPU资源等。该函数中的代码必须简短,因为另一个Activity必须等待该函数执行完毕后才能显示在界面上。onStop()是当Activity不对用户可见后,该函数被调用,Activity进入停止状态。onDestroy()是在Activity被终止前,即进入非活动状态前,该函数被调用。有两种情况该函数会被调用:(1)当程序主动调用finish()函数;(2)程序被Android系统终结。第十四页,共57页。4.3 Activity生命周期 onRestoreInstanceState()和onSaveInstanceState() 不属于生命周期的事件回调函数,但可以用于保存和恢复Activity的界面临时信息 onSaveInstanceState()会将界面临时信息保存在Bundle中,onCreate()和onRestoreInstanceState()都可以恢复这些保存的信息 简化的办法是使用onCreate() 恢复,但有些(yuxi)特殊的情况下还是需要使用onRestoreInstanceState()函数恢复 必须在界面完全初始化完毕后才能进行的操作 或需要由子类来确定是否采用缺省设置等函数函数说明说明onSaveInstanceState()暂停或停止Activity前调用该函数,用以保存Activity的临时状态信息onRestoreInstanceState()恢复onSaveInstanceState()保存的Activity状态信息。第十五页,共57页。4.3 Activity生命周期 Activity事件回调函数的调用顺序 Activity生命周期分类 Activity的生命周期可分为全生命周期、可视生命周期和活动生命周期 每种生命周期中包含(bohn)不同的事件回调函数第十六页,共57页。4.3 Activity生命周期 全生命周期 全生命周期是从Activity建立到销毁的全部(qunb)过程,始于onCreate(),结束于onDestroy() 使用者通常在onCreate()中初始化Activity所能使用的全局资源和状态,并在onDestroy()中释放这些资源 在一些极端的情况下,Android系统会不调用onDestroy()函数,而直接终止进程第十七页,共57页。4.3 Activity生命周期 可视生命周期 可视生命周期是Activity在界面( jimin)上从可见到不可见的过程,开始于onStart(),结束于onStop()第十八页,共57页。4.3 Activity生命周期 可视生命周期 onStart() 一般用来初始化或启动与更新界面相关的资源 onStop() 一般用来暂停或停止一切(yqi)与更新用户界面相关的线程、计时器和服务 onRestart() 函数在onSart()前被调用,用来在Activity从不可见变为可见的过程中,进行一些特定的处理过程 onStart()和onStop()会被多次调用第十九页,共57页。4.3 Activity生命周期 活动生命周期 活动生命周期是Activity在屏幕(pngm)的最上层,并能够与用户交互的阶段,开始于onResume(),结束于onPause() 在Activity的状态变换过程中onResume()和onPause()经常被调用,因此这两个函数中应使用更为简单、高效的代码第二十页,共57页。4.3 Activity生命周期 onPause()和onSaveInstanceState() 这两个函数都可以用来保存界面的用户输入(shr)数据 onPause()一般用于保存持久性数据,并将数据保存在存储设备上的文件系统或数据库系统中的 onSaveInstanceState()主要用来保存动态的状态信息,信息一般保存在Bundle中 Bundle是能够保存多种格式数据的对象,系统在调用onRestoreInstanceState()和onCreate()时,会同样利用Bundle将数据传递给函数第二十一页,共57页。4.3 Activity生命周期 活动生命周期 下面以ActivityLifeCycle示例来进行( jnxng)说明,ActivityLifeCycle示例的运行界面第二十二页,共57页。4.3 Activity生命周期 ActivityLifeCycleActivity.java文件(wnjin)的全部代码 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();第二十三页,共57页。4.3 Activity生命周期 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) 第二十四页,共57页。4.3 Activity生命周期 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 /在可视生命周期结束时被调用,一般用来保存持久的数据或释放占用的资源第二十五页,共57页。4.3 Activity生命周期 ActivityLifeCycle.java文件的代码 上面的程序主要通过在生命周期函数中添加(tin ji)“日志点”的方法进行调试,程序的运行结果将会显示在LogCat中 为了显示结果易于观察和分析,在LogCat设置过滤器LifeCycleFilter,过滤方法选择by Log Tag,过滤关键字为LIFTCYCLEpublic void onStop() super.onStop(); Log.i(TAG, (8) onStop(); Override /在完全生命周期结束时被调用,释放资源,包括线程、数据连接等 public void onDestroy() super.onDestroy(); Log.i(TAG, (9) onDestroy(); 第二十六页,共57页。4.3 Activity生命周期 全生命周期 启动和关闭ActivityLifeCycle 的LogCat输出(shch) 启动ActivityLifeCycle 按下模拟器的“返回键” 关闭ActivityLifeCycle LogCat输出(shch)结果第二十七页,共57页。4.3 Activity生命周期 全生命周期 函数的调用(dioyng)顺序: (1)onCreate (2)onStart (4)onResume (7)onPause (8)onStop (9)onDestroy。第二十八页,共57页。4.3 Activity生命周期 可视生命周期 状态转换 启动ActivityLifeCycle 按“呼出/接听键”启动内置的拨号程序(chngx) 再通过“返回键”退出拨号程序(chngx) ActivityLifeCycle重新显示在屏幕中 可视生命周期的LogCat输出结果第二十九页,共57页。4.3 Activity生命周期 可视生命周期 函数的调用(dioyng)顺序: (1)onCreate (2)onStart (4)onResume (7)onPause (5)onSaveInstanceState (8)onStop (6)onRestart (2)onStart (4)onResume第三十页,共57页。4.3 Activity生命周期 可视生命周期 开启(kiq)IDA的可视生命周期:Dev Tools Development Settings Immediately destroy activities (IDA)下开启(kiq)IDA第三十一页,共57页。4.4 程序调试 Android系统提供了两种调试工具LogCat和DevTools,用于定位(dngwi)、分析及修复程序中出现的错误 LogCat LogCat是用来获取系统日志信息的工具,并可以显示在Eclipse集成开发环境中 功能:能够捕获的信息包括Dalvik虚拟机产生的信息、进程信息、ActivityManager信息、PackagerManager信息、Homeloader 信息、WindowsManager信息、Android运行时信息和应用程序信息等第三十二页,共57页。4.4 程序调试 4.4.1 LogCat 打开(d ki)方式:Window Show View Other 打开(d ki)Show View的选择菜单,然后在Andoird LogCat中选择LogCat第三十三页,共57页。4.4 程序调试 4.4.1 LogCat LogCat打开后,便显示(xinsh)在Eclipse的下方区域第三十四页,共57页。4.4 程序调试 4.4.1 LogCat LogCat的右上方的五个字母表示五种不同类型的日志信息(xnx) ,级别依次增高 V:详细(Verbose)信息(xnx) D:调试(Debug)信息(xnx) I:通告(Info)信息(xnx) W:警告(Warn)信息(xnx) E :错误(Error)信息(xnx)第三十五页,共57页。4.4 程序调试 4.4.1 LogCat LogCat提供了“过滤”功能(gngnng) 在右上角的“+”号和“-”号,分别是添加和删除过滤器。用户可以根据日志信息的标签(Tag)、产生日志的进程编号(Pid)或信息等级(Level),对显示的日志内容进行过滤第三十六页,共57页。4.4 程序调试4.4.1 LogCat程序调试原理引入android.util.Log包使用Log.v()、 Log.d()、 Log.i() 、Log.w() 和 Log.e()五个函数在程序中设置“日志点”当程序运行到“日志点”时,应用程序的日志信息便被发送到LogCat中,判断“日志点”信息与预期的内容是否(sh fu)一致,进而判断程序是否(sh fu)存在错误第三十七页,共57页。4.4 程序调试 4.4.1 LogCat 演示了Log类的具体(jt)使用方法package edu.hrbeu.LogCat;import android.app.Activity;import android.os.Bundle;import android.util.Log;import android.util.Log;public class LogCatActivity extends Activity final static String TAG = LOGCAT;Overridepublic void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);setContentView(R.layout.main); Log.v(TAG,Verbose);Log.d(TAG,Debug);Log.i(TAG,Info);Log.w(TAG,Warn);Log.e(TAG,Error);第三十八页,共57页。4.4 程序调试 4.4.1 LogCat LogCat工程的运行结果 LogCat对不同类型的信息使用了不同的颜色(yns)加以区别第三十九页,共57页。4.4 程序调试 4.4.1 LogCat 添加过滤器 单击“+” 填入过滤器的名称:LogcatFilter 设置(shzh)过滤条件为“标签=LOGCAT”第四十页,共57页。4.4 程序调试 4.4.1 LogCat LogCat过滤(gul)后的输入结果 无论什么类型的日志信息,属于哪一个进程,只要标签为LOGCAT,都将显示在LogcatFilter区域内第四十一页,共57页。4.4 程序调试 4.4.2 DevTools DevTools是用于调试和测试(csh)的工具 包括了一系列用户各种用途的小工具:Development Settings、Exception Browser、Google Login Service、Instrumentation、Media Scanner、Package Browser、Pointer Location、Raw Image Viewer、Running processes和Terminal Emulator第四十二页,共57页。4.4 程序调试 4.4.2 DevTools DevTools的使用(shyng)界面第四十三页,共57页。4.4 程序调试 4.4.2 DevTools Development Settings 如果希望启动Development Settings中某项功能,只需要点击功能前面选择框出现绿色的“对号”表示功能启用。 功能启用后,模拟器会自动保存设置,即使再次启动模拟器用户的选择内容(nirng)仍会存在 第四十四页,共57页。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 processes在屏幕右上角显示运行中的进程。Show screen updates选中该选项时,界面上任何被重绘的矩形区域会闪现粉红色,有利于发现界面中不必要的重绘区域。No App Process limit允许同时运行进程的数量上限。Immediately destroy activitiesActivity进入停止状态后立即销毁,用于测试在函数 onSaveInstanceState()、onRestoreInstanceState()和onCreate()中的代码。Show CPU usage在屏幕顶端显示CPU使用率,上层红线显示总的CPU使用率,下层绿线显示当前进程的CPU使用率。Show background应用程序没有Activity显示时,直接显示背景面板,一般这种情况仅在调试时出现。Show sleep state on LED在休眠状态下开启LED。 Windows Animation Scale窗口动画模式Transition Animation Scale渐变动画模式Light Hinting提示模式Show GTalk service connection status显示GTalk服务连接状态。第四十五页,共57页。4.4 程序调试 4.4.2 DevTools Package Browser Package Browser是Android系统中的程序包查看工具,能够(nnggu)详细显示已经安装到Android系统中的程序信息,包括包名称、应用程序名称、图标、进程、用户ID、版本、apk文件保存位置和数据文件保存位置 进一步查看应用程序所包含Activity、Service、BroadcastReceiver和Provider的详细信息第四十六页,共57页。4.4 程序调试 4.4.2 DevTools 在Package Browser中查看Android keyboard程序(chngx)的相关信息第四十七页,共57页。4.4 程序调试 4.4.2 DevTools Pointer Location Pointer Location是屏幕点位置查看工具,能够显示触摸点的X轴坐标和Y轴坐标 Pointer Location的使用(shyng)画面第四十八页,共57页。4.4 程序调试 4.4.2 DevTools Running processes Running processes能够查看在Android系统中正在运行的进程,并能查看进程的详细信息,包括进程名称和进程所调用(dioyng)的程序包 Andoird模拟器缺省情况下运行的进程和com.android.phone进程的详细信息第四十九页,共57页。4.4 程序调试 4.4.2 DevTools Running processes Android模拟器所运行(ynxng)进程的列表和com.android.phone进程的详细信息 第五十页,共57页。4.4 程序调试4.4.2 DevToolsConnectivityConnectivity允许用户控制Wifi、屏幕锁定界面、MMS和导航的开启与关闭,并可以设置(shzh)Wifi和屏幕锁定界面的开启与关闭的周期。 第五十一页,共57页。4.4 程序调试 4.4.2 DevTools Configuration Configuration中详细列出了Android系统的配置信息,包括屏幕分辨率、字体缩放比例、屏幕初始方向(fngxing)、触屏类型、导航、本地语言和键盘等信息 第五十二页,共57页。4.4 程序调试 4.4.2 DevTools Bad Behavior Bad Behavior中可以模拟(mn)各种程序崩溃和失去响应的情况,如主程序崩溃、系统服务崩溃、启动Service时失去响应和启动Activity时失去响应等等 第五十三页,共57页。4.4 程序调试 4.4.2 DevTools Bad Behavior Bad Behavior选项 选项选项说明说明Crash the main app thread应用程序主线程崩溃Crash an auxiliary app thead应用程序工作线程崩溃Crash the native process本地进程崩溃Crash the system server系统服务器崩溃Report a WTF condition报告WTFANR(Stop responding for 20 seconds)应用程序无响应(Application Not Responding, ANR)20秒ANR starting an Activity启动Activity时应用程序无响应ANR starting a broadcast Intent发送广播消息时应用程序无响应ANR starting a Service启动Service时应用程序无响应System ANR (in ActivityManager)Activity管理器级别ANRWedge system (5 minite system ANR) Wedge在5分钟内无响应第五十四页,共57页。习题(xt): 简述Android系统前台进程、可见进程、服务进程、后台进程和空进程的优先级排序原因。 简述Android系统的四种基本组件Activity、Service、BroadcaseReceiver和ContentProvider的用途。 简述Activity生命周期的四种状态,以及状态之间的变换关系。 简述Activity事件回调函数(hnsh)的作用和调用顺序。第五十五页,共57页。感谢您的观赏(gunshng)!第五十六页,共57页。NoImage内容(nirng)总结本章学习目标:。非活动状态,不在以上三种状态中的Activity则处于非活动状态。该函数(hnsh)中的代码必须简短,因为另一个Activity必须等待该函数(hnsh)执行完毕后才能显示在界面上。下面以ActivityLifeCycle示例来进行说明,ActivityLifeCycle示例的运行界面。Log.e(TAG,Error)。Pointer Location是屏幕点位置查看工具,能够显示触摸点的X轴坐标和Y轴坐标第五十七页,共57页。
展开阅读全文