Activity的生命周期

  • onCreate() :当Activity第一次创建时调用。该方法(如果有)会提供给你一个包含之前活动的冻结状态信息bundle包。

  • onStart():当Activity被展示在用户眼前时调用。如果活动出现在前台紧接着是onResume(),如果活动直接隐藏则紧接着是onStop()。

  • onResume():当Activity将开始与用户进行交互时调用。在这个时间点你的活动将会在活动堆栈的顶端,用户输入将会访问它。

  • onPause():当系统将要恢复一个之前的活动。这是一个有代表性的常常用于提交未被存储的改动信息为持久数据,停止动画和消耗CPU的东西等。实现该方法必须要特别的迅速,因为在此方法返回之前,下一个活动将不会恢复。如果活动将返回到前台则接下来调用onResume(),如果要隐藏到用户看不见的地方时,则调用onStop()。

  • onStop():当另一个活动被恢复且完全覆盖该活动,而该Activity将不在展示给用户时调用。这种情况将发生在一个新的活动将被开始,一个退出的活动将被恢复,又或者该活动将要被销毁。如果该活动将恢复与用户交互则调用onRestart(),如果该活动将被销毁则调用onDestory()。

  • onDestory():Activity被销毁钱最后一个被调用的方法。这个方法将会发生因为活动将会结束(在活动中调用finish()方法,或者系统临时销毁该实例节约空间。你可以使用isFinishing()方法区别这两种场景)。

Activity启动方式

Standard 标准模式

  • 这是Android的默认启动方式,即不在AndroidManifest.xml里面设置launchMode,默认为这个模式。每次启动一个A Activity都会创建一个A Activity的实例入栈,无论A Activity是否存在
  • 生命周期:onCreate—>onStart—>onResume

SingleTop栈顶复用模式

  • 此模式分为2中情况
    • 如果需要创建的Activity已经位于栈顶,此时直接复用该栈顶Activity,不再创建新的Activity
    • 如果要创建的Activity不处于栈顶,此时才会创建一个新的Activity入栈,同Standard一样
  • 生命周期:onPause—>onNewIntent—>onResume;第二种情况同Standard模式。

SingleTask栈内复用模式

  • 如果创建的A Activity已经处于栈中,此时不会创建新的Activity,而是会将A Activity上面的其他Activity摧毁,使得A成为栈顶
  • 生命周期:onPause—>onNewIntent—>onRestart—>onStart—>onResume

SingleInstance全局单例模式

  • 加强版的SingleTask模式。具有所有SingleTask的特性,除此之外,改模式的Activity仅仅能单独位于一个任务栈中(次栈),在连续按下back键时,只有主栈中的Activity全部都移除栈外后, 才会轮到次栈

常见的启动Activity的FLAG

  • FLAG_ACTIVITY_NEW_TASK:设置此状态,记住以下原则,首先会查找是否存在和被启动的Activity具有相同的亲和性的任务栈(即taskAffinity,注意同一个应用程序中的activity的亲和性一样,所以下面的a情况会在同一个栈中),如果有,刚直接把这个栈整体移动到前台,同时这个Activity将显示在这个Task的顶端,如果没有,则新建一个栈来存放被启动的activity
  • FLAG_ACTIVITY_CLEAR_TOP:将栈中所启动activity之上的所有activity清除,通过此flag启动时还是按照默认在本栈上启动,清除上面的activity,但是即使所启动的activity已存在,仍会销毁重新创建,如果结合SingleTop的flag则不会重新创建
  • FLAG_ACTIVITY_CLEAR_TASK:必须配合new task使用,表示新启动的activity作为新栈的根activity
  • FLAG_ACTIVITY_BROUGHT_TO_FRONT:如果activity在task存在并且是用FLAG_ACTIVITY_BROUGHT_TO_FRONT启动的,拿到最顶端,不会启动新的Activity
  • FLAG_ACTIVITY_MULTIPLE_TASK:与FLAG_ACTIVITY_NEW_TASK结合使用, 首先在Intent中设置FLAG_ACTIVITY_NEW_TASK, 打开Activity,则启动一个新Task, 接着在Intent中设置FLAG_ACTIVITY_MULTIPLE_TASK, 再次打开同一个Activity,则还会新启动一个Task
  • FLAG_ACTIVITY_SINGLE_TOP:同SingleTop效果
  • FLAG_ACTIVITY_RESET_TASK_IF_NEEDED:一般与FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET结合使用,如果设置该属性,这个activity将在一个新的task中启动或者或者被带到一个已经存在的task的顶部,这时这个activity将会作为这个task的首个页面加载。将会导致与这个应用具有相同亲和力的task处于一个合适的状态(移动activity到这个task或者从中移出),或者简单的重置这个task到它的初始状态
  • FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET:在当前的Task堆栈中设置一个还原点,当带有FLAG_ACTIVITY_RESET_TASK_IF_NEEDED的Intent请求启动这个堆栈时(典型的例子是用户从桌面再次启动这个应用),还原点之上包括这个应用将会被清除。应用场景:在email程序中预览图片时,会启动图片观览的actvity,当用户离开email处理其他事情,然后下次再次从home进入email时,我们呈现给用户的应该是上次email的会话,而不是图片观览,这样才不会给用户造成困惑。

Android属性

  • taskAffinity:taskAffinity是指Activity的归属,Activity与Task的吸附关系,也就是该Activity属于哪个Task。一般情况下在同一个应用中,启动的Activity都在同一个Task中,它们在该Task中度过自己的生命。每个Activity都有taskAffinity属性,这个属性指出了它希望进入的Task。如果一个Activity没有显式的指明taskAffinity,那么它的这个属性就等于Application指明的taskAffinity,如果Application也没有指明,那么该taskAffinity的值就等于应用的包名。我们可以通过在元素中增加taskAffinity属性来为某一个Activity指定单独的affinity。这个属性的值是一个字符串,可以指定为任意字符串,但是必须至少包含一个”.”,否则会报错
  • alwaysRetainTaskState属性:如果Task堆栈中的Root Activity设置了此属性值为true, 不管出现任何情况, 一直会保留Task栈中Activity的状态
  • clearTaskOnLaunch属性:如果Task堆栈中的Root Activity设置了此属性值为true, 只要你一离开这个Task栈, 则系统会马上清理除了Root Activity的全部Activity
  • finishOnTaskLaunch属性:如果某Activity设置了finishOnTaskLaunch属性, 只要你一离开这个Task栈, 则系统会马上清除这个Activity,不管这个Activity在堆栈的任何位置
posted on 2022-09-05 17:58  幺幺零零  阅读(206)  评论(0编辑  收藏  举报