Activity的详细解析

来源:互联网 发布:中国网络歌手排行榜 编辑:程序博客网 时间:2024/06/05 04:05

1.activity的生命周期

         activity的生命周期共有七个方法:

         a.oncreate( ) 方法,activity第一次创建时调用的方法(只会调用一次),里面一般放方法,不写零散代码。

         b.onstart()当activity已经存在但不可见,要成为可见时调用此方法。如果是第一次生成activity时此方法调用后界面可见但没有焦点。

        c.onResume( ) 当activity已经存在但不可见,要成为可见且获得焦点时调用此方法。如果是第一次生成activity时此方法调用后界面可见有焦点。

        d.onPause( ) 调用此方法后界面可见,失去焦点

        e.onStop( ) 调用此方法后界面不可见,失去焦点 。

        f.onRestart()当直接按HOME键时,activity退出但不销毁。此时点击程序启动activity的方法顺序是:onrestart()--->onstart( )

--->onResume()

       g.onDestroy( )  当activity销毁时调用此方法,一般在这个方法里面写一些需要销毁的对象如:service ,broadcast,第三方地图等等。

      activity的生命周期图如下:

          

 2.activity的启动模式    

   给activity添加启动模式在manifest中相对应的activity标签中加入

  android:launchMode="" //添加想要的模式如果不写这句代码默认standard
  activity生成之后会保存在一个“栈”中,而“栈”是先进后出。

   1.standard:标准模式,每次启动都会生成一个activity对象,多次启动就会生成多个对象(如果没有finish,栈中就会有多个相同的activity)

   2.singleTop:栈顶模式。这个模式下,如果新的activity已经位于栈顶,那么这个Activity不会被重写创建,同时它的onNewIntent方法会被调用,通过此方法的参数我们可以去除当前请求的信息。如果栈顶不存在该Activity的实例,则情况与standard模式相同。需要注意的是这个Activity它的onCreate(),onStart()方法不会被调用,因为它并没有发生改变。

      singlTop:分为三种情况

        a.当前栈中已有该Activity的实例并且该实例位于栈顶时,不会新建实例,而是复用栈顶的实例,并且会将Intent对象传入,回调onNewIntent方法

        b.当前栈中已有该Activity的实例但是该实例不在栈顶时,其行为和standard启动模式一样,依然会创建一个新的实例

        c.当前栈中不存在该Activity的实例时,其行为同standard启动模式

       standard和singleTop启动模式都是在原任务栈中新建Activity实例,不会启动新的Task,即使你指定了taskAffinity属性。
那么什么是taskAffinity属性呢,可以简单的理解为任务相关性。

  • 这个参数标识了一个Activity所需任务栈的名字,默认情况下,所有Activity所需的任务栈的名字为应用的包名
  • 我们可以单独指定每一个Activity的taskAffinity属性覆盖默认值
  • 一个任务的affinity决定于这个任务的根activity(root activity)的taskAffinity
  • 在概念上,具有相同的affinity的activity(即设置了相同taskAffinity属性的activity)属于同一个任务
  • 为一个activity的taskAffinity设置一个空字符串,表明这个activity不属于任何task
       很重要的一点taskAffinity属性不对standard和singleTop模式有任何影响,即时你指定了该属性为其他不同的值,这两种启动模式下不会创建新的task(如果不指定即默认值,即包名)

   3.SingleTask: 单栈模式

           singleTask启动模式启动Activity时,首先会根据taskAffinity去寻找当前是否存在一个对应名字的任务栈

  • 如果不存在,则会创建一个新的Task,并创建新的Activity实例入栈到新创建的Task中去
  • 如果存在,则得到该任务栈,查找该任务栈中是否存在该Activity实例
                  如果存在实例,则将它上面的Activity实例都出栈,然后回调启动的Activity实例的onNewIntent方法
                  如果不存在该实例,则新建Activity,并入栈
    此外,我们可以将两个不同App中的Activity设置为相同的taskAffinity,这样虽然在不同的应用中,但是Activity会被分配到同一个Task中去
     4.singleInstance:全局唯一模式

       加载该Activity时如果没有实例化,他会创建新的Task后,实例化入栈,如果已经存在,直接调用 onNewIntent, 该Activity的Task中不允许启动其它的Activity,任何从该Activity启动的其他Activity都将被 放到其他task中,先检查是否有本应用的task,没有的话就创建。

    设置activity的启动模式除了在manifest中设置外,还可以在代码中设置Flag来设置activity的启动模式。

代码指定Flag(使用全部FLAG),使得Activity启动模式可变,而且最后一次指定的Flag就是该Activity在任务栈中最终启动模式。

  • Intent.FLAG_ACTIVITY_NEW_TASK
      注:Intent.FLAG_ACTIVITY_NEW_TASK单独使用并无任何效果,需要和taskAffinity一起配合着使用。

    • 当和taskAffinity一起配合着使用时:Intent.FLAG_ACTIVITY_NEW_TASK + android:taskAffinity 指定非程序包名的任务栈名,与清单文件里面指定 android:launchMode="singleInstance"效果一致 真心一致 
    • 这个Flag常用于在服务中启动Activity,因为服务没有Activity的任务栈,所以只能用一个新的任务栈来启动这个Activity创建实例。
  • Intent.FLAG_ACTIVITY_SINGLE_TOP
     与清单文件里面指定 android:launchMode="singleTop"效果一致。真心一致。
      可尝试作用采用FLAG_ACTIVITY_CLEAR_TOP退出整个程序(多activity)

  • Intent.FLAG_ACTIVITY_CLEAR_TOP
    Intent.FLAG_ACTIVITY_CLEAR_TOP与清单文件里面指定 android:launchMode="singleTask"效果类似,只是类似。因为当位于任务栈顶部的时候和android:launchMode="singleTask"产生很大的差别
    设置次标记位的Activity,当它启动的时候,同一个任务栈里面位于他上方的Activity会全部出栈,上方全部清掉。
    在一个打开时已经被标记为FLAG_ACTIVITY_CLEAR_TOP的界面(现正处于前台任务栈的栈顶),如果我们在此界面打开自己,并且一样标记为FLAG_ACTIVITY_CLEAR_TOP,那么这个时候会经历一次建新毁旧的过程,任务栈里面从结果的来说没什么变化,但是生命周期的着眼于过程的角度来却经历非常大的变化。

mark下,这个标记位通常是和FLAG_ACTIVITY_NEW_TASK配合着使用的。在这种情况下被启动的Activty如果已经存在,那么系统就会调用它的onNewIntent方法。如果被调用的Activity使用默认的standrad模式,那么它连同它之上的Activity都要出栈,系统会创建新的实例并入栈置为栈顶。还未尝试

  • Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS

      具有这个标记的Activity不会出现在Activity的历史列表中.他等同于在xml里面设定                                                                                       android:excludeFromRecents="true" 。

   3.Activity之间的跳转

         3.1 无返回结果的跳转:

            a.不带参数

              Intent intent = new Intent(context ,目标); startActivity(intent);

           b.带参数

               Intent intent = new Intent(context ,目标);

                intent.putExtra();

               startActivity(intent);

           c.带对象(两种)

              一种是Bundle.putSerializable(Key,Object);

             另一种是Bundle.putParcelable(Key, Object);

             当然这些Object是有一定的条件的,前者是实现了Serializable接口,而后者是实现了Parcelable接口

      3.2 有返回结果

        Intent intent = new Intent(context ,目标);

          startActivityForResult(参数);
0 0
原创粉丝点击