安卓四大组件总结之activity

一、简介

    Android四大组件分别为activity、service、content provider、broadcast receiver。(活动、服务、内容提供器、广播)。

1、activity

    (1)一个Activity通常是一个单独的窗口,是一个负责与用户交互的组件。

    (2)可以通过setContentView(View)来显示指定控件,默认继承AppCompatActivity。

    (3)Activity之间通过Intent而激活进行通信。

    (4)必须要在AndroidManifest.xml配置文件中声明才能使用。

    (5)安卓系统是一个多任务栈的操作系统,可以同时处理多个任务(如一边看电影,一边下载)。每个任务栈都有自己的TaskAffinity标识。一个应用程序默认是只有一个任务栈,特殊情况下singleinstance会有多个任务栈。

  • TaskAffinity 参数标识着Activity所需要的任务栈的名称,默认情况下,一个应用中所有Activity所需要的任务栈名称都为该应用的包名。
  • 如:
<activity android:name=".SecondActivity" android:launchMode="singleTask"
 android:taskAffinity="com.devilwwj.task"
 />
  • TaskAffinity 属性一般跟singleTask模式或者跟allowTaskReparenting属性结合使用,在其他情况下没有实际意义。
  • TaskAffinity属性的值不能与当前应用包名相同,否则无效。

  (6)四种启动模式:standard(标准模式)、singleTop(栈顶复用模式)、singleTask(栈内复用模式)、singleInstance(单实例模式)。

a、standard(标准模式)

   默认模式,不用去配置。此模式下,在一个栈中,Activity可以有多个相同的实例,也允许多个相同Activity叠加。大部分情况下,都应该使用这种模式。(哪个activity启动了standard模式下的activity,那这个standard模式下的activity就会运行在启动它的activity所处的栈中)。

例子:

   设A、B都为standard模式,想要activity的启动顺序为A->B->B(即在activity A中打开activity B一次,再在activity B中打开activity B自身),实际在栈中的activity也为A->B->B,两个activity B处于activity A所处的栈中。

b、singleTop(栈顶复用模式)

   此模式下,在一个栈中,此模式下,在一个栈中 ,Activity可以有多个实例,但是不允许多个相同Activity在栈顶叠加。

    当想要启动的activity已位于栈顶时,启动相同activity不会创建新的实例,系统就不会再调用通常情况下我们处理请求数据的onCreate方法,而是调用其onNewIntent(intent),在onNewIntent() 中使用setIntent(intent)赋值给Activity的Intent。否则,后续的getIntent()都是得到老的Intent。

    当想要启动的activity在栈中已存在但不位于栈顶时,启动相同activity会再创建新的实例。

例子:

    设A为standard模式、B为singleTop模式,想要activity的启动顺序为A->B->B,实际在栈中的activity却为A->B,前一个activity B处于activity A所处的栈中,后一个activity B启动时没有创建新的实例,而是调用其onNewIntent(intent)。

    设A为standard模式、B为singleTop模式,想要activity的启动顺序为A->B->A->B,实际在栈中的activity也为A->B->A->B,因为只保持栈顶单例。

c、singleTask(栈内复用模式)

    顾名思义,在一个任务栈内,只有一个实例(单例)。Activity在任务栈内单例,但在系统内可以多例,且Activity在一个任务栈内可与其他不为singleInstance模式的activity共存。

    启动singleTask模式的activity A时,先寻找A所需任务栈(即用TaskAffinity标识的),若此任务栈不存在,则创建一个新的任务栈,然后创建A的实例放入栈中;若此任务栈存在,再看栈中A是否存在,若A不存在,则在当前任务栈创建一个新的实例放入栈中;若存在,则将任务栈中位于A之上的其它activity 出栈(销毁)使A位于栈顶并调用它的onNewIntent方法。

例子:

    设activity A为singleTask模式,若A所需任务栈为T1,T1不存在则新建T1再放入A;T1存在时,又分为以下两种情况:

