欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

简单介绍Android开发中的Activity控件的基本概念

程序员文章站 2023-12-11 15:18:04
activity是最基本的模块,一般称之为"活动",在应用程序中,一个activity通常就是一个单独的屏幕。简单理解,activity代表一个用户所能看到的屏幕,主要用于...

activity是最基本的模块,一般称之为"活动",在应用程序中,一个activity通常就是一个单独的屏幕。简单理解,activity代表一个用户所能看到的屏幕,主要用于处理应用程序的整体性工作,例如监听系统事件,为用户显示指定的view,启动其他activity等。所有应用的activity都继承于android.app.activity类,该类是android提供的基层类,其他的activity继承该父类后,通过父类的方法来实现各种功能。

activity 生命周期图如下:

简单介绍Android开发中的Activity控件的基本概念

在android中,activity拥有四种基本状态:

1、active/runing一个新 activity 启动入栈后,它在屏幕最前端,处于栈的最顶端,此时它处于可见并可和用户交互的激活状态。

2、paused 当 activity 被另一个透明或者 dialog 样式的 activity 覆盖时的状态。此时它依然与窗口管理器保持连接,系统继续维护其内部状态,所以它仍然可见,但它已经失去了焦点故不可与用户交互。

3、stoped 当 activity 被另外一个 activity 覆盖、失去焦点并不可见时处于 stoped状态。

4、killed activity 被系统杀死回收或者没有被启动时处于 killed状态。

当一个 activity 实例被创建、销毁或者启动另外一个 activity 时,它在这四种状态之间进行转换,这种转换的发生依赖于用户程序的动作。

如上所示,android 程序员可以决定一个 activity 的"生",但不能决定它的"死",也就时说程序员可以启动一个 activity,但是却不能手动的"结束"一个 activity。当你调用 activity.finish()方法时,结果和用户按下 back 键一样:告诉 activity manager 该 activity 实例完成了相应的工作,可以被"回收"。随后 activity manager 激活处于栈第二层的 activity 并重新入栈,同时原 activity 被压入到栈的第二层,从 active 状态转到 paused 状态。例如:从 activity1 中启动了 activity2,则当前处于栈顶端的是 activity2,第二层是 activity1,当我们调用 activity2.finish()方法时,activity manager 重新激活 activity1 并入栈,activity2 从 active 状态转换 stoped 状态,activity1. onactivityresult(int requestcode, int resultcode, intent data)方法被执行,activity2 返回的数据通过 data参数返回给 activity1。

非用户行为把activity不可见的时候,例如电话忽然来了==

/**
  * 重新创建恢复缓存的数据
  */
  @override
  protected void onrestoreinstancestate(bundle savedinstancestate) {
    log.i("onrestoreinstancestate",savedinstancestate.getstring("name"));
    super.onrestoreinstancestate(savedinstancestate);
  }
  /**
  * 被摧毁前保存缓存的一些数据
  */
  @override
  protected void onsaveinstancestate(bundle outstate) {
    outstate.putstring("name", "简明现代魔法");
    super.onsaveinstancestate(outstate);
  }

在android里,有4种activity的启动模式,分别为:

  1.   ·standard: 标准模式,一调用startactivity()方法就会产生一个新的实例。
  2.   ·singletop: 如果已经有一个实例位于activity栈的顶部时,就不产生新的实例,而只是调用activity中的newinstance()方法。如果不位于栈顶,会产生一个新的实例。
  3.   ·singletask: 会在一个新的task中产生这个实例,以后每次调用都会使用这个,不会去产生新的实例了。
  4.   ·singleinstance: 这个跟singletask基本上是一样,只有一个区别:在这个模式下的activity实例所处的task中,只能有这个activity实例,不能有其他的实例。

  这些启动模式可以在功能清单文件androidmanifest.xml中进行设置,中的launchmode属性。

  相关的代码中也有一些标志可以使用,比如我们想只启用一个实例,则可以使用 intent.flag_activity_reorder_to_front 标志,这个标志表示:如果这个activity已经启动了,就不产生新的activity,而只是把这个activity实例加到栈顶来就可以了。

  intent intent = new intent(reorderfour.this, reordertwo.class);

  intent.addflags(intent.flag_activity_reorder_to_front);

  startactivity(intent);  

  activity的加载模式受启动activity的intent对象中设置的flag和manifest文件中activity的元素的特性值交互控制。

  下面是影响加载模式的一些特性

  核心的intent flag有:

  •   flag_activity_new_task
  •   flag_activity_clear_top
  •   flag_activity_reset_task_if_needed
  •   flag_activity_single_top

  核心的特性有:

  •   taskaffinity
  •   launchmode
  •   allowtaskreparenting
  •   cleartaskonlaunch
  •   alwaysretaintaskstate
  •   finishontasklaunch

  四种加载模式的区别

  所属task的区别

  一般情况下,“standard”和”singletop”的activity的目标task,和收到的intent的发送者在同一个task内,就相当于谁调用它,它就跟谁在同一个task中。

  除非intent包括参数flag_activity_new_task。如果提供了flag_activity_new_task参数,会启动到别的task里。

  “singletask”和”singleinstance” 总是把要启动的activity作为一个task的根元素,他们不会被启动到一个其他task里。

  是否允许多个实例

  “standard”和”singletop”可以被实例化多次,并且是可以存在于不同的task中;这种实例化时一个task可以包括一个activity的多个实例;

  “singletask”和”singleinstance”则限制只生成一个实例,并且是task的根元素。

  singletop 要求如果创建intent的时候栈顶已经有要创建的activity的实例,则将intent发送给该实例,而不创建新的实例。

  是否允许其它activity存在于本task内

  “singleinstance”独占一个task,其它activity不能存在那个task里;

  如果它启动了一个新的activity,不管新的activity的launch mode 如何,新的activity都将会到别的task里运行(如同加了flag_activity_new_task参数)。

  而另外三种模式,则可以和其它activity共存。

  是否每次都生成新实例

  “standard”对于每一个启动intent都会生成一个activity的新实例;

  “singletop”的activity如果在task的栈顶的话,则不生成新的该activity的实例,直接使用栈顶的实例,否则,生成该activity的实例。

  比如:

  现在task栈元素为a-b-c-d(d在栈顶),这时候给d发一个启动intent,如果d是 “standard”的,则生成d的一个新实例,栈变为a-b-c-d-d。

  如果d是singletop的话,则不会生产d的新实例,栈状态仍为a-b-c-d

  如果这时候给b发intent的话,不管b的launchmode是”standard” 还是 “singletop” ,都会生成b的新实例,栈状态变为a-b-c-d-b。

  “singleinstance”是其所在栈的唯一activity,它会每次都被重用。

  “singletask” 如果在栈顶,则接受intent,否则,该intent会被丢弃,但是该task仍会回到前台。 当已经存在的activity实例处理新的intent时候,会调用onnewintent()方法,如果收到intent生成一个activity实例,那么用户可以通过back键回到上一个状态;如果是已经存在的一个activity来处理这个intent的话,用户不能通过按back键返回到这之前的状态。

上一篇:

下一篇: