Activity生命周期.ppt

上传人:max****ui 文档编号:3385064 上传时间:2019-12-13 格式:PPT 页数:46 大小:1.49MB
返回 下载 相关 举报
Activity生命周期.ppt_第1页
第1页 / 共46页
Activity生命周期.ppt_第2页
第2页 / 共46页
Activity生命周期.ppt_第3页
第3页 / 共46页
点击查看更多>>
资源描述
第4章Android生命周期和Intent属性,本章学习目标,了解Activity的生命周期中各状态的变化关系掌握Activity事件回调函数的作用和调用顺序Intent对象及其属性系统标准activityaction应用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()五种静态方法,使用不同的方法输出信息的颜色各不相同,例如:publicclassMyTestextendsAndroidTestCaseprivatestaticfinalStringTAG=MyTest;publicvoidtestSave()inti=9;Log.i(TAG,i=+i);Assert.assertEquals(i,9);,说明:Log.i(Stringtag,Stringmsg)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,Extrasfile:/C:Androidandroid-sdk-windowsdocsreferenceandroidcontentIntent.html,Intent的ComponentName属性,在Intent的查找组件策略中,其中的一种方法是显示查找,直接通过组件名称(Componentname)来查找。Intent的组件名称对象由ComponentName类来封装,组件名称包含包名称和类名称,被声明在AndroidManifest.xml文件中。组件名称通过setClass()、setComponent()、setClassName()设置,通过getComponent()获得。,在MainActivity中:ComponentNamecn=newComponentName(MainActivity.this,hp.android.OtherActivity);/实例化组件名称IntentI=newIntent();/实例化Intenti.setComponent(cn);/为Intent设置组件名称属性startActivity(i);/启动activity在MyActivity中:Intentintent=getIntent();/获得IntentComponentNamecn=intent.getComponent();/获得组件名称对象Stringpackagename=cn.getPackageName();/获得包名称Stringclassname=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中:publicstaticfinalStringMY_ACTION=hp.android.MY_ACTION“;IntentI=newIntent();i.setAction(MY_ACTION);startActivity(i);在MyActivity中:Intenti=getIntent();Stringaction=i.getAction();在全局配置文件中:,自定义action属性,Intent的action属性,在MainActivity中:IntentI=newIntent();/设置action(使用系统的action)i.setAction(Intent.ACTION_GET_CONTENT);/设置typei.setType(“vnd.android.curor.item/phone”);startActivity(i);,访问系统action属性,Intent的action属性,Intent的data属性,intent的data属性是执行动作的Url和MIME类型,不同的action有不同的data数据指定。例如ACTION_EDITAction应该和要编辑的文档URLdata匹配,ACTION_VIEW应用和要显示的URL匹配。MIME类型就是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。,MIME,MIME的英文全称是MultipurposeInternetMailExtensions多功能Internet邮件扩充服务,它是一种多用途网际邮件扩充协议,在1992年最早应用于电子邮件系统,但后来也应用到浏览器。服务器会将它们发送的多媒体数据的类型告诉浏览器,而通知手段就是说明该多媒体数据的MIME类型,从而让浏览器知道接收到的信息哪些是MP3文件,哪些是Shockwave文件等等。服务器将MIME标志符放入传送的数据中来告诉浏览器使用哪种插件读取相关文件。,MIME,服务器在发送真正的数据之前,就要先发送标志数据的MIME类型的信息,这个信息使用Content-type关键字进行定义,例如对于HTML文档,服务器将首先发送以下两行MIME标识信息,这个标识并不是真正的数据文件的一部分。Content-type:text/html注意,第二行为一个空行,这是必须的,使用这个空行的目的是将MIME信息与真正的数据内容分隔开。,Intent的Category属性,Intent中的Category属性是一个执行Action的附加信息。Intenti=newIntent();i.setAction(Intent.ACTION_MAIN);/添加系统Category属性i.setCategory(Intent.CATEGORY_HOME);startActivity(i);当点击按钮时,将返回Home页.,Activityandroid.intent.category.DEFAULT:每一个通过startActivity()方法发出的隐式Intent都至少有一个category,就是android.intent.category.DEFAULT,所以只要是想接收一个隐式Intent的Activity都应该包括android.intent.category.DEFAULTcategory,不然将导致Intent匹配失败。,Intent的Extras属性,Intent的Extras属性是添加一些组件的附属信息。如:IntentI=newIntent();i.setClass(MainActivity.this,ResultActivity.class);i.putExtras(“age”,”20”);startActivity(i);我们在ResultActivity中就可以通过Intent可以得到ageIntenti=getIntent();Stringage=i.getStringExtra(“age”);,系统标准ActivityAction应用,Action是一个字符串名称,用来标示组件的动作。在android系统中定义了一系列Action常量,分别为ActivityAction,BroadcastAction。,ActivityAction应用1,/查看_id为1的用户电话信息data=content:/contacts/people/1;uri=Uri.parse(data);/设置actionintent.setAction(Intent.ACTION_VIEW);/设置dataintent.setData(uri);startActivity(intent);,ActivityAction应用2,/编辑_id为1的用户电话信息data=content:/contacts/people/1;uri=Uri.parse(data);intent.setAction(Intent.ACTION_EDIT);intent.setData(uri);startActivity(intent);,ActivityAction应用3,/显示拨打电话界面data=tel:13800138000;uri=Uri.parse(data);intent.setAction(Intent.ACTION_DIAL);intent.setData(uri);startActivity(intent);,ActivityAction应用4,/直接打电话data=tel:13800138000;uri=Uri.parse(data);intent.setAction(Intent.ACTION_CALL);intent.setData(uri);startActivity(intent);,ActivityAction应用5,/访问浏览器data=;uri=Uri.parse(data);intent.setAction(Intent.ACTION_VIEW);intent.setData(uri);startActivity(intent);,ActivityAction应用6,/访问地图data=geo:39.92,116.46;uri=Uri.parse(data);intent=newIntent(Intent.ACTION_VIEW,uri);startActivity(intent);,ActivityAction应用7,/发送邮件/获得输入信息Stringto=toEditText.getText().toString();Stringsubject=subjectEditText.getText().toString();Stringcontent=contentEditText.getText().toString();/创建IntentIntentemailIntent=newIntent(android.content.Intent.ACTION_SEND);/设置内容类型emailIntent.setType(plain/text);/设置额外信息emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL,newStringto);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,这种方式是通过IntentFilter实现的。在使用intentFilter进行过滤时Intent通常考虑的三个属性是action,data,Category。,Intent的实现策略,Intent解析机制主要是通过查找已注册在AndroidManifest.xml中的所有IntentFilter及其中定义的Intent,最终找到匹配的Intent。在这个解析过程中,android是通过Intent的Action,Data,Category这三个属性来进行判断的。,Action测试,1.如果Intent指定了Action,则目标组件IntentFilter的Action列表中必须也包含Action,否则不能匹配。配置文件代码中设置action:privatestaticfinalStringACTION1=com.amaker.ch06.app.TEST_ACTION1;intent.setAction(ACTION1);,Action测试,2.如果Intent没有指定Action,则必须添加data,Action测试自动通过。如果没有指定Action和Data,则不能匹配。配置文件:代码中设置Action:Uridata=Uri.parse(content:/com.amaker.ch07.app/abc);intent.setData(data);代码中可以不设置Action,但配置文件中要设置。,Category测试,1.在Intent对象中出现的Cagetory属性在IntentFilter中必须出现,否则不能通过。配置文件中:代码中:intent.setAction(ACTION1);privatestaticfinalStringCATEGORY1=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对象中既包含Url又包含Url,那么在也必须二者包含才能通过总结:从上述这些例子中可以看出,无论是action,data,category,他们的设置基本都是一样的,要想匹配通过,只能是说他们在代码和中,你有我也有,你没有那我也没有。这个只是基本,当然还有特殊情况,如action可以和data,category一起使用,action和category使用,data可以和action使用,也可以和category一起使用。特殊在于我在中可以声明action,category,但在类中可以不使用,而data不行,一边有另一边也必须有。Action和data都可以单独使用,category不能单独使用。,Data测试,代码intent.setAction(ACTION1);Uridata=Uri.parse(content:/com.amaker.ch07.app/abc);intent.setData(data);配置文件,特殊情况(自定义的和系统的重叠),如果一个Intent的action被定义为“android.intent.action.VIEW”,Data被定义为,将能访问到google网站。如果我们定义的Intent和他的action和data属性相同,这样的情况下,系统会提示我们选择哪个一个组件来运行。代码intent.setAction(android.intent.action.VIEW);intent.setData(Uri.parse();配置文件,总结,本讲详细介绍了Android四大组件之一:Activity。一个Activity应用将包含多个Activity,每个Activity通常对应一个窗口。学习本讲的重点是掌握如何开发Activity、如何在AndroidManifest.xml文件中配置Activity;Android由多个Activity组成,因此还要掌握一个Activity如何启动另一个Activity的方法;Activity在Android系统中运行时,有其自身的生命周期,还需要清晰地了解Activity的生命周期。,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!