应用程序组件之一 Activity和_第1页
应用程序组件之一 Activity和_第2页
应用程序组件之一 Activity和_第3页
应用程序组件之一 Activity和_第4页
应用程序组件之一 Activity和_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

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

文档简介

1、第五章 应用程序组件(一)Activity和Intent,本章目标,Android 平台进程分析 简单了解 Android 应用组件:Activity/Content Provider/Broadcast Receiver/Service/Intent 之间的关系与区别 Activity 生命周期分析 Intent 成员变量 Intent-Filter 过滤器及过滤规则 隐式调用和显式调用,Java和Android程序,class和dex(Dalvik EXecutable) jar和apk(Android Package Key),Android程序,Android 进程,Zygote Zy

2、gote 是 Android 启动的第一个虚拟机,这也是 Android 中最重要的一个虚拟机 每当系统要求执行一个 Android 应用程序,Zygote 就会 FORK 出一个子进程来执行该应用程序 Zygote 进程是在系统启动时产生的,它会完成虚拟机的初始化,库的加载,预置类库的加载和初始化等等操作,而在系统需要一个新的虚拟机实例时,Zygote 通过复制自身,最快速的提供一个虚拟机 每个 Android 应用程序对应一个 dalvik 实例,都对应一个独立的进程 对于一些只读的系统库,所有虚拟机实例都和 Zygote 共享一块内存区域,大大节省了内存开销,Android进程构成组件,

3、Activity(带UI) Service Content Provider Broadcast Receiver Intent,Intent,进程和组件的关系,对于Android应用程序,进程是模糊的 ,任务是明显的 注:同一个应用程序中的Activity,即可以是在同一个任务栈,也可以是在不同的任务栈,Android应用开发,“面向组件的开发”,活动Activity,构成 Application 的基本组件 一般带有 UI 和消息处理过程 Android 通过 Activity Stack 来管理,处于栈顶的 Activity 是前台活动的 Activity 的生命握在 Android 系

4、统 Activity 间的切换是靠意图 Intent,Activity 生命周期,注意: 按Home和Back键和横竖屏切换,Activity切换的状态变化,Task 栈管理,默认的栈管理方案 新的应用程序开启,则开启新栈,将第一个显示的 Activity 压入 用户按 Home 键,原任务栈保留,这时依次调用 Activity 的 onPause 和 onStop 方法;当用户重新进入该应用程序,处于该任务栈的栈顶 Actitity 激活并显示,这时依次调用 onRestart、onStart、onResume 方法 用户按 Back 键,处于栈顶的 Activity A 出栈并被销毁,这时

5、依次调用 Activity A 的 onPause 、onStop、onDestroy 方法 ;则处于 A 下面的 Activity B 成为栈顶并激活;如果 A 是栈中唯一的 Activity 即是根 Activity,则 A 出栈消亡且任务栈消亡 同一个任务栈允许多个相同实例的 Activity 存在,且不排序 不同任务栈内启动了相同类型的 Activity,但对象不同,相互不影响,. . . .,前台Activity,根Activity,栈底,栈顶,其他应用程序 Activity,场景验证,场景验证: 新开启应用程序1,第一个显示的 Activity A 被压入栈1,成为根Activit

6、y 或栈顶 Activity 当 Activity A 跳转到 Activity B 时,Activity B 被压栈,成为栈顶,B 变为前台 用户按 Back 键,B 出栈,A 变为前台;按 Home 键,栈1不变 用户打开新的一个应用程序2,则开启任务栈2,该应用程序的第一个 Activity C 被压入栈2 用户按 Home 键,任务栈2保留 用户继续打开应用程序1,则 Activity B 显示;此时用户按 Back 键,则 B 出栈,显示 A,意图Intent,Intent:解释为“应用程序发出的意图”,就是连接各组件的桥梁 Intent 分类 显式 Intent 和隐式 Inten

7、t 系统和自定义 单个和广播,Intent 成员详细说明,意图 Intent Action:意图的动作或谓语 Data:意图的内容或宾语,使用 URI 来表示 Type:意图的作用数据范围(类型),一般使用MIME来表示,如:IMAGE/JPG Category:意图发生的前提条件或约束 Component:显式 intent 的类名 Extras:Intent 携带的额外数据,Intent 的作用,“唤醒”组件 Activity startActivity(Intent) startActivityForResult(Intent intent, int requestCode) 看示例代码

8、:Activity_Intent_Demo 项目: com.great.activity_intent.StartIntentForResult_Demo1 com.great.activity_intent.ResultActivity1 组件间数据交互 使用 Intent.putExtras(Bundle) 携带数据 使用步骤如下: 1、新建一个bundle类,如:Bundlebundle=newBundle(); 2、向 Bundle 类中加入数据,如:bundle.putString(“Name”, “张三”); 3、新建一个 intent 对象,并将该 Bundle 加入这个 int

