Android之Activity详解

一、Activity概述

Activity作为Android四大组件之一,是用户接口程序,原则上是为用户提供一个交互的接口。Activity本身是没有界面的,Activity类创建了一个窗口,开发人员通过setContentView(Viewview)接口把UI放到Activity创建的窗口上。当Activity全屏时,也可以用其他方式实现交互:作为漂浮窗口(通过windowIsFloating的主题集合),或者嵌入到其他的Activity。Activity是相对独立,为用户提供界面交互。

二、Activity的生命周期

通过上图,可以看到Activity的生命周期中有三个重要的周期循环。

1. 整个的生命周期,从onCreate(Bundle)开始到onDestroy()结束。在onCreate()方法建立一个activity所需要的一些基础操作。如声明UI元素,定义成员变量,配置UI等。官方推荐,在onCreate方法里面不适处理耗时操作,避免程序启动太久而看不到界面。当收到需要将该activity彻底移除的信号时,系统会调用这个方法。如果activity含有在onCreate调用时创建的后台线程,或者是其他有可能导致内存泄漏的资源,则应该在OnDestroy()时进行资源清理,杀死后台线程。

2. 可见的生命周期,从onStart()开始到onStop()结束。在这段时间,可以看到Activity在屏幕上,尽管有可能不在前台,不能和用户交互。在这两个接口之间,需要保持显示给用户的UI数据和资源等,例如:可以在onStart中注册一个IntentReceiver来监听数据变化导致UI的变动,当不再需要显示时候,可以在onStop()中注销它。onStart(),onStop()都可以被多次调用,因为Activity随时可以在可见和隐藏之间转换。

3. 前台的生命周期,从onResume()开始到onPause()结束。在这段时间里,该Activity处于所有 Activity的最前面,和用户进行交互。Activity可以经常性地在resumed和paused状态之间切换,例如:当设备准备休眠时,当一个 Activity处理结果被分发时,当一个新的Intent被分发时。所以在这些接口方法中的代码应该属于非常轻量级的。

在这三个周期循环中,三个静态的,这三个状态下activity可以存在一段比较长的时间。三个静态状态如下:

  • Resumed:该状态下,activity处在前台,用户可以与它进行交互。(通常也被理解为"running" 状态)
  • Paused:该状态下,activity的部分被另外一个activity所遮盖:另外的activity来到前台,但是半透明的,不会覆盖整个屏幕。被暂停的activity不再接受用户的输入且不再执行任何代码。
  • Stopped:该状态下, activity完全被隐藏,对用户不可见。可以认为是在后台。当stopped, activity实例与它的所有状态信息(如成员变量等)都会被保留,但activity不能执行任何代码。

其它状态 (CreatedStarted)都是短暂的,系统快速的执行那些回调函数并通过执行下

一阶段的回调函数移动到下一个状态。也就是说,在系统调用onCreate(),之后会迅速调用onStart(),之后再迅速执行onResume()。以上就是基本的activity生命周期。

        当在onPause(),onStop(),onDestroy(),这状态下,如果系统内存不足,会将Activity kill掉。

三、指定程序首次创建Activity

每个APP,应当在AndroidManifest.xml中定义作为APP的主activity的activity。当用户从主界面点击程序时,系统会调用APP中被声明为"launcher" (or "main") activity中的onCreate()方法。这个Activity被用来当作程序的主要进入点。

    这个main activity必须在manifest使用包括 MAINaction 与LAUNCHERcategory 的<intent-filter>标签来声明。例如

<span style="font-size:14px;">< activity android:name=".MainActivity" android:label="@string/app_name">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>
</span>

如果程序中没有声明了MAIN action 或者LAUNCHER category的activity,那么在设备的主界面列表里面不会呈现app图标。

四、Activity生命周期运行详解

1.  首次打开Activity:onCreate-> onStart -> OnResume

<span style="font-size:14px;">12-23 11:18:17.450 20918-20918/com.example.activitydemo I/MainActivity: onCreate
12-23 11:18:17.450 20918-20918/com.example.activitydemo I/MainActivity: onStart
12-23 11:18:17.450 20918-20918/com.example.activitydemo I/MainActivity: onResume
</span>

2.  横竖屏切换: onPause() -> onStop -> onDestroy-> onCreate -> onStart -> onResume

<span style="font-size:14px;">12-23 11:19:22.470 20918-20918/com.example.activitydemo I/MainActivity: onPause
12-23 11:19:22.470 20918-20918/com.example.activitydemo I/MainActivity: onStop
12-23 11:19:22.470 20918-20918/com.example.activitydemo I/MainActivity: onDestroy
12-23 11:19:22.620 20918-20918/com.example.activitydemo I/MainActivity: onCreate
12-23 11:19:22.620 20918-20918/com.example.activitydemo I/MainActivity: onStart
12-23 11:19:22.620 20918-20918/com.example.activitydemo I/MainActivity: onResume
</span>
3.电话进入:onPause -> onStop;    电话界面关闭:onRestart-> onStart -> onResume

