android学习笔记二、Activity深入学习
一、创建和使用:
1、Activity是android的四大组件之一,需要继承Activity并在清单文件中进行声明才能使用。没有声明则报错。
2、启动Activity是通过Intent,有两种方式:显式Intent和隐式Intent,前者通常是启动我们自己的Intent;后者通常是调用其他的项目进行操作(如打电话)
二、生命周期方法:是Activity创建到销毁过程中的回调方法,可以在其中处理一些事物,例如构建View,保存数据等。
参考http://colobu.com/2014/09/25/android-activity-lifecycle/,
说明:①onSaveInstanceState不是生命周期方法,但是在一些特殊情况下会被调用(不是一定).需要注意的是其何时会被调用(简单的说就是由系统非用户主动结束一个activity时会被调用)。由于不是一定调用,所以如果需要保存一些持久化数据需要使用onPause()。参考:http://www.cnblogs.com/hanyonglu/archive/2012/03/28/2420515.html。
②关于横竖屏切换的问题:默认情况下,此时会引起activity的重新绘制(会触发上面的方法)。详细的讨论参考:http://www.cnblogs.com/xiaoQLu/p/3324503.html.小知识:Ctrl+F11/F12--》模拟器横竖屏切换。默认情况下横竖屏的切换导致Activity的销毁和重新创建,可以在清单文件中加入配置忽略这种改变。
X、管理Dialog:
1、Dialog是和activity无关的,但是可以通过activity中的方法可以将其与创建的activity进行绑定。
参考:http://ipjmc.iteye.com/blog/1266602,
http://blog.csdn.net/caowenbin/article/details/5868665。
2、
三、任务,返回栈和启动模式:
一个应用Application包含多个Activity。
!!!默认启动模式下,用户通过点击主屏幕上的应用图标开启一个Task,之后开启的Activity都是在这个Task中进行的(包括调用其他的应用进行的操作,跨任务),之前的Activity并没有被销毁而只是停止(这就是为什么只调用onStop而没有调用onDestroy),并被压入返回栈(back stack)中,当点击返回键时,会对当前ctivity进行出栈并销毁。当用户在运行中点击Home键回到主屏幕时,刚才启动的Task将退到后台等待重新打开(这是android默认的多任务机制)。
除了默认的启动模式,android还提供了另外三种模式可供选择,分别为standard,singleTop,singleTask,singleInstance。设置启动方式有两种方法:
1、在相应的<Activity>中进行声明
<activity android:name=".app.InterstitialMessageActivity"
android:label="@string/interstitial_label"
android:theme="@style/Theme.Dialog"
android:launchMode="singleTask"
</activity>
声明启动模式
2、通过Intent中的标记来启动,主要使用的标记有:
FLAG_ACTIVITY_NEW_TASK==singleTask,
FLAG_ACTIVITY_SINGLE_TOP==singleTop,
FLAG_ACTIVITY_CLEAR_TOP==singleInstance
注意:通过Intent标记方式设置的启动模式将覆盖清单文件中的声明。
关于四种启动模式的区别这里简要说明:
1、standard:系统在启动 Activity 的任务中创建 Activity 的新实例并向其传送 Intent。Activity 可以多次实例化,而每个实例均可属于不同的任务,并且一个任务可以拥有多个实例。
2、singleTop:如果当前Task的栈顶Activity就是要启动的,那么将调用onNewIntent()启动,而不是重新创建。实际测试生命周期方法回调如下:
3、singleTask:系统创建新任务并实例化位于新任务底部的Activity但是,如果该 Activity 的一个实例已存在于一个单独的任务中,则系统会通过调用现有实例的onNewIntent
方法向其传送 Intent,而不是创建新实例。一次只能存在 Activity 的一个实例。注:尽管 Activity 在新任务中启动,但是用户按“返回”按钮仍会返回到前一个 Activity。在注:即使使用了该模式也并不一定会开启新Task,还需要由taskAffinity来确定,这也是在<Activity>中声明的。
4、singleInstance:该模式也会重新启动一个Task来运行Activity,该 Activity 始终是其任务唯一仅有的成员;由此 Activity启动的任何 Activity 均在单独的任务中打开。
注意:这四种启动模式的存在是为了提高用户的体验,针对不同的情况可以选择不同的启动模式。
参考:http://blog.csdn.net/zhangjg_blog/article/details/10923643
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0520/2897.html
http://developer.android.com/intl/zh-cn/guide/components/tasks-and-back-stack.html
零、源码解读
开启一个activity的详细过程参考:http://ju.outofmemory.cn/entry/230403,
说明:①在最后的具体方法中,使用Instrumentation来创建Activity实例;并且在生成Application时使用的是LoadedApk类的makeApplication(),但是其内部也是使用Instrumentation实现。
②调用Activity类通过重写onActivityResult()可以接受返回值,被调用Activity类使用setResult()返回结 果,有两种形式,一种只有返回值,一种带有数据。有requestCode/resultCode来区分请求/响应的Activity.参考:http://www.cnblogs.com/linjiqin/archive/2011/06/03/2071956.html。
③开启过程中需要一个Intent意图对象,该对象有六个主要部分:六个主要组成部分来抽象描述的请求信息,它们是组件名称,行为,数据 / 数据类型,类别,附加信息和标示位,
Intent内部属性
参考:https://www.ibm.com/developerworks/cn/opensource/os-cn-android-intent/,
有两个主要作用:
①找到需要打开的Activity,有两种方式:一种是指明需要打开的activity,称为显式Intent;另一种是隐式Intent,就是通过Activity在清单文件中的intent-filter来进行匹配开启的(使用到的是action,category,data即Uri来进行匹配),可以看到:action和category只有name属性,而data可以是URI的一部分进行匹配。
注意:data中除了URI之外还可以是mimetype,但是设置会有问题:使用setType可以设置mimetype进行匹配,但是该方法会将data数据值为null,反之亦然。可以使用setDataAndType同时设置。
intent源码
intent-filter配置示例
参考:http://blog.csdn.net/xiao__gui/article/details/11392987,
http://1137907860.blog.51cto.com/10452906/1678215.
Intent中定义了大量常量来记录标准的action,category,flag,等用于过滤Intent,关于常用参见下表:http://blog.csdn.net/yclfdn2004/article/details/44098747
②传递数据:Intent中有大量的putExtra()重载来进行数据的存储,对于基本类型(包括其数组)可以直接存储,但是存储对象有以下几种方式,但是有一个共同特点就是将对象进行了序列化(关于序列化详见后文)。
Intent传递对象
android学习笔记二、Activity深入学习的更多相关文章
- [转]NLog学习笔记二:深入学习
本文转自:http://www.cnblogs.com/CCHUncle/p/5207735.html 配置文件 NLog所有的配置信息都可以写到一个单独的xml文件中,也可以在程序代码中进行配置. ...
- NLog学习笔记二:深入学习
配置文件 NLog所有的配置信息都可以写到一个单独的xml文件中,也可以在程序代码中进行配置. 配置文件位置 启动的时候,NLog会试图查找配置文件完成自动配置,查找的文件依次如下(找到配置信息则结束 ...
- 【Python学习笔记二】开始学习啦!如何在IDEA中新建python文件
1.新建module 2.选择本地安装的python 3.右键新建的module,创建python file就可以开始编程了 4.有时候回出现无法识别python内建函数的问题,就是运行没 ...
- NumPy学习笔记 二
NumPy学习笔记 二 <NumPy学习笔记>系列将记录学习NumPy过程中的动手笔记,前期的参考书是<Python数据分析基础教程 NumPy学习指南>第二版.<数学分 ...
- Linux学习笔记(二) 文件管理
了解 Linux 系统基本的文件管理命令可以帮助我们更好的使用 Linux 系统,以下介绍几个常用的文件管理命令 1.pwd pwd 是 Print Working Directory 的简写,用于显 ...
- WPF的Binding学习笔记(二)
原文: http://www.cnblogs.com/pasoraku/archive/2012/10/25/2738428.htmlWPF的Binding学习笔记(二) 上次学了点点Binding的 ...
- AJax 学习笔记二(onreadystatechange的作用)
AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了on ...
- [Firefly引擎][学习笔记二][已完结]卡牌游戏开发模型的设计
源地址:http://bbs.9miao.com/thread-44603-1-1.html 在此补充一下Socket的验证机制:socket登陆验证.会采用session会话超时的机制做心跳接口验证 ...
- JMX学习笔记(二)-Notification
Notification通知,也可理解为消息,有通知,必然有发送通知的广播,JMX这里采用了一种订阅的方式,类似于观察者模式,注册一个观察者到广播里,当有通知时,广播通过调用观察者,逐一通知. 这里写 ...
- java之jvm学习笔记二(类装载器的体系结构)
java的class只在需要的时候才内转载入内存,并由java虚拟机的执行引擎来执行,而执行引擎从总的来说主要的执行方式分为四种, 第一种,一次性解释代码,也就是当字节码转载到内存后,每次需要都会重新 ...
随机推荐
- Qt之根据扩展名获取文件图标、类型
简述 在C++根据扩展名获取文件图标.类型一节中我们分享了如何根据扩展名来获取对应的文件图标.类型,下面.我们在Qt中使用它. 简述 示例 效果 源码 更多参考 示例 如下,我们根据扩展名来获取对应的 ...
- spring 、Mybatis配置sql server数据库
学习了:http://www.cnblogs.com/amwicfai/p/3181003.html beans.xml中的配置写法: <!-- 数据源 --> <bean id=& ...
- zoj 1655 单源最短路 改为比例+最长路
http://acm.zju.edu.cn/onlinejudge/showProblem.do? problemId=655 没有理解清题意就硬套模板.所以WA了好几次. 解析看我的还有一篇http ...
- 深入C++ new/delete,malloc/free解析
深入C++ new/delete,malloc/free解析 1.malloc与free是C++/C语言的标准库函数.new/delete是C++的运算符. 它们都可用于申请动态内存和释放内存 2.对 ...
- URL长链接转换为短链接
URL长链接转换为段链接的工具非常多,可是.小编还是要给大家唠一种方法的: 操作过程例如以下,打开腾讯微博或者其它微,将自己的URL地址值按图片操作:
- 一步一步跟我学习lucene(19)---lucene增量更新和NRT(near-real-time)Query近实时查询
这两天加班,不能兼顾博客的更新.请大家见谅. 有时候我们创建完索引之后,数据源可能有更新的内容.而我们又想像数据库那样能直接体如今查询中.这里就是我们所说的增量索引.对于这种需求我们怎么来实现呢?lu ...
- spark 类标签的稀疏 特征向量
一个向量(1.0,0.0,3.0)它有2中表示的方法 密集:[1.0,0.0,3.0] 其和一般的数组无异 稀疏:(3,[0,2],[1.0,3.0]) 其表示的含义(向量大小,序号,值 ...
- Hive框架基础(一)
* Hive框架基础(一) 一句话:学习Hive有毛用? 那么解释一下 毛用: * 操作接口采用类SQL语法,提供快速开发的能力(不会Java也可以玩运算) * 避免了去写MapReduce,减少开发 ...
- GPU开发笔记(一)
首先我想到的是把安装好的CUDA下的programdata里面的demo都找一找,看看有没有自己需要的demo程序. 然后去CSDN或者pudn上去找找开源的代码. 至于GITHUB还没找过. 其次是 ...
- webpack入门与笔记
为什要使用WebPack 现今的很多网页其实可以看做是功能丰富的应用,它们拥有着复杂的JavaScript代码和一大堆依赖包.为了简化开发的复杂度,前端社区涌现出了很多好的实践方法 模块化,让我们可以 ...