第2章-Android生命周期与组件通信-《Android程序设计教程》课件.ppt
-
资源ID:73605799
资源大小:2.31MB
全文页数:85页
- 资源格式: PPT
下载积分:12金币
快捷下载

会员登录下载
微信登录下载
三方登录下载:
微信扫一扫登录
友情提示
2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
|
第2章-Android生命周期与组件通信-《Android程序设计教程》课件.ppt
第第二二章章 Android Android生命周期与组生命周期与组件通信件通信1主要内容主要内容2.1 Android2.1 Android生命周期生命周期2.2 Activity2.2 Activity组件组件2.3 Intent2.3 Intent信使信使2n程序的生命周期p程序的生命周期是在Android系统中进程从启动到终止的所有阶段,也就是Android程序启动到停止的全过程。p程序的生命周期由Android系统进行调度和控制的。nAndroid系统中的进程优先级由高到低p前台进程p可见进程p服务进程p后台进程p空进程3n前台进程前台进程p前台进程是Android系统中最重要的进程,是与用户正在交互的进程,包含以下四种情况。n进程中的Activity正在与用户进行交互。n进程服务被Activity调用,而且这个Activity正在与用户进行交互。n进程服务正在执行声明周期中的回调函数,如onCreate()、onStart()或onDestroy()。n进程的BroadcastReceiver正在执行onReceive()函数。pAndroid系统在多个前台进程同时运行时,可能会出现资源不足的情况,此时会清除部分前台进程,保证主要的用户界面能够及时响应。4n服务进程服务进程p服务进程是指包含已启动服务的进程p没有用户界面p在后台长期运行pAndroid系统除非不能保证前台进程或可视进程所必要的资源,否则不强行清除服务进程n后台进程后台进程p后台进程是指不包含任何已经启动的服务,而且没有任何用户可见的Activity的进程pAndroid系统中一般存在数量较多的后台进程,在系统资源紧张时,系统将优先清除用户较长时间没有见到的后台进程6n空进程空进程p空进程是不包含任何活跃组件的进程p空进程在系统资源紧张时会被首先清除p但为了提高Android系统应用程序的启动速度,Android系统会将空进程保存在系统内存用,在用户重新启动该程序时,空进程会被重新使用n除了以上的优先级外,以下两方面也决定他们的优先级p进程的优先级取决于所有组件中的优先级最高的部分p进程的优先级会根据与其他进程的依赖关系而变化7 2.2.1 Android2.2.1 Android组件简介组件简介2.2.2 Activity2.2.2 Activity生命周期生命周期2.2.3 Task2.2.3 Task与与ActivityActivity栈栈2.2.4 Activity2.2.4 Activity基本状态基本状态82.2.1 Android2.2.1 Android组件简介组件简介nBroadcastReceiverpBroadcastReceiver是用来接受并响应广播消息的组件。p不包含任何用户界面。p可以通过启动Activity或者Notification通知用户接收到重要信息。pNotification能够通过多种方法提示用户,包括闪动背景灯、震动设备、发出声音或在状态栏上放置一个持久的图标。nContentProviderpContentProvider是Android系统提供的一种标准的共享数据的机制,应用程序可以通过ContentProvider访问其他应用程序的私有数据。p私有数据可以是存储在文件系统中的文件,也可以是SQLite中的数据库。pAndroid系统内部也提供一些内置的ContentProvider,能够为应用程序提供重要的数据信息。102.2.2 Activity2.2.2 Activity生命周期生命周期nActivity生命周期pActivity生命周期指Activity从启动到销毁的过程。pActivity表现为四种状态,分别是活动状态、暂停状态、停止状态和非活动状态。p活动状态,Activity在用户界面中处于最上层,完全能用户看到,能够与用户进行交互。p暂停状态,Activity在界面上被部分遮挡,该Activity不再处于用户界面的最上层,且不能够与用户进行交互。p停止状态,Activity在界面上完全不能被用户看到,也就是说这个Activity被其他Activity全部遮挡。p非活动状态不在以上三种状态中的Activity则处于非活动状态。11n举例:建立一个新的Android工程n工程名称:Chp02_NewActivityn包名称:com.NewActivitynActivity名称:NewActivity132.2.2 Activity生命周期nNewActivity.java文件的代码n从代码第8行可以看出,一个Activity就是一个Java类,而且必须继承自Activity基类。n代码第13行复写了基类的onCreate()方法,并且在14行调用了父类的onCreate()方法,这在创建Activity时同样是必须的,在Activity第一次运行时总会首先执行onCreate()方法,此方法作用类似于其它面向对象语言中的构造函数。n代码15行采用setContentView()方法设置布局文件,n代码16和17行的findViewById()方法功能是通过控件ID属性获得所需的控件对象,此方法返回View类,View类是android系统的控件基类,可以通过强制类型转换转化成所需的控件对象。n代码18行和19行完成相应控件显示文本的设置。20.21.15nAndroidManifest.xml文件中声明Activity的代码如下:2.2.2 Activity生命周期1 2456789 162.2.2 Activity生命周期n在创建的Activity上可以按照需要布局必要的界面控件,如上面的Activity上添加了一个按钮(Button)和一个文本框(TextView),其声明的代码如下所示:1 6 182.2.2 Activity生命周期n属性android:layout_width定义控件横向宽度,属性android:layout_height定义控件纵向高度,属性android:layout_width和属性android:layout_height的可选值均为fill_parent与wrap_content。fill_parent值代表填充父控件,wrap_content值代表按照内容填充。属性android:id定义控件唯一标识名称,“+id”告诉系统在R.java文件中生成相应的值。n在生命周期中起重要作用的是它的事件回调函数。Activity提供了七个生命周期的事件回调函数,在这些事件回调函数中添加相应的功能代码可以实现或者完成相应的功能。192.2.2 Activity2.2.2 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.202.2.2 Activity2.2.2 Activity生命周期生命周期nActivity生命周期的事件回调函数函数函数是否是否可终止可终止说明说明onCreate()否Activity启动后第一个被调用的函数,常用来进行Activity的初始化,例如创建View、绑定数据或恢复信息等。onStart()否当Activity显示在屏幕上时,该函数被调用。onRestart()否当Activity从停止状态进入活动状态前,调用该函数。onResume()否当Activity能够与用户交互,接受用户输入时,该函数被调用。此时的Activity位于Activity栈的栈顶。onPause()是当Activity进入暂停状态时,该函数被调用。一般用来保存持久的数据或释放占用的资源。onStop()是当Activity进入停止状态时,该函数被调用。onDestroy()是在Activity被终止前,即进入非活动状态前,该函数被调用。212.2.2 Activity生命周期nActivity状态保存/恢复的事件回调函数函数函数是否是否可终止可终止说明说明onSaveInstanceState()否Android系统因资源不足终止Activity前调用该函 数,用 以 保 存 Activity的 状 态 信 息,供 onRestoreInstanceState()或onCreate()恢复之用。onRestoreInstanceState()否恢复onSaveInstanceState()保存的Activity状态信息,在onStart()和onResume()之间被调用。222.2.2 Activity生命周期n全生命周期n函数的调用顺序:onCreate()onStart()onResume()onPause()onStop()onDestroy()n调用onCreate()函数分配资源n调用onStart()将Activity显示在屏幕上n调用onResume()获取屏幕焦点n调用onPause()、onStop()和onDestroy(),释放资源并销毁进程242.2.2 Activity生命周期n全生命周期n运行程序,启动MainActivity完成后,查看日志过滤器中的System.out信息如图2.2.2(a)。如果此时再按下模拟器的返回键,则相当于关闭了MainActivity,日志过滤器中的System.out信息变成了如图2.2.2(b)。n图2.2.2(a)MainActivity启动日志n图2.2.2(b)MainActivity全生命周期日志252.2.2 Activity生命周期n可视生命周期n可视生存期(Visible Lifetime)是指从调用onStart()开始到调用onStop()结束之间的周期阶段。在这段时间里,Activity对用户是可见的,但是它有可能不是用户所关注的Activity,或者它可能被部分遮挡了。n当Activity界面不可见的时候更新它是没有意义的,因为这样子消耗了资源却没有起到实际的作用。当Activity界面再次可见的时候,可以使用onStart()或者onRestart()来恢复或者重启这些进程。onRestart()方法在onStart()方法前被调用,用于Activity从不可见变为可见的过程,进行特定处理。Activity经常在可见和不可见的状态多次转换,所以onStart()和onStop()多次被调用。另外,onStart()和onStop()同样也用于注册和销毁BroadcastReceive。262.2.2 Activity生命周期n活动生命周期n活动生存期(Foreground Lifetime)指调用onResume()及其对应的onPause()之间的那段生存期,此时,Activity在屏幕的最上层,能够与用户直接交互。在活动生存期内可以安全的假设onSaveInstanceState()和onPause()会被调用,大部分Activity至少需重写onPause()方法来提交未保存的改动,因为在onPause()之外Activity可能在没有任何警告的情况下被终止。在Activity不在前台的时候也可以根据应用程序的架构,选择挂起线程、进程或者广播接收器。onResume()方法可以是轻量级的,因为要求加载Activity界面的时候可以由onCreate()和onRestoreIntanceState()方法处理。使用onResume()可以重新注册已经使用onPause()停止的广播接收器或者其他进程。onPause()最好也是轻量级的,因为下一个要显示到前台的activity的onRsume()要等当前activity的onPause返回后才执行。所以,尽量让onPause()方法中的代码执行迅速,让onResume()方法中的代码尽可能少,以保证在前台和后台之间进行切换的时候程序能够保持响应。282.2.2 Activity生命周期n活动生命周期n函数调用顺序如下:onSaveInstanceState()onPause()onResume()n调用onSaveInstanceState()保存Activity的状态n调用onPause()停止与用户交互n调用onResume()恢复与用户的交互292.2.2 Activity生命周期nMainActivity.java文件的代码1 /1 /主窗体主窗体2 public class MainActivity extends Activity 2 public class MainActivity extends Activity 3 3 private Button m_btnMainAct=null;private Button m_btnMainAct=null;4 4private TextView m_txtMainAct=null;private TextView m_txtMainAct=null;5 /*Called when the activity is first created.*/5 /*Called when the activity is first created.*/6 Override6 Override7 7 publicpublic void onCreate(Bundle savedInstanceState)void onCreate(Bundle savedInstanceState)8 System.out.println(MainActivity-onCreate);8 System.out.println(MainActivity-onCreate);9 9super.onCreate(savedInstanceState);super.onCreate(savedInstanceState);10 setContentView(R.layout.main);10 setContentView(R.layout.main);11 m_btnMainAct=(Button)findViewById(R.id.btnMainAct);11 m_btnMainAct=(Button)findViewById(R.id.btnMainAct);12 m_txtMainAct=(TextView)findViewById(R.id.txtMainAct);12 m_txtMainAct=(TextView)findViewById(R.id.txtMainAct);13 m_btnMainAct.setOnClickListener(new ButtonListener();13 m_btnMainAct.setOnClickListener(new ButtonListener();14 m_btnMainAct.setText(14 m_btnMainAct.setText(启动启动SecondActivity);SecondActivity);15 m_txtMainAct.setText(15 m_txtMainAct.setText(这是这是MainActivity);MainActivity);16161717OverrideOverride1818protected void onDestroy()protected void onDestroy()1919/TODO Auto-generated method stub/TODO Auto-generated method stub312.2.2 Activity生命周期nMainActivity.java文件的代码2020System.out.println(MainActivity-onDestroy);System.out.println(MainActivity-onDestroy);2121super.onDestroy();super.onDestroy();2222 2323OverrideOverride2424protected void onPause()protected void onPause()2525/TODO Auto-generated method stub/TODO Auto-generated method stub2626System.out.println(MainActivity-onPause);System.out.println(MainActivity-onPause);2727super.onPause();super.onPause();2828 2929OverrideOverride3030protected void onRestart()protected void onRestart()3131/TODO Auto-generated method stub/TODO Auto-generated method stub3232System.out.println(MainActivity-onRestart);System.out.println(MainActivity-onRestart);3333super.onRestart();super.onRestart();3434 3535OverrideOverride3636protected void onResume()protected void onResume()3737/TODO Auto-generated method stub/TODO Auto-generated method stub322.2.2 Activity生命周期nMainActivity.java文件的代码3838System.out.println(MainActivity-onResume);System.out.println(MainActivity-onResume);3939super.onResume();super.onResume();4040 4141OverrideOverride4242protected void onStart()protected void onStart()4343/TODO Auto-generated method stub/TODO Auto-generated method stub4444System.out.println(MainActivity-onStart);System.out.println(MainActivity-onStart);4545super.onStart();super.onStart();4646 4747OverrideOverride4848protected void onStop()protected void onStop()4949/TODO Auto-generated method stub/TODO Auto-generated method stub5050System.out.println(MainActivity-onStop);System.out.println(MainActivity-onStop);5151super.onStop();super.onStop();5252 332.2.2 Activity生命周期nNewActivity.java文件的代码 MainActivity是主窗体类,此类中重写了Activity的七个生命周期回调函数,并均使用方法System.out.println(),此方法向控制台输出相应信息并换行。代码53行通过内部类实现按钮点击监听器。代码56-58行,通过Intent实现不同Activity的交互,Intent会在后面的内容中详细介绍。ButtonListener类实现的功能是按钮点击后的响应,即启动另一个Activity。5353class ButtonListener implements OnClickListenerclass ButtonListener implements OnClickListener5454OverrideOverride5555public void onClick(View v)public void onClick(View v)5656Intent intent=new Intent();Intent intent=new Intent();5757intent.setClass(MainActivity.this,SecondActivity.class);intent.setClass(MainActivity.this,SecondActivity.class);5858MainActivity.this.startActivity(intent);MainActivity.this.startActivity(intent);5959 6060 61 61 342.2.2 Activity生命周期nSecondActivity.java代码文件1 /1 /第二屏第二屏2 public class SecondActivity extends Activity 2 public class SecondActivity extends Activity 3 3private Button m_btnSecondAct=null;private Button m_btnSecondAct=null;4 4private TextView m_txtSecondAct=null;private TextView m_txtSecondAct=null;5 5/*Called when the activity is first created.*/*Called when the activity is first created.*/6 Override6 Override7 public void onCreate(Bundle savedInstanceState)7 public void onCreate(Bundle savedInstanceState)8 8System.out.println(SecondActivity-onCreate);System.out.println(SecondActivity-onCreate);9 super.onCreate(savedInstanceState);9 super.onCreate(savedInstanceState);10 setContentView(R.layout.second);10 setContentView(R.layout.second);11 m_btnSecondAct=(Button)findViewById(R.id.btnSecondAct);11 m_btnSecondAct=(Button)findViewById(R.id.btnSecondAct);12 m_txtSecondAct=(TextView)findViewById(R.id.txtSecondAct);12 m_txtSecondAct=(TextView)findViewById(R.id.txtSecondAct);13 m_btnSecondAct.setOnClickListener(new ButtonListener();13 m_btnSecondAct.setOnClickListener(new ButtonListener();14 m_btnSecondAct.setText(14 m_btnSecondAct.setText(返回返回MianActivity);MianActivity);15 m_txtSecondAct.setText(15 m_txtSecondAct.setText(这是这是SecondActivity);SecondActivity);16161717OverrideOverride1818protected void onDestroy()protected void onDestroy()1919/TODO Auto-generated method stub/TODO Auto-generated method stub352.2.2 Activity生命周期nSecondActivity.java文件的代码2020System.out.println(SecondActivity-onDestroy);System.out.println(SecondActivity-onDestroy);2121super.onDestroy();super.onDestroy();2222 2323OverrideOverride2424protected void onPause()protected void onPause()2525/TODO Auto-generated method stub/TODO Auto-generated method stub2626System.out.println(SecondActivity-onPause);System.out.println(SecondActivity-onPause);2727super.onPause();super.onPause();2828 2929OverrideOverride30 protected void onRestart()30 protected void onRestart()3131/TODO Auto-generated method stub/TODO Auto-generated method stub3232System.out.println(SecondActivity-onRestart);System.out.println(SecondActivity-onRestart);3333super.onRestart();super.onRestart();3434 3535OverrideOverride3636protected void onResume()protected void onResume()3737/TODO Auto-generated method stub/TODO Auto-generated method stub362.2.2 Activity生命周期nMainActivity.java文件的代码3838System.out.println(SecondActivity-onResume);System.out.println(SecondActivity-onResume);3939super.onResume();super.onResume();4040 4141OverrideOverride42 protected void onStart()42 protected void onStart()4343/TODO Auto-generated method stub/TODO Auto-generated method stub4444System.out.println(SecondActivity-onStart);System.out.println(SecondActivity-onStart);4545super.onStart();super.onStart();4646 4747OverrideOverride4848protected void onStop()protected void onStop()4949/TODO Auto-generated method stub/TODO Auto-generated method stub5050System.out.println(SecondActivity-onStop);System.out.println(SecondActivity-onStop);5151super.onStop();super.onStop();5252 372.2.2 Activity生命周期nNewActivity.java文件的代码 n通过查看日志信息可以跟踪上面代码的运行情况。在Eclipse中切换到DDMS界面,其中的LogCat用于显示系统日志信息,能够捕获的信息包括Dalvik虚拟机产生的信息、进程信息、ActivityManager信息、PackagerManager信息、Homeloader 信息、WindowsManager信息、Android运行时信息和应用程序信息等。通过在LogCat中添加日志过滤器可以跟踪查看System.out输出信息。5353class ButtonListener implements OnClickListenerclass ButtonListener implements OnClickListener5454OverrideOverride5555public void onClick(View v)public void onClick(View v)5656Intent intent=new Intent();Intent intent=new Intent();5757intent.setClass(SecondActivity.this,intent.setClass(SecondActivity.this,MainActivity.class);MainActivity.class);5858SecondActivity.this.startActivity(intent);SecondActivity.this.startActivity(intent);5959 60 60 61 61 382.2.2 Activity生命周期nMainActivity调用SecondActivity日志n重新运行上面的工程,重新运行上面的工程,MainActivity启动完成后,System.out信息同图2.2.2(a),此时点击上面的按钮启动SecondActivity,查看System.out信息,如图2.2.3所示。从图中可以看出,前三行信息是MainActivity的启动日志,后面五行是MainActivity中启动SecondActivity的日志。SecondActivity的启动过程中,首先调用MainActivity的onPause()方法,再依次调用SecondActivity的onCreate()、onStart()和onResume(),最后调用MainActivity的onStop()方法,此时SecondActivity完全遮盖MainActivity。392.2.2 Activity生命周期n从从SecondActivity返回到MainActivity日志n此过程中首先调用SecondActivity的onPause()方法,接着调用MainActivity的onRestart()、onStart()和onResume方法,由于是返回键返回,此时SecondActivity被销毁,依次调用了onStop()和onDestroy()方法。402.2.2 Activity生命周期n点击按钮点击按钮SecondActivity返回到MainActivityn此过程中首先调用SecondActivity的onPause()方法,接着调用MainActivity的onCreate()、onStart()和onResume方法,最后调用了SecondActivity的onStop()方法。比较图2.2.4,此时的MainActivity被全新重建,与此同时SecondActivity也并没有被销毁,其资源仍占据着系统资源。412.2.2 Activity生命周期n部分遮挡的情况部分遮挡的情况nAndroidManifest.xml文件中为SecondActivity添加属性android:theme并且设置其值为android:theme=android:style/Theme.Dialog。此属性定义SecondActivity显示方式为窗口而不是整个屏幕。运行程序并从MainActivity中启动SecondActivity,此过程System.out输出信息如图2.2.6所示。比较图2.2.3,可以看出,部分遮挡的情况下,MainActivity不会调用自身的onStop()方法,这是因为MainActivity仍可见,只是不能直接和用户交互。422.2.2 Activity生命周期ActivityActivity的生命周期中还需注意以下几点:的生命周期中还需注意以下几点:n当当ActivityActivity处于暂停或停止状态下,操作系统内存缺乏可能会销毁处于暂停或停止状态下,操作系统内存缺乏可能会销毁ActivityActivity,或者其他意外突发情况,或者其他意外突发情况,ActivityActivity被操作系统销毁,内存被操作系统销毁,内存回收时回收时onSaveInstanceStateonSaveInstanceState()会被调用,但是当用户主动销毁一个会被调用,但是当用户主动销毁一个ActivityActivity时(例如,按返回键)时(例如,按返回键)onSaveInstanceStateonSaveInstanceState()就不会被调用。就不会被调用。onSaveInstanceStateonSaveInstanceState()适合保存一些临时性的数据,适合保存一些临时性的数据,onPauseonPause()适合保适合保存一些持久化的数据存一些持久化的数据nonRestoreInstanceStateonRestoreInstanceState()是在是在onStartonStart()和和onCreateonCreate()之间执行用户恢复之间执行用户恢复Activity UIUI状态。状态。n如果数据比较重要但是数据任在运算当中,则应该缓存他们,如如果数据比较重要但是数据任在运算当中,则应该缓存他们,如果运算结束并且得到了结果,则应该对其进行持久化操作。果运算结束并且得到了结果,则应该对其进行持久化操作。n只要只要ActivityActivity被覆盖一定会调用被覆盖一定会调用onPauseonPause()方法,只要方法,只要ActivityActivity重新回重新回到前台一定会调用到前台一定会调用onResumeonResume()方法。方法。432.2.3 Task2.2.3 Task与与ActivityActivity栈栈n一个Task是用户可以完成一个特定目标的一组Activity,与Activity属于哪个Application无关。除非明确地新建一个Task,否则用户启动的所有Activity都默认是当前Task的一部分。这些Activity可能属于任何一个Application,属于同一个Application或者属于不同的Application。例如,从联系人列表(第一个Activity)开始,然后选择一个邮箱地址(第二个Activity),然后附加一个照片(第三个Activity),联系人列表、邮箱和图片,这些都存在于不同的Activity中,但却属于同一个Task。442.2.3 Task2.2.3 Task与与