Activity生命周期.ppt_第1页
Activity生命周期.ppt_第2页
Activity生命周期.ppt_第3页
Activity生命周期.ppt_第4页
Activity生命周期.ppt_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第4章 Android生命周期和Intent属性,本章学习目标,了解Activity的生命周期中各状态的变化关系 掌握Activity事件回调函数的作用和调用顺序 Intent对象及其属性 系统标准activity action应用 Intent的实现策略,日志输出,前面已经见到Console控制台只能输出应用安装的信息,对于android开发,System.out.println 在Console控制台不会输出结果,而是在LogCat中打印出结果。 在android程序中进行信息输出,一般采用android.util.Log类的静态方法来实现,Log类所输出 的日志内容从少到多分别是ERROR、WARN、INFO、DEBUG、VERBOSE,对应五种不同类 型的首字母,分别对应有Log.e()、Log.w()、Log.i()、Log.d()、Log.v()五种静态方法,使用不 同的方法输出信息的颜色各不相同,例如: public class MyTest extends AndroidTestCase private static final String TAG=“MyTest“; public void testSave() int i=9; Log.i(TAG,“i=“+i); Assert.assertEquals(i,9); ,说明:Log.i(String tag,String msg) tag:为这条信息定义的一个标签,在开发时 通常采用其所在的类的类名,这样方便追踪 输出的信息,也方便在看到输出信息时知道 是由哪个类输出 Msg:该参数为希望输出的信息内容,Android组件,组件生命周期 所有Android组件都具有自己的生命周期,是从组件建立到组件销毁的整个过程 在生命周期中,组件会在可见、不可见、活动状态中不断变化,Activity生命周期,Activity生命周期 Activity生命周期指Activity从启动到销毁的过程 Activity表现为三种状态,分别是活动状态、暂停状态、停止状态和非活动状态 活动状态,Activity在用户界面中处于最上层,完全能被用户看到,能够与用户进行交互 暂停状态,Activity在界面上被部分遮挡,该Activity不再处于用户界面的最上层,且不能够与用户进行交互 停止状态,Activity在界面上完全不能被用户看到,也就是说这个Activity被其他Activity全部遮挡,Activity生命周期,Activity的四种状态的变换关系图,Activity生命周期,Activity栈 遵循“后进先出”的规则,Activity生命周期,Activity生命周期及回调方法,Activity生命周期,Activity生命周期的事件回调函数,Activity生命周期,Activity状态保存/恢复的事件回调函数,Activity生命周期,Activity事件回调函数的调用顺序 Activity生命周期分类 Activity的生命周期可分为全生命周期、可视生命周期和活动生命周期 每种生命周期中包含不同的事件回调函数,Activity生命周期,全生命周期 全生命周期是从Activity建立到销毁的全部过程,始于onCreate(),结束于onDestroy() 使用者通常在onCreate()中初始化Activity所能使用的全局资源和状态,并在onDestroy()中释放这些资源 在一些极端的情况下,Android系统会不调用onDestroy()函数,而直接终止进程,Activity生命周期,可视生命周期 可视生命周期是Activity在界面上从可见到不可见的过程,开始于onStart(),结束于onStop(),Activity生命周期,可视生命周期 onStart()一般用来初始化或启动与更新界面相关的资源 onStop()一般用来暂停或停止一切与更新用户界面相关的线程、计时器和服务 onRestart()函数在onSart()前被调用,用来在Activity从不可见变为可见的过程中,进行一些特定的处理过程 onStart()和onStop()会被多次调用 onStart()和onStop()也经常被用来注册和注销BroadcastReceiver,Activity生命周期,活动生命周期 活动生命周期是Activity在屏幕的最上层,并能够与用户交互的阶段,开始于onResume(),结束于onPause() 在Activity的状态变换过程中onResume()和onPause()经常被调用,因此这两个函数中应使用更为简单、高效的代码,Activity生命周期,活动生命周期 onPause()是第一个被标识为“可终止”的函数 在onPause()返回后,onStop()和onDestroy()随时能被Android系统终止 onPause()常用来保存持久数据,如界面上的用户的输入信息等,Activity生命周期,onPause()和onSaveInstanceState()的区别 这两个函数都可以用来保存界面的用户输入数据,他们的区别在于 onPause()一般用于保存持久性数据,并将数据保存在存储设备上的文件系统或数据库系统中的 onSaveInstanceState()主要用来保存动态的状态信息,信息一般保存在Bundle中 Bundle是能够保存多种格式数据的对象 onSaveInstanceState()保存在Bundle中的数据,系统在调用onRestoreInstanceState()和onCreate()时,会同样利用Bundle将数据传递给函数,Intent对象及其属性,Intent是对他要完成操作的一种抽象描述,我们可以用intent来启动一个activity,发起一个broadcast和启动或绑定一个service。Intent使应用程序代码在运行时动态绑定成为可能,这也降低了不同代码之间的耦合性。Intent最常使用的方法是用来启动一个activity。Intent封装了他要执行动作的属性,这些属性最常见的是action和data。 Intent属性主要包括:ComponentName, Action, Data, Category, Extras file:/C:Androidandroid-sdk-windowsdocsreferenceandroidcontentIntent.html,Intent的ComponentName属性,在Intent的查找组件策略中,其中的一种方法是显示查找,直接通过组件名称(Component name)来查找。 Intent的组件名称对象由ComponentName类来封装,组件名称包含包名称和类名称,被声明在AndroidManifest.xml文件中。 组件名称通过setClass()、setComponent()、setClassName()设置,通过getComponent()获得。,在MainActivity中: ComponentName cn = new ComponentName(MainActivity.this, “hp.android.OtherActivity“); /实例化组件名称 Intent I = new Intent(); /实例化Intent i.setComponent(cn); /为Intent设置组件名称属性 startActivity(i); /启动activity 在MyActivity中: Intent intent = getIntent(); /获得Intent ComponentName cn = intent.getComponent();/获得组件名称对象 String packagename = cn.getPackageName();/获得包名称 String classname = cn.getClassName();/获得类名称 在全局配置文件中: /必须配置,ComponentName代码,Intent的ComponentName属性,Intent的action属性,action是指Intent要完成的动作,是一个字符串常量。 在Intent类里面定义了大量的Action常量属性,例如: ACTION_CALL (打电话),ACTION_EDIT(编辑数 据),ACTION_BATTERY_LOW(电量低广播action)等。也可以自己定义action来使用。我们可以使用setAction()来设置IntentAction属性,使用getAction来获得Intent的action属性。,在MainActivity中: public static final String MY_ACTION = “hp.android.MY_ACTION“ ; Intent I = new Intent(); i.setAction(MY_ACTION); startActivity(i); 在MyActivity中: Intent i= getIntent(); String action = i.getAction(); 在全局配置文件中: ,自定义action属性,Intent的action属性,在MainActivity中: Intent I = new Intent(); /设置action(使用系统的action) i.setAction(Intent.ACTION_GET_CONTENT); /设置type i.setType(“vnd.android.curor.item/phone”); startActivity(i);,访问系统action属性,Intent的action属性,Intent的data属性,intent的data属性是执行动作的Url和MIME类型,不同的action有不同的data数据指定。例如ACTION_EDIT Action应该和要编辑的文档URL data匹配,ACTION_VIEW应用和要显示的URL匹配。 MIME类型就是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。,MIME,MIME的英文全称是“Multipurpose Internet Mail Extensions“ 多功能Internet 邮件扩充服务,它是一种多用途网际邮件扩充协议,在1992年最早应用于电子邮件系统,但后来也应用到浏览器。服务器会将它们发送的多媒体数据的类型告诉浏览器,而通知手段就是说明该多媒体数据的MIME类型,从而让浏览器知道接收到的信息哪些是MP3文件,哪些是Shockwave文件等等。服务器将MIME标志符放入传送的数据中来告诉浏览器使用哪种插件读取相关文件。,MIME,服务器在发送真正的数据之前,就要先发送标志数据的MIME类型的信息,这个信息使用Content-type关键字进行定义,例如对于HTML文档,服务器将首先发送以下两行MIME标识信息,这个标识并不是真正的数据文件的一部分。 Content-type: text/html 注意,第二行为一个空行,这是必须的,使用这个空行的目的是将MIME信息与真正的数据内容分隔开。,Intent的Category属性,Intent中的Category属性是一个执行Action的附加信息。 Intent i= new Intent(); i.setAction(Intent.ACTION_MAIN); /添加系统Category属性 i.setCategory(Intent.CATEGORY_HOME); startActivity (i); 当点击按钮时,将返回Home页.,Aent.category.DEFAULT: 每一个通过 startActivity() 方法发出的隐式 Intent 都至少有一个 category,就是 “ent.category.DEFAULT“,所以只要是想接收一个隐式 Intent 的 Activity 都应该包括 “ent.category.DEFAULT“ category,不然将导致 Intent 匹配失败。,Intent的Extras属性,Intent的Extras属性是添加一些组件的附属信息。 如: Intent I = new Intent(); i.setClass(MainActivity.this,ResultActivity.class); i.putExtras(“age”,”20”); startActivity(i); 我们在ResultActivity中就可以通过Intent可以得到age Intent i=getIntent(); String age = i.getStringExtra(“age”);,系统标准Activity Action应用,Action是一个字符串名称,用来标示组件的动作。在android系统中定义了一系列Action常量,分别为Activity Action,Broadcast Action。,Activity Action应用 1,/ 查看_id 为1的用户电话信息 data = “content:/contacts/people/1“; uri = Uri.parse(data); /设置action intent.setAction(Intent.ACTION_VIEW); /设置data intent.setData(uri); startActivity(intent);,Activity Action应用 2,/ 编辑_id 为1的用户电话信息 data = “content:/contacts/people/1“; uri = Uri.parse(data); intent.setAction(Intent.ACTION_EDIT); intent.setData(uri); startActivity(intent);,Activity Action应用 3,/ 显示拨打电话界面 data = “tel; uri = Uri.parse(data); intent.setAction(Intent.ACTION_DIAL); intent.setData(uri); startActivity(intent);,Activity Action应用 4,/ 直接打电话 data = “tel; uri = Uri.parse(data); intent.setAction(Intent.ACTION_CALL); intent.setData(uri); startActivity(intent);,Activity Action应用 5,/ 访问浏览器 data = ““; uri = Uri.parse(data); intent.setAction(Intent.ACTION_VIEW); intent.setData(uri); startActivity(intent);,Activity Action应用 6,/ 访问地图 data = “geo:39.92,116.46“; uri = Uri.parse(data); intent = new Intent(Intent.ACTION_VIEW,uri); startActivity(intent);,Activity Action应用 7,/发送邮件 / 获得输入信息 String to = toEditText.getText().toString(); String subject = subjectEditText.getText().toString(); String content = contentEditText.getText().toString(); / 创建Intent Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND); / 设置内容类型 emailIntent.setType(“plain/text“); / 设置额外信息 emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new Stringto); emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, subject); emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, content); startActivity(Intent.createChooser(emailIntent, “发送邮件.“);,Intent的实现策略,Intent是如何找到目标组件的呢?Intent寻找目标组件的方式可以分为2种。一种是显式Intent,这种方式是通过指定Intent组件名称实现的,这种方式在我们上面讲到的Intent组件名称属性时提到过,他一般用在源组件知道目标组件名称的前提下,一般是在相同应用程序内部实现的。那么不同应用程序之间呢?我们并不知道目标组件的名称,又该如何寻找目标?这种情况下我们使用第二种方式,隐式intent,这种方式是通过Intent Filter实现的。 在使用intent Filter进行过滤时Intent通常考虑的三个属性是action,data,Category。,Intent的实现策略,Intent解析机制主要是通过查找已注册在AndroidManifest.xml中的所有Intent Filter及其中定义的Intent,最终找到匹配的Intent。在这个解析过程中,android是通过Intent的Action,Data,Category这三个属性来进行判断的。,Action测试,1.如果Intent指定了Action,则目标组件IntentFilter的Action列表中必须也包含Action,否则不能匹配。 配置文件 代码中设置action: private static final String ACTION1 = “com.amaker.ch06.app.TEST_ACTION1“; intent.setAction(ACTION1);,Action测试,2.如果Intent没有指定Action,则必须添加data,Action测试自动通过。如果没有指定Action和Data,则不能匹配。 配置文件: 代码中设置Action: Uri data = Uri.parse(“content:/com.amaker.ch07.app/abc“); intent.setData(data); 代码中可以不设置Action,但配置文件中要设置。,Category测试,1.在Intent对象中出现的Cagetory属性在Intent Filter中必须出现,否则不能通过。 配置文件中: 代码中: intent.setAction(ACTION1); private static final String CATEGORY1=“com.amaker.ch06.app. CATEGORY1“; intent.addCategory(CATEGORY1);,Data测试,Data属性的声明中指定访问数据的Url和MIME类型。可以在元素中通过一些属性(android:scheme,android:path,android:post,android:mimetype,android:host 等)来设置,通过这些属性来对应一个典型的Url格式scheme:/host:post:path,例如 。 Data测试如下: 1.如果intent对象中没有包含data,列表中也没包含data,则通过测试,这种情况一般是通过action属性来过滤的。 2.如果intent对象包含URL但是没有包含类型,并且类型不能从Url中自动识别,那么列表中也只能包含Url,这样才能通过。,Data测试,3.相反,如果intent对象只包含类型,没有包含Url,那么在中也只能包含类型,不能包含Url。 4.如果intent对象中既

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论