T1中没有A,则直接放入A的实例;

T1中有A,假设栈内情况为BADC,则弹出DC,使A位于栈顶并调用它的onNewIntent方法。

d、singleInstance(单实例模式)

    在整个系统里只有一个实例,启动一singleInstance Activity时,系统会创建一个新的任务栈,并且这个任务栈只有他一个Activity。后续如果再启动同一个singleInstance Activity时,则不会再创建新的实例,除非这个singleInstance Activity所在的栈被销毁。

例子:

    同一应用程序内,设activity A为singleInstance模式,其他为默认模式,启动顺序为B->A->C,则会有两个栈,栈内分别为BC和A。

    不同应用程序,设activity A为singleInstance模式,其他为默认模式,启动顺序为other->A->C,则会有三个栈,栈内分别为other、A和C,A、C所处的两个栈位于同一应用程序中(特殊!因为一个应用程序默认是只有一个任务栈)。

(7)如何指定activity的启动模式

a、AndroidMainfest中

<activity android:name=".SecondActivity" android:launchMode="singleTask"
 android:taskAffinity="com.devilwwj.task"
 />

b、Intent中设置标志位

Intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

 intent.setFlags(XXXXX);

    1、Intent.FLAG_ACTIVITY_SINGLE_TOP

        跟加载模式中singleTop栈顶单实例类似

    2、Intent.FLAG_ACTIVITY_CLEAR_TOP

        跟加载模式中singleTask区别:如果activity已经存在,并处于栈中,会把目标Activity 之上的所有Activity都销毁(包括自身),重新创建一个新的Activity       

    3、Intent.FLAG_ACTIVITY_NEW_TASK

        如果在service中跳转Activity,必须去设置意图标志位

区别:Intent设置的优先级大于AndroidMainfest中设置的,如果两种同时存在,则以Intent为准。

(8)生命周期


                                                                                                                                           图片转载来源见水印

1.onCreate()

  这个方法在每一个Activity类都会有,当我们新建一个Activity类时,一定会重写父类的onCreate方法,onCreate方法会在Activity第一次被创建时调用。我们应该在这个方法中完成Activity的初始化操作,比如说加载布局,初始化布局控件,绑定按钮事件等。

2.onStart()

  这个方法在Activity由不可见变为可见时调用。

3.onResume()

  这个方法在Activity准备好喝用户交互的时候调用。此时的Activity一定位于返回栈的栈顶,并且处于运行状态。

4.onPause()

  这个方法在系统准备去启动或者恢复另一个Activity的时候调用。

5.onStop()

  这个方法在Activity完全不可见的时候调用。它和onPause()方法的主要区别在于,如果启动的新Activity是一个对话框式的activity,那么,onPause()方法会得到执行,而onStop()方法并不会执行。

6.onDestory()

  这个方法在Activity被销毁之前调用,之后Activity的状态将变为销毁状态。

7.onRestart()

  这个方法在Activity由停止状态变为运行状态之前调用,也就是Activity被重新启动了。


(9)Activity的四种状态

1.运行状态

  当一个Activity位于返回栈(关于返回栈的概念下面再介绍)的栈顶时,这时Activity就处于运行状态,系统会将处于栈顶的Activity显示给用户。

2.暂停状态

  当一个Activity不再处于栈顶位置,但仍然可见,这时Activity就进入了暂停状态。初学者可能会有这样的疑问,既然Activity都已经不在栈顶了,怎么会还可见呢,这是因为并不是每一个Activity都会占满整个屏幕的,比如对话框形式的Activity只会占用屏幕中间的部分区域。

3.停止状态

   当一个Activity不再处于栈顶位置,并且完全不可见的时候,就进入了停止状态。

4.销毁状态

  当一个Activity从返回栈中移除后就变成了销毁状态。

(10)activity的关闭

    调用finish()方法。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值