9、ent 对象,如: Intentintent=newIntent(); intent.setClass(TestBundle.this,Target.class); intent.putExtras(mBundle); 看示例代码:Activity_Intent_Demo 项目: com.great.activity_intent.Bundle_Demo1 com.great.activity_intent.ResultActivity2,显式 Intent 调用,/显式指定类 Intent intent = new Intent(); Intent.setClass/setClassName

10、/setComponent /向框架发出显式意图 startActivity(intent); 看示例代码:Activity_Intent_Demo 项目:com.great.activity_intent.Intent_Demo1 com.great.activity_intent.Intent_Demo1_Result1,如果类名为自定义,则该Intent也可以称为自定义Intent,组件名 ComponentName,显式调用 一般是内部使用 为了降低耦合,尽量使用隐式调用,隐式 Intent/Intent-filters,用来描述 Activity 或 Service 等组件能响应什么

11、样的 Intent, ,动作 Action 测试,一个 Intent 对象只能指定一个动作名称,而一个过滤器可能列举多个动作名称。如果 Intent 对象或过滤器没有指定任何动作就按以下的过滤规则执行: 如果过滤器 intent-filter 没有指定任何动作,那么将阻塞所有的 Intent,因此所有的 Intent 都会测试失败。没有 Intent 能够通过这个过滤器 只要过滤器包含至少一个动作,一个没有指定动作的 Intent 对象也不能通过这个测试 看示例代码:Activity_Intent_Demo 项目:com.great.activity_intent.Intent_Demo1 c

12、om.great.activity_intent.Intent_Demo1_Result2,类别 Category 测试,匹配规则 对于一个能够通过类别匹配测试的 Intent,Intent 对象中的类别必须匹配过滤器中的类别。这个过滤器可以列举其它的类别,但不能遗漏在这个 Intent 中的任何类别 原则上一个没有类别的 Intent 对象应该总能够通过匹配测试,而不管过滤器里有什么 但有一个例外,Android 把所有传给 startActivity() 的隐式意图当作他们包含至少一个类别:“ent.category.DEFAULT” 想要接收隐式意图的活动必须在它们

13、的 intent-filter 中包含“ent.category.DEFAULT” 看示例代码:Activity_Intent_Demo 项目:com.great.activity_intent.Intent_Demo1 com.great.activity_intent.Intent_Demo1_Result2,系统自带的种类category,CATEGORY_DEFAULT CATEGORY_BROWSABLE CATEGORY_TAB CATEGORY_ALTERNATIVE CATEGORY_SELECTED_ALTERNATIVE CATEGORY_LAUNCH

14、ER CATEGORY_INFO CATEGORY_HOME CATEGORY_PREFERENCE CATEGORY_TEST CATEGORY_CAR_DOCK CATEGORY_DESK_DOCK CATEGORY_LE_DESK_DOCK CATEGORY_HE_DESK_DOCK CATEGORY_CAR_MODE CATEGORY_APP_MARKET,数据 Date 测试-URI,每个 元素可以指定一个 URI 和 一个 data type (MIME type) URI 有以下几个属性组成 : schema,host,port,path 格式: schema:/host:por

15、t/path 例如: :8080/folder/subfolder/etc/abc.pdf 其中: schema 是:http: host 是: port 是:8080 path 是: /folder/subfolder/etc/abc.pdf host 和 port 组成了URI authority,如果没有指定 host,那么 port 将被忽略。要使一个 authority 有意义,必须要指定 scheme ;要使 path 有意义, scheme 和 authority(host : port) 必须指定。,数据 Date

16、 匹配,当一个 Intent 对象中的 URI 被用来和一个过滤器中的 URI 比较时,比较的是 URI 的各个组成部分 如果过滤器仅指定了一个 scheme,所有该 scheme 的URI 都能够和这个过滤器相匹配 如果过滤器指定了一个 scheme、主机名但没有路径部分,所有具有相同 scheme 和主机名的URI 都可以和这个过滤器相匹配,而不管它们的路径 如果过滤器指定了一个 scheme、主机名和路径,只有具有相同 scheme、主机名和路径的 URI 才可以和这个过滤器相匹配。当然,一个过滤器中的路径规格可以包含通配符,这样只需要部分匹配即可 看示例代码:Activity_Intent_Demo 项目:com.great.activity_intent.Intent_Demo1 com.great.activity_intent.Intent_Demo1_Result2,数据 Date 匹配规则,一个既不包含 URI 也不包含数据类型的 Intent 对象仅在过滤器也同样没有指定任何 URI 和数据类型的情况下才能通过测试 一个包含 URI 没有数据类型的 Intent 对象仅在它的 URI 和一个同样没有指定数据类型的过滤器里的 URI 匹配时才能通过测试。这通常发生在类似于

温馨提示

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

评论

0/150

提交评论