<span style="font-size:14px;">12-23 11:22:11.380 20918-20918/com.example.activitydemo I/MainActivity: onPause
12-23 11:22:11.720 20918-20918/com.example.activitydemo I/MainActivity: onStop
12-23 11:22:15.450 20918-20918/com.example.activitydemo I/MainActivity: onRestart
12-23 11:22:15.450 20918-20918/com.example.activitydemo I/MainActivity: onStart
12-23 11:22:15.450 20918-20918/com.example.activitydemo I/MainActivity: onResume
</span>
4.Dialog弹出: 状态未改变,依然在 onResum状态
5.Toast 弹出: 状态未改变,依然在 onResum状态

6.  点击Back键: onPause ->onStop -> onDestroy

12-23 11:26:08.820 20918-20918/com.example.activitydemo I/MainActivity: onPause
12-23 11:26:09.100 20918-20918/com.example.activitydemo I/MainActivity: onStop
12-23 11:26:09.100 20918-20918/com.example.activitydemo I/MainActivity: onDestroy
7.点击Home键: onPause ->onStop
<span style="font-size:14px;">12-23 11:24:14.700 20918-20918/com.example.activitydemo I/MainActivity: onPause
12-23 11:24:15.010 20918-20918/com.example.activitydemo I/MainActivity: onStop
</span>
8.按Home键后的,重启APP: onRestart -> onStart -> onResume
<span style="font-size:14px;">12-23 11:25:09.600 20918-20918/com.example.activitydemo I/MainActivity: onRestart
12-23 11:25:09.600 20918-20918/com.example.activitydemo I/MainActivity: onStart
12-23 11:25:09.600 20918-20918/com.example.activitydemo I/MainActivity: onResume
</span>
9. 创建第二Activity,并返回原Activity

    打开第二个Aty

<span style="font-size:14px;">12-23 13:02:23.160 21423-21423/com.example.activitydemo I/MainActivity: onPause
12-23 13:02:23.560 21423-21423/com.example.activitydemo I/MainActivity: onStop
</span>
   关闭第二个Aty

<span style="font-size:14px;">12-23 13:03:12.440 21423-21423/com.example.activitydemo I/MainActivity: onRestart
12-23 13:03:12.440 21423-21423/com.example.activitydemo I/MainActivity: onStart
12-23 13:03:12.440 21423-21423/com.example.activitydemo I/MainActivity: onResume
</span>

五、Activity的栈管理启动模式

Android针对Activity实行栈管理模式。大家都知道,栈是一个后进先出的模式。任务栈中包含了一个个Activity实例对象,位于栈底的Activity就是开启这个栈的根Activity。某一个时刻只有一个Activity处在栈顶,当这个Activity被销毁后,下面的Activity才有可能浮到栈顶,或者有一个新的Activity被创建出来,则旧的Activity就被压栈沉下去了。

默认情况下,如果一个任务栈被用户放置在后台很长一段时间,系统会回收除栈底Activity(即根栈)以外的其他Activity。如果用户再次打开,会进入根Activity。这里所说的是默认情况,在创建Activity时,可以通过<activity>标签修改一些属性来改变:
   
1)alwaysRetainTaskState属性
    如果将根activity的alwaysRetainTaskState属性设置为“true”,则即便一个任务栈在很长的一段时间都被用户保持在后台的,系统也不会对这个任务栈进行清理。
    2)clearTaskOnLaunch属性
    如果将根activity的clearTaskOnLaunch属性设置为“true”,那么只有这个任务栈切换到了后台,那么系统就会将这个任务栈中除了根activity以外的其它所有activity全部清除掉。即和alwaysRetainTaskState的行为完全相反。
    3) finishOnTaskLaunch属性
    这个属性的行为类似于clearTaskOnLaunch,但是此属性作用于单个的activity对象,而不是整个任务栈。当这个任务栈切换到了后台,这个属性可以使任务栈清理包括根activity在内的任何activity对象。

六、Activity启动模式

Android基于栈对Activity管理。如果一个Activity启动是否生成一个新的Activity实例,或者是否跟其他Activity处于同一个栈里呢?这里不得不说,Activity的启动模式了。我们可以在AndroidManifest.xml配置<activity>的android:launchMode属性,来设置新Activity的启动模式。

下面介绍四种启动模式:

1.standard

standard模式是默认的启动模式,不用为<activity>配置android:launchMode属性即可,当然也可以指定值为standard。

   2.singleTop

    singleTop启动模式,如果发现有对应的Activity实例正位于栈顶,则重复利用,不再生成新的实例

3.singleTask

     singleTask模式,如果发现所在Activity栈中有对应的Activity实例,则使此Activity实例之上的其他Activity实例统统出栈,使此Activity实例成为栈顶对象,显示到幕前

    4.singleInstance

这种启动模式比较特殊,因为它会启用一个新的栈结构,将Acitvity放置于这个新的栈结构中,并保证不再有其他Activity实例进入。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值