Activity详解(生命周期,启动方式,数据传递,任务栈等)

一、Activity的本质
  Activity是Android组件中最基本也是最为常见用的四大组件之一。Activity是一个应用程序组件,提供一个屏幕,用户可以用来交互为了完成某项任务。
  Activity中所有操作都与用户密切相关,是一个负责与用户交互的组件,可以通过setContentView(View)来显示指定控件。
  在一个android应用中,一个Activity通常就是一个单独的屏幕,它上面可以显示一些控件也可以监听并处理用户的事件做出响应。Activity之间通过Intent进行通信。


二、Activity的生命周期
这是Android开发者文档中对activity的描述的一张图片。
这里写图片描述

简单讲就是,当Activity处于:

这里写图片描述


三、Activity生命周期交互思想

这里写图片描述
  
  我们可以看到,MainActivity先执行了onPause()方法,然后SecondActivity再依次执行onCreate(),onStart()和onReasume()方法,这样是为了避免第二个的Activity开始工作时,第一个Activity还处于工作状态,造成混淆。而MainAcitivity的onStop()方法被最后执行是因为担心SecondActivity的启动过程中途出错而造成“闪退”现象,这时屏幕显示还可以回到MainActivity的状态,防止两个Activity被同时停止的尴尬。
所以,我们对Activity的生命周期要有合理的设计思想,善于利用Activity生命周期中的方法去合理的处理一些界面切换时的逻辑问题。


四、Activity的启动方式
1.显式启动Activity

Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivity(intent);

2.隐式启动Activity
在AndroidMainfest里面添加:

<activity android:name=".TestActivity"
    android:label="TestActivity">
        <intent-filter >
            <action android:name="com.android.test"/>
                    <category  android:name="android.intent.category.DEFAULT"/>
        </intent-filter>
</activity>

在MainActivity.java里启动它:

intent.setAction( "com.android.test");

五、Activity间的数据传递
  在传递数据的activity中添加一个语句,例如(这里只是举个例子,putExtra()重载的函数有很多):

intent.putExtra("name", "Vency");

然后再被传递数据(被跳转到)的activity中添加以下语句:

Intent intent = getIntent();
if (intent != null) {
    String getName = intent.getStringExtra("name");
}

  这样就可以将第一个activity的数据传递到第二个activity中,当然也可以使用新建一个Bundle对象,然后将bundle对象作为putExtra()的参数去实现传递数据的效果,特别是当要传递的数据是一个类的各个属性值时,我们需要运用面向对象中封装的思想,去封装好一个实现序列化接口的bean类,并将该bean类作为bundle.putSerializable()参数传递过去,在被传递的activity类中使用intent.getSerializable()方法将对象的内容取出。同理,我们也可以使用使用Bitmap对象去传递图片数据。
  
  Tips:但是有一点要注意的是,Bundle之间传递的数据不能过大,否则会抛出TranslationTooLargeException的错误信息。


六、Activity的任务栈

这是Google官方对Task和Back stack描述中比较关键的两个段话。

这里写图片描述

  Task其实就是是一个具有栈结构的容器,可以放置多个Activity实例。启动一个应用,系统就会为之创建一个task,来放置根Activity;默认情况下,一个Activity启动另一个Activity时,(例如美团外卖里面有个催单按钮,点击之后会调用并打开系统的拨号界面),两个Activity是放置在同一个task中的,后者被压入前者所在的task栈,当用户按下后退键,后者从task被弹出,前者又显示在幕前,特别是启动其他应用中的Activity时,两个Activity对用户来说就好像是属于同一个应用;系统task和task之间是互相独立的,当我们运行一个应用时,按下Home键回到主屏,启动另一个应用,这个过程中,之前的task被转移到后台,新的task被转移到前台,其根Activity也会显示到幕前,过了一会之后,在此按下Home键回到主屏,再选择之前的应用,之前的task会被转移到前台,系统仍然保留着task内的所有Activity实例,而那个新的task会被转移到后台,如果这时用户再做后退等动作,就是针对该task内部进行操作了。

这里写图片描述

  当前的activity启动一个新的activity时,新的activity会被压在back stack的栈顶并且获得焦点。前一个activity仍然在栈中,但是stopped。当一个activity停止时,系统会保持它的用户交互状态。当用户按下Back键,当前activity会出栈(这个activity会被销毁),前一个activity会被恢复,并且它的UI状态也会被恢复。


七、Activity的四种启动模式

  1. standard
      默认启动模式,每次激活Activity时都会创建Activity,并放入任务栈中,永远不会调用onNewIntent()。

  2. singleTop
      如果在任务的栈顶正好存在该Activity的实例, 就重用该实例,并调用其onNewIntent(),否者就会创建新的实例并放入栈顶(即使栈中已经存在该Activity实例,只要不在栈顶,都会创建实例,而不会调用onNewIntent(),此时就跟standard模式一样)。

  3. singleTask
      如果在栈中已经有该Activity的实例,就重用该实例(会调用实例的onNewIntent())。重用时,会让该实例回到栈顶,因此在它上面的实例将会被移除栈。如果栈中不存在该实例,将会创建新的实例放入栈中(此时不会调用onNewIntent())。

  4. singleInstance
      在一个新栈中创建该Activity实例,并让多个应用共享改栈中的该Activity实例。一旦改模式的Activity的实例存在于某个栈中,任何应用再激活改Activity时都会重用该栈中的实例,其效果相当于多个应用程序共享一个应用,不管谁激活该Activity都会进入同一个应用中。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值