5、四大组件之一-Activity与Intent
一、Activity的定义及作用
1)官方定义:Activity是Android应用程序提供交互界面的一个重要组件 。 也是Android最重要的组件之一
2)Activity是业务类 , 是承载应用程序的界面以及业务行为的基础 。
包括UI , Service ...... 类似于我们的JavaBean
3)“脸”的表现都靠Activity了 。
4)说Activity就不得不说View和Window。
二、Intent和IntentFilter
Intent在中文中是意图的意思 。
那么既然叫做意图,就类似于一个男孩儿为了追一个女孩儿,传递纸条给她 ,向她要电话 ,女孩儿把电话写在纸条中传递给男孩儿 。(当然,现代社会都用微信了,最起码都是短信了)
如此,我们认为Intent就是在不同组件之间传递值而设计的一个数据结构
intent :
extras - 加入附加信息
category - IntentFilter
Action - 动作 : Data - 动作相关的值
ComponentName - Context
CompnentName、Action、Data、Category、Extras、Flags。
三、我们来讲一个故事(我们用用例图来描述一下这个过程)
场景一:
有个男孩儿叫Jakcy , 有个女孩儿叫Rose 。
他们来到美丽的成都,四川大学读书 。
先到我们的学校登记学籍 ,包括学籍相关属性 (性别,年龄 ,身份证号.....)
Jacky想要邀请Rose看电影 ,知道Rose的寝室号,打扮一番,洗个脸。就跑过去,送了一张电影票外加一封情书 ,说晚上一起看电影吧 。 Rose说好啊
晚上开始去开电影之前, Rose会好好准备,化妆 ,装扮自己的仪容和脸 。有必要的话还需要好好设计一下 。
晚上一起看电影看完电影之后, Rose告诉Jacky , 我接受你的邀请意味着我接受了你的情书 。 然后回家睡觉了
Jacky得到这个反馈后欢天喜地的也回家睡觉了 。
场景二:
Jacky 相约 Rose 看电影 , 但是却不知道Rose的宿舍在哪儿也没有其他联系方式 。
Jacky 找到学生会,发出一个寻人启事 ,启事是这样写道:
我想约你看电影
我记得你是**系**年级的女生
你的名字是Rose
如果你收到这个消息请打手机:135******** 联系我 , 我是Jacky
学生会没有把寻人启事贴到电线杆上,而是通过学校的学籍管理处去帮着查找这样条件的女孩儿 。结果一不小心查到了5,6位满足这个条件的女孩儿 。 就把启事全部发给她们了 。
这些女孩儿都收到了这个信息,晚上电影都去了 。 Jakcy晕了 ......
四、如何编写Activity?
1)创建Activity及相关视图文件Layout(View)。
2)配置AndroidManifest.xml。
3)重载onCreate() , 绑定Activity和Layout(View)。 setContentView()
4)为View(Layout)添加必要组件。
建立界面控件树的概念; findViewById(); addView();
5)在onCreate()中实现初始业务逻辑。
加入事件比如按钮事件
扩展:Java匿名内部类
new interfacename(){......}; 或 new superclassname(){......};
五、Activity的切换及值传递
启动一个新Activity ------ Intent;
启动一个新Activity并且返回值;
通过源代码分析启动的机制;
扩展:IntentFilter的应用;
结束一个Activity(finish()、finishActivity());
通过源代码分析结束机制;
六、Activity生命周期

