版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Andriod应用开发基础教程第4章ActivityAndroid开发中,四大组件是指构成Android应用程序的四种核心组件,它们通过各自的方式与系统交互,实现应用的多样功能,这些组件是:Activity(活动)、Service(服务)、BroadcastReceiver(广播接收器)和ContentProvider(内容提供者),本章将对四大组件之一的Activity进行介绍。4.1Activity4.1.1
Activity概念Activity是Android组件的最基本也是最为常用的组件,Activity为应用程序提供了一个窗口,应用程序在此窗口上绘制用户界面,此窗口通常会填满整个屏幕,但可能会小于屏幕并浮动在其他窗口的上方。一般情况下,一个Activity在应用中实现一个屏幕,是用户与应用交互的主界面,用于绘制界面和接收与用户的交互事件。大多数应用包含多个应用界面,这意味着它们包含多个Activity,通常应用中的一个Activity会被指定为主Activity,这是用户启动应用时显示的第一个应用界面。一个Activity可以启动另一个Activity,以便执行不同的操作,比如我们打开一个邮箱应用,我们看到的收件箱、草稿箱、已发送等各个界面,通常都是不同的Activity,打开不同的Activity我们会看见不同的界面。4.1.2
Activity使用Activity使用涉及到三个重要文件,一个是清单文件AndroidManifest.xml用以声明该Activity,并对该Activity属性进行设置;一个是以这个Activity名字命名的java文件用以定义Activity布局的目的、功能;另外一个是Activity的布局文件用以定义页面样式,这三个文件第1章已有说明,这里不再展开这三个文件的详细内容赘述。在模块中创建完一个Activity后会生成以Activity名字命名的java文件,java文件中已经生成一个以Activity名字命名的类继承AppCompatActivity类,AppCompatActivity类间接继承自Activity类,它提供了向后兼容的实现,使得现代UI元素和特性能够在较旧的Android版本上运行,这个类重写父类的onCreate()方法,调用setContentView()指定Activity对应的布局文件。布局文件位于res资源目录下的子目录layout下,是一个XML文件,用各种标签来声明Activity的布局类型、包含的控件等等,第2、3章已对布局和常用控件进行了说明。Activity创建完成后还会在自动在清单文件的<application>标签下生成一个<activity>标签,此标签下已有两个属性,一个属性android:name用于指定Activity的名称,这是<activity>必备的属性,另一个属性android:exported用于是否允许让外部组件启动这个Activity,属性值为true允许,false不允许。除这两个自动生成的的属性外,我们还可以在<activity>标签下添加其它属性,用于定义Activity的其他特征,如图标、界面主题等。4.1.3
Activity生命周期Activity的生命周期是其最重要的特征之一,Activity是由任务栈进行管理,当来到一个新的Activity后,此Activity将被加入到Activity栈顶,之前的Activity位于此Activity底部,系统可以通过任务栈有序的管理每个Activity并决定哪个Activity在栈顶跟用户进行交互。Acitivity一般意义上有四种状态。1、Running状态:一个新Activity启动入栈后,它显示在屏幕最前端,位于栈的最顶端(Activity栈顶),此时它处于可见并可和用户交互的激活状态,叫做活动状态或者运行状态(activeorrunning),当另外一个Activity被激活,这个Activity将会被暂停。2、Paused状态:当Activity失去焦点,一个新的非全屏的Activity或者一个透明的Activity被放置在栈顶,此时的状态叫做暂停状态(Paused)。此时它依然与窗口管理器保持连接,Activity依然保持活力(保持所有的状态,成员信息,和窗口管理器保持连接),所以它仍然可见,但已经失去了焦点故不可与用户进行交互,在系统内存极端低下的时候将被强行终止掉。3、Stopped状态:如果一个Activity被另外的Activity完全覆盖掉,叫做停止状态(Stopped)。它依然保持所有状态和成员信息,但是它不再可见,所以它的窗口被隐藏,当系统内存需要被用在其他地方的时候,Stopped的Activity将被强行终止掉,所以当Activity处于此状态时,一定要保存当前数据和当前的UI状态,否则一旦Activity退出或关闭时,当前的数据和UI状态就丢失了。4、Killed状态:Activity被杀掉以后或者被启动以前,处于Killed状态。这时Activity已从Activity堆栈中移除,需要重新启动才可以显示和使用。表4-1Activity生命周期回调方法回调方法说明onCreate()创建Activity时调用,把页面布局加载进内存,进入了初始化的状态onStart()开始Activity时调用,界面用户可见onResume()当Activity准备好与用户交互时调用,此时Activity位于前台,能够与用户进行交互,例如,允许响应用户点击动作,允许用户输入文字等onPause()当Activity失去焦点时调用,此时Activity无法与用户正常交互:按钮不可点击,文本框不能输入onStop()当Activity变为不可见时调用,页面将不在屏幕上显示onDestory()当Activity即将被销毁时调用,系统回收Activity占用的系统资源,把页面从内存中清除onRestart()当Activity再次启动时调用,重新加载内存中的页面数据图4-1Activity生命周期案例4.1
Activity生命周期状态改变方式及在转变过程中使用的回调方法。(参考代码见:FirstActivity和SecondActivity)为了让FirstActivity能处于Paused状态,应当修改SecondActivity的主题,打开本模块下的清单文件AndroidManifest.xml,在SecondActivity所处的<activity>标签下添加属性:android:theme="@android:style/Theme.Translucent"或"@style/Theme.AppCompat.Dialog"。本案例选择的属性值为"@style/Theme.AppCompat.Dialog"。1、FirstActivity运行成功后打开控制台,控制台打印信息如图4-3所示,从控制台打印消息分析知此时FirstActivity启动之后依次调用了onCreate()>onStart()>onResume(),此时FirstActivity处于Running状态。2、点击模拟器上的“Home”按键,控制台打印信息如图4-4所示,从控制台打印消息分析知按下“Home”按下之后依次调用了onPause()>onStop(),此时FirstActivity处于Stopped状态。3、按下“Home”后再次回到FirstActivity,控制台打印信息如图4-5所示,从控制台打印消息分析知按下“Home”后再次回到FirstActivity依次调用了onRestart()>Start()>onResume(),此时FirstActivity处于Running状态。4、点击应用界面的“跳转到SecondActivity”按钮,控制台打印信息如图4-6所示,从控制台打印消息分析知从FirstActivity跳转到名为SecondActivity的透明Activity后,调用了onPause(),此时FirstActivity仍然可见,但已经失去了焦点故不可使用FirstActivity上的按钮与用户进行交互。此时FirstActivity处于Paused状态。5、点击屏幕,从透明SecondActivity再次回到FirstActivity,控制台打印信息如图4-7所示,从控制台打印消息分析知从透明Activity回到FirstActivity,调用了onResume()。此时FirstActivity处于Running状态。6、点击应用界面的“停止FirstActivity”按钮,控制台打印信息如图4-8所示,从控制台打印消息分析知从FirstActivity从Running状态到Killed状态,依次调用了onPause()>onStop()>onDestroy()。此时FirstActivity处于Killed状态。图4-9Activity状态转换过程4.1.4
Activity启动模式Activity的启动模式是决定生成新的Activity实例是否重用已存在的Activity实例,是否和其他Activity实例公用一个任务栈,一共有四种启动模式:1、standard:默认启动模式。每次激活Activity时,都创建Activity实例,并放入任务栈。这种模式适用于独立的界面,不需要共享数据的场景;2、singleTop:栈顶复用模式。判断待启动的Activity和任务栈栈顶的Activity是否是同一个,是同一个不需要创建该Activity的实例,否则要创建待启动的Activity的实例。该模式适用于需要频繁更新数据或响应新Intent的界面;3、singleTask:栈内复用模式。判断待启动的Activity是否在任务栈中,在任务栈中则不需要创建该Activity的实例,只需要把待启动的Activity入栈,并让任务栈中该Activity以上的其它Activity都出栈。此模式适用于作为应用入口的界面,确保只有一个实例存在,如App首页/主页。4、singleInstance:单实例模式。一个任务栈只有一个Activity,不允许有别的Activity存在,新的Activity会在一个新的任务栈中创建。此模式适用于需要独立处理的界面,一般用于APP首页/主页/呼叫来电界面。Activity启动模式可在清单文件AndroidManifest.xml进行配置,在<activity>标签下增加属性android:launchMode=”standard”|“singleTop”|“singleTask”|“singleInstance”即可。4.2Activity交互通信工具:Intent4.2.1
Intent概念和机制许多Android应用都需要多个Activity,并在它们之间进行导航。Intent(意图)是一种重要的消息传递对象,通过Intent表达某种请求或者意愿,Android会根据意愿的内容选择适当的组件来响应,用于Android程序中各组件(Activity、BroadcastReceiver、Service)的交互,并且可以在组件之间传递数据Android三大组件Activity、Service和BroadcastReceiver之间通过Intent进行通信,Intent是这几大组件沟通的桥梁,另外一个组件ContentProvider本身就是一种通信机制,不需要通过Intent。Intent向三大组件发送请求意图有不同的机制:1、Activity:使用Context.startActivity()或Activity.startActivityForResult(),传入一个Intent对象来启动一个Activity;2、Service:将Intent对象传给Context.startService()来启动一个Service或者传消息给一个运行的Service;3、BroadcastReceiver:将Intent对象传给Context.sendBroadcast(),Context.sendOrderedBroadcast()或Context.sendStickyBroadcast()发送一个广播。4.2.2
Intent组成和类型属性名含义说明component目的组件指定Intent的目标组件的类名称action动作用来表示Intent的行动,不同应用之间使用action跳转,Intent类中预定义的部分action(详细说明见SDK目录下的Intent.java):1、ent.action.CALL:拨打电话,被呼叫的联系人在数据中指定;2、ent.action.DIAL:拨打数据中指定的电话号码3、ent.action.EDIT:为制定的数据显示可编辑界面;4、ent.action.MAIN:作为主入口点启动,不需要数据;5、ent.action.SENDTO:向data指定的接收者发送一个消息;6、ent.action.VIEW:向用户显示数据;data数据表示要操纵的数据,通常是一个URItype数据类型Intent的数据类型(MIME)category类别包含Intent额外信息的字符串,表示哪种类型的组件来处理这个Intent,部分category(详细说明见SDK目录下的Intent.java):1、ent.category.HOME:设备启动后显示的第一个Activity;2、ent.category.BROWSABLE:能够被浏览器安全使用的Activities必须支持这个类别;3、ent.category.DEFAULT:如果Activity是对数据执行缺省动作的一个选项,需要设置这个类别;4、ent.category.LAUNCHER:Activity应该被显示在顶级的launcher中;5、ent.category.PREFERENCE:该Activity是一个设置面板extras扩展信息表示附加的信息,可以通过putExtra()方法添加键值对Intent导航到其它组件主要有显式Intent和隐式Intent两种方法。1、显式Intent:通过Intent构造函数创建Intent实例。Intent构造函数有以下几种:(1)Intent():空构造函数;(2)Intent(Intento):拷贝构造函数;(3)Intent(Stringaction):指定action类型的构造函数;(4)Intent(Stringaction,Uriuri):指定Action类型和Uri的构造函数;(5)Intent(Context
packageContext,
Class<?>cls):传入组件的构造函数,案例4-1中Intentintent=newIntent(FirstActivity.this,SecondActivity.class)创建了一个从FirstActivity到SecondActivity的Intent。(6)Intent(Stringaction,Uriuri,ContextpackageContext,Class<?>cls):指定Action类型、Uri和组件的构造函数;2、隐式Intent:不直接指明启动的组件,而是根据action和category找出合适的目标。可通过清单文件Mainfest.xml配置各组件的<intent-filter>,只有当<action>和<category>同时匹配时,才能响应对应的Intent。案例4.2
Intent用法演示。(参考代码见:IntentFirstActivity和IntentSecondActivity)1、点击“1、Activity跳转”按钮,由IntentFirstActivity跳转到IntentSecondActivity//显式1:调用Intent对象的setClass方法指定Intentintent=newIntent();intent.setClass(this,IntentSecondActivity.class);startActivity(intent);2、返回IntentFirstActivity,点击“2、Activity跳转传值”按钮,跳转到IntentSecondActivity,点击“点击显示来自IntentFirstActivity的数据”按钮,编辑框出现“你好”,IntentFirstActivity放置于Intent中的数据传递到IntentSecondActivity//显示2:调用Intent对象的setComponent方法指定Intentintent=newIntent();ComponentNamecomponent=newComponentName(this,IntentSecondActivity.class);intent.setComponent(component);intent.putExtra("data","你好");//以键值对的方式传递数据startActivity(intent);3、返回IntentFirstActivity,点击“3、打开网页”按钮跳转到默认浏览器打开百度首页Intentintent=newIntent(Intent.ACTION_VIEW);intent.setData(Uri.parse(""));startActivity(intent);4、点击返回IntentFirstActivity,点击“4、拨打电话”按钮跳转到拨号界面Intentintent=newIntent(Intent.ACTION_DIAL);intent.setData(Uri.parse("tel:10086"));startActivity(intent);5、点击返回IntentFirstActivity,点击“5、发送短信”按钮跳转到发送信息界面拨号,接收人为10086,信息框中已填入“你好”Intentintent=newIntent(Intent.ACTION_SENDTO);intent.setData(Uri.parse("smsto:10086"));intent.putExtra("sms_body","你好");startActivity(intent);4.3Activity间传递数据工具:BundleBundle用于在不同组件如Activity、Service、BroadcastReceiver等之间传递数据。Bundle可以存储一组键值对,其中键是字符串类型,值可以是基本数据类型(boolean、byte、int、long、float、double、string),也可以是对象或对象数组,当Bundle传递的是对象或对象数组时,必须实现Serializable或Parcelable接口。除了在不同组件间储存和传递数据,Bundle还可以用于保存Activity状态、向Fragment传递数据、向Intent传递数据、多进程通信等等。总之,Bundle可以在不同组件或进程之间传递数据,应用广泛。Bundle提供了各种常用类型的putXxx()/getXxx()方法,用于读写基本类型的数据,Xxx代表各种数据类型:Boolean、BooleanArray、Byte、ByteArray、Char、CharArray、Double、DoubleArray、Int、IntArray、Long、LongAaary、String、StringArray、Short、ShortArray、StringArrayList等等,如一个Activity通过bundle.putString(“name”,”张三”)将键值=“name”,数据类型为String的数据“张三”放入Bundle中,另一个Activity可通过bundle.getString(“name”),获取到键值=“name”数据类型为String的字符串“张三”。除常用类型外,Bundle还可以传递Parcelable和Serializable类型的数据表4-3Bundle操作Parcelable和Serializable类型的API方法说明publicTgetParcelable(Stringkey)获取key对应的Parcelable对象publicParcelable[]getParcelableArray(Stringkey)获取key对应的Parcelable对象数组publicArrayList<T>getParcelableArrayList(Stringkey)获取key对应的Parcelable对象的ArrayListpublicvoidputParcelable(Stringkey,Parcelablevalue)将Parcelable对象和key绑定publicvoidputParcelableArray(Stringkey,Parcelable[]value)将Parcelable对象数组和key绑定publicvoidputParcelableArrayList(Stringkey,ArrayList<?
extends
Parcelable>value)将Parcelable对象的和key绑定ArrayListpublicSerializablegetSerializable(Stringkey)获取key对应的Serializable对象publicvoidputSerializable(Stringkey,Serializablevalue)将Serializable对象和key绑定前面4.2节讲到Intent也可以用于不同组件间的数据传递,那么它们两者之间有什么区别呢?Bundle只是一个信息的载体,存储的数据以键值对形式保存,Intent负责Activity之间的交互,本身是带有一个Bundle的,即Intent携带了Bundle数据,不同Activity通信时是通过Bundle数据进行进行的。例如A地向B地运送箱装货物,A地就是Activity1,B地是Activity2,运输通过Intent,装货物的箱子则是Bundle,箱子上的编号就时key,货物就时data。A地通过新建一个Intent对象指定意图为运输到到B地,A地通过putExtras()把箱装的货物放至运输途中。B地先要通过getIntent()的方法获取运输的对象,然后通过getExtras()获得箱子,再根据箱子上的编号获得货物。如果Intent传递的数据只有一个,那么就A地直接用Intent的putExtra()方法直接放进参数即可,那如果Intent需要传递的是好几个参数,或者是一个类,那么这时候就需要用到Bundle。案例4.3
通过Bundle传递基本类型数据(参考代码见:ABundleActivity和BBundleActivity)运行ABundleActivity在模拟器生成相关应用,点击应用界面的按钮,跳转到BBundleActivity,此过程ABundleActivity将数据储存在Bundle中,通过Intent将数据传递到BBundleActivity,BBundleActivity接收到ABundleActivity储存在Bundle中的数据显示在TextView中//新建一个Intent对象Intentintent=newIntent(this,BBundleActivity.class);//新建一个Bundle对象,往对象中添加各种类型数据Bundlebundle=newBundle();bundle.putString("name","啄木鸟");bundle.putInt("age",18);bundle.putLong("student_id",1234565789);bundle.putBoolean("isGirl",true);bundle.putStringArray("hobby",newString[]{"看书","敲代码","看电影"});//将bundle加入这个Intent对象intent.putExtras(bundle);//开启活动startActivity(intent);//读取ABundleActivity传递过来的数据Bundlebundle=BBundleActivity.this.getIntent().getExtras();Stringname=bundle.getString("name");Integerage=bundle.getInt("age");Longstudent_id=bundle.getLong("student_id");booleanisGirl=bundle.getBoolean("isGirl");Stringhobbys[]=bundle.getStringArray("hobby");案例4.4
Bundle传递Parcelable和Serializable类型的数据(参考代码见:ABundleActivity_1和BBundleActivity_1)1、点击应用界面的“发送Serializable类型数据”按钮,跳转到BBundleActivity_1,此过程ABundleAct
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 保险销售员售后责任制度
- 水运安全生产责任制度
- 学校文明行动责任制度
- 落实项目建设责任制度
- 热源厂安全生产责任制度
- 码头更夫岗位责任制度
- 完善企业安全责任制制度
- 乡镇防灾减灾责任制度
- 中学安全事故责任制度
- 游泳池安排生产岗位责任制度
- 2026年常州纺织服装职业技术学院单招职业适应性测试题库及答案详解(新)
- 乳癌化疗患者的护理措施
- 2026年苏州信息职业技术学院单招职业适应性测试题库及答案解析
- 第4课 致敬劳动者 第1课时 课件+视频 2025-2026学年道德与法治三年级下册统编版
- 2025年驾照三力测试试题题库及答案
- 《康复评定技术》课件-协调评定
- 厂房换板施工方案(3篇)
- 1.2 宪法的内容和作用 课件-2025-2026学年道德与法治八年级下册 统编版
- 2024EACTS成人心脏手术围手术期药物治疗管理指南
- 液化气送气工培训课件
- 2025执业药师继续教育试题库及参考答案(完整版)
评论
0/150
提交评论