android学习笔记二、Activity深入学习

时间:2021-02-25 00:30:28

一、创建和使用:

  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、

三、任务,返回栈和启动模式:

android学习笔记二、Activity深入学习

  一个应用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()启动,而不是重新创建。实际测试生命周期方法回调如下:

android学习笔记二、Activity深入学习

    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传递对象