http://www.cnblogs.com/mengdd/archive/2012/12/01/2797784.html
七、存储Activity状态
onSaveInstanceState()
onRestoreInstanceState() , onCreate()
如何选择用哪个函数?
官方推荐和我的推荐来说,都使用onCreate来恢复
因为有时候onRestoreInstanceState()不会被调用。
八、处理设置改变 Configuration changes
有时候会调用onConfigrationChanged .
屏幕翻转
输入法的有效性切换
语言的切换
1) 设置改变的时候恢复一个大对象
onRetainNonConfigurationInstance (注意returnObject 不要用与Context关联对象,比如View,否则会引起内存泄露)与 getLastNonConfigurationInstance() 配合
@Override
public Object onRetainNonConfigurationInstance() {
final MyDataObject data = collectMyLoadedData();
return data;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final MyDataObject data
= (MyDataObject) getLastNonConfigurationInstance();
if (data == null) {
data = loadMyData();
}
}
2) 自己处理配置改变
onConfigurationChanged()
<activity android:name=".MyActivity"
android:configChanges="orientation|keyboardHidden"
android:label="@string/app_name">
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// Checks the orientation of the screen
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
}
}
九、Activity的任务栈
进程中的关系是纵向的;类似生活中的部门,一个公司中有很多部门。
任务Task,可以理解为是横向关系;类似生活中的专案组,可以从每个部门抽调人手来去完成一个工作。
十、Activity Manifest配置详解
android:allowTaskReparenting
email-task 启动一个link
然后切入到browser task
如果设置为true , 则之前打开的页面任然存在
android:alwaysRetainTaskState
用来标记Activity所在的Task的状态是否总是由系统来保持。
“true”,表示总是;“false”,表示在某种情形下允许系统恢复Task到它的初始化状态。默认值是“false”。这个特性只针对Task的根Activity有意义;对其它Activity来说,忽略之。
一般来说,特定的情形如当用户从主画面重新选择这个Task时,系统会对这个Task进行清理(从stack中删除位于根Activity之上的所有Activivity)。典型的情况,当用户有一段时间没有访问这个Task时也会这么做,例如30分钟。
然而,当这个特性设为“true”时,用户总是能回到这个Task的最新状态,无论他们是如何启动的。这非常有用,例如,像Browser应用程序,这里有很多的状态(例如多个打开的Tab),用户不想丢失这些状态。
android:clearTaskOnLaunch
一般情况下
, launch中重新启动这个任务都会清除底部以上的activity这个可以保留,
Sample:某人从主页屏幕载入activity P,并从那儿到达activity
Q。用户接下来按了HOME键,然后返回到activity P。通常,用户将看到activity Q,因为那时他在P的task里操作的地方。然而,如果P将该标志设为”true”,当用户按了HOME键,该task进到后台去的时候,其上的所有的 activity(Q也属于这种情况)将被移除。所以以后回到该task时看到的只有P。
android:configChanges
android:configChanges="keyboardHidden|orientation"配置,当我们横竖屏切换的时候会直接调用onCreate方法中的onConfigurationChanged方法,而不会重新执行onCreate方法,那当然如果不配置这个属性的话就会重新调用onCreate方法了
android:finishOnTaskLaunch
当用户再次载入该task时(在主页屏幕上选择该task),一个既存的activity实例是否应该被关闭(结束) —
“true”表示会被关闭,”false”表示不是。默认值为”false”。
android:hardwareAccelerated
由于硬件加速自身并非完美无缺,所以Android提供选项来打开或者关闭硬件加速,默认是关闭。可以在4个级别上打开或者关闭硬件加速:,在3.0才有的。
android:launchMode
Standard 标准的。
2.B设置为SingleTop,启动A: 再启动A: 再启动B: 再启动B:
结论:
当B不在栈顶时,仍然会创建B的新实例。
当B在栈顶时,请求启动B的Intent并没有触发创建B的新实例,而是触发了栈顶B的onNewIntent()
按Back键依次返回桌面,输出依次:
结论:
虽然发送了四次Intent,但实际上只创建了3个Activity,所以只有3次销毁输出。
3.B设置为SingleTask,启动A: 启动B:启动A: 启动B:
结论:
当B已经存在时,再次请求B会触发已经存在的B1实例的onNewIntent;
并且如果B所在的任务栈上面有其他Activity,那么其他Activity会被销毁。
一个任务只能有一个此Acitivty ,并且必须作为Root Activity 。
它上面的Activity 只能是Standard & SingleTop
如果它跑到front了
, 其它activity就会离栈
4.B设置为SingleInstance,启动A:
启动B,此时新创建了任务栈13,和先前的A1并不在一个任务。
再启动B,没有创建新实例:
再启动A,再旧的任务12中创建了A的新实例
按下Back键:
signleInstance , 独立成Taskstack ,并且有且仅有你自己 ,孤家寡人 。而且始终保持一个实例
离栈的时候
, 先退当前的task ,再退另外的task
一个任务有且仅有一个SingleInstance , 它作为唯一的activity存在与一个任务里面
android:multiprocess
activity的实例是否能够被载入到启动它的组件所在进程里 — “true”表示可以,”false”表示不行。默认值是”false”。
通常,一个activity的新实例被载入到定义它的应用程序进程里,这样一来,该activity的所有实例运行在同一进程里。然而,如果本标识设为”true”的话,activity的实例就能够运行在多个进程里,允许系统只要使用它时就生成实例(提供的权限允许的话),某些几乎根本不需要或根本不合适。
android:noHistory
当用户离开它且它不再显示在屏幕上时,activity是否应该被从activity stack里移除并且结束掉(调用它的finish()方法) —
“true”表示应该结束,”false”表示不。默认值是”false”。
android:process
activity应该运行的进程的名字。通常,一个应用程序的所有组件运行在为该应用程序生成的默认的进程里。它与应用程序包同名。元素的process属性能够给所有的组件设置一个不同的默认值。但是每个组件可以覆盖该默认值,允许你扩展你的应用程序到多个进程里。
如果本属性指定的名字以冒号开始(‘:’),当需要的时候将会生成该应用程序的一个新的私有进程,activity将运行在那个进程里。如果进程名由一个小写字母开头,activity将运行在一个该名字的全局的进程里,如果它有那个许可的话。这样就允许不同的应用程序组件共享同一进程,从而降低资源消耗。
android:stateNotNeeded
是否activity被销毁和成功重启并不保存状态;
这个属性默认情况为false,若设为true,则当Activity重新启动时不会调用onSaveInstanceState()方法,同样,onCreate()方法中的Bundle参数将会用null值传进去,也就是说,Activity每次启动都跟第一次启动一样。这样,在某种特殊场合下,由于用户按了Home键,该属性设置为true时,可以保证不用保存原先的状态引用,节省了空间资源,从而可以让Activity不会像默认设置那样Crash掉。
android:screenOrientation
android的应用中,有时候需要限制横竖屏切换
android:screenOrientation="landscape"是限制此页面横屏显示,
android:screenOrientation="portrait"是限制此页面数竖屏显示。
android:excludeFromRecents
任务是否在发起这个活动应该被排除在最近使用的应用程序的列表("最近的应用程序")。那是,当这个活动是根活动的一个新任务,这个属性决定了任务不应该出现在列表中最近的应用程序。设置"true"如果这个任务应该被排除在名单,设置"false"如果它应该被包括。默认值为"false"。
十一、扩展
1}Android提供的专有Activity;
MapActivity、ListActivity、ExpandableListActivity、TabActivity;
2}Fragments-界面片段;
3}Loaders-界面异步加载机制;
5、四大组件之一-Activity与Intent的更多相关文章
- Android四大组件之Activity(活动)及其布局的创建与加载布局
Android四大组件之Activity(活动)及其布局的创建与加载布局 什么是Activity ? 活动(Activity)是包含用户界面的组件,主要用于和用户进行交互的,一个应用程序中可以包含零个 ...
- Android四大组件之——Activity的生命周期(图文详解)
转载请在文章开头处注明本博客网址:http://www.cnblogs.com/JohnTsai 联系方式:JohnTsai.Work@gmail.com [Andro ...
- 安卓四大组件之一activity
概要说明 Activity是Android组件中最基本也是最为常见用的四大组件(Activity,Service服务,Content Provider内容提供者,BroadcastReceiver广播 ...
- Android四大组件之——Activity的开启:StartActivity()和StartActivityForResult()(图文详解)
如需转载请在文章开头处注明本博客网址:http://www.cnblogs.com/JohnTsai 联系方式:JohnTsai.Work@gmail.com ...
- 【Android开发日记】之入门篇(四)——Android四大组件之Activity
在Android中,无论是开发者还是用户,接触最多的就算是Activity.它是Android中最复杂.最核心的组件.Activity组件是负责与用户进行交互的组件,它的设计理念在很多方面都和Web页 ...
- 02_四大组件之Activity
四大组件之Activity 1. 理论概述 1.1 Activity的理解 Servlet的理解回顾 狭义 Servlet是一个interface,我们的Servlet类都必须是此接口的实现类 广义 ...
- 【Android】安卓四大组件之Activity(二)
[Android]安卓四大组件之Activity(二) 前言 在这篇文章之前,我已经写过了一篇有关Activity的内容,是关于activity之间的页面跳转和数据传递,而这篇文章着重强调的是Acti ...
- 【Android】安卓四大组件之Activity(一)
[Android]安卓四大组件之Activity(一) 前言 Activity是Android学习中的一个重要组件,想要对其进行系统的了解可以分为几块内容,这一大章节的内容是有关于activity之间 ...
- Android的四大组件之Activity
Android的四大组件之Activity Activity:是Android组件中最基本也是最为常见用的四大组件(Activity,Service服务,Content Provider内容提供者,B ...
随机推荐
- python学习笔记9(对文件的操作)
一.文件对象 我理解的文件对象就是一个接口,通过这个接口对文件进行相关操作. 二.相关函数 [1].内建函数:open() 提供了初始化输入/输出(I/O)操作的通用接口,成功打开一个文件后会返回一个 ...
- Qt的gzip模块实现
一直没找到Qt中方便的gzip模块,于是自己动手,调用zlib模块实现了一份. 目标: 1.gzip的压缩与解压 2.内存中操作 3.方便的Qt接口 实现分析: gzip 压缩算法为 defla ...
- PAT-乙级-1020. 月饼 (25)
1020. 月饼 (25) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 月饼是中国人在中秋佳节时吃的一种传统食 ...
- 团体程序设计天梯赛-练习集L1-004. 计算摄氏温度
L1-004. 计算摄氏温度 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈建海 给定一个华氏温度F,本题要求编写程序,计算对应的 ...
- Hibernate-Validation的使用
首先是要加入下面两个包 hibernate-validator-4.1.0.Final.jar validation-api-1.0.0.GA.jar 如果在验证不通过的时候进行了添加.更新或删除操作 ...
- Codeigniter开发技巧:连接多个数据库(可实现DB读写分离)
在开发中,我们有时候会遇到在同一程序中链接多个数据库的需求,这对Codeigniter框架来说是很简单的,我们只需要在 database.php文件中配置少许参数即可. 默认情况下,CI配置的是链接一 ...
- 如何在CHROME里调试前端代码?
以前看前端们调得很神的, 刚看书到这里,作一个记录,演练了一下,确实有点神!!! :) <!DOCTYPE html> <html lang="en"> & ...
- spring结合时,web.xml的配置
<!-- 1. web.xml配置 <context-param> <param-name>webAppRootKey</param-name> <pa ...
- linux下使用yum安装mysql、tomcat、httpd
一.linux下使用yum安装mysql 1.安装 查看有没有安装过: yum list installed mysql* rpm -qa | grep m ...
- [Err]1267 - Illegal mix of collations(utf8_general_ci,IMPLICIT) and (utf8_unicode_ci,IMPLICIT) for operation ‘=’
SELECT * FROM table_a a where a.id NOT IN (SELECT b.id FROM table_b b); 先将两个数据表的编码统一,如果table_a的编码为 ...