当前位置: 移动技术网 > IT编程>移动开发>Android > 简单介绍Android开发中的Activity控件的基本概念

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

2019年07月24日  | 移动技术网IT编程  | 我要评论

邢台旅游局,戚黛黛,今日新闻

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

activity 生命周期图如下:

2015121152423025.png (538×668)

在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键返回到这之前的状态。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网