两个Activity之间重复相互跳转时遇到的坑

108人阅读 评论(0) 收藏 举报

最近在做的一个应用,主体为两个Activity,交互时需要来回在两个Activity之间跳转,首先Act A先启动,然后Act A启动Act B,之后Act B可以通过startActivity()(没有其他方法了吧?)再次回到Act A,同样在Act A也可以再次进入Act B;其中A、B我们只需要初始化一次,也就是onCreate()方法只执行一次,后续重复使用已存在的Act A,B实例。


  看似很简单的要求,我首先想到的就是两个Activity的launchMode都设置为singleTask。

  在singleTask模式下, Task栈中将只会存在一个该Activity的实例。而在standard模式下,重复使用Intent启动Activity将新建新的Activity实例,也就是onCreate()将得到执行,此时Task中将存在多个相同的Activity实例,明显不满足要求,使用singleTask模式貌似能避免这个问题。

  使用singleTask后重复实例的问题是解决了,Task栈中确实只同时存在一个Act A和Act B实例,但通过调试发现,当下面跳转表示启动)

  Act A→ Act B → Act A

跳转后,Act BonDestroy()方法被调用,也就是Act B被销毁了,在

  Act A→ Act B → Act A → Act B

时,第二次启动Act B时onCreate()被调用,此时Act B非彼Act B,是一个全新的实例。


  仔细查看相关资料后发现,在一个Task中,Activity实例以栈的形式存储,栈这种数据结构的特点是先进后出。通常一个Application有一个默认Task,在Activity的launchMode都为singleTask时,第一次Act A → Act B后,

Act B在栈顶,Act A在栈底;Act A→ Act B → Act A时,由于Act A实例已经存在,不必新建只需调到栈顶,重点来了,此时Act A之上的Activity实例都会被移除,直到Act A处于栈顶。到我们再次启动Act B,由于栈内已经没有Act B的实例,将会重新新建一个Act B的实例压入栈顶。

  问题的原因知道了,那怎么解决呢 既然Act AB处于同一个栈层叠时会发生移除栈顶的问题,那能不能分别为AB指定在不同的Task栈呢?这样明显也是可行的,这种情况下,Act AB分别处于不同的栈,每一个栈都最多只存在一个实例。但后来发现用这种方法明显大材小用了。我当时是这样做的:

  AndroidManifest.xml中为Activity B指定android:taskAffinity="daily.task.test"

然后在Activity A启动Activity BIntent添加Flag:

     Intent.FLAG_ACTIVITY_NEW_TASK
此时存在两个Task,两个Activity都启动后,直观感受就是一个应用在后台卡片列表中存在两个卡片。像这样:

后来又仔细看了许多资料介绍,在这篇博客(感觉大神们的收集和整理)
http://blog.csdn.net/lizhiguo0532/article/details/7480993
中注意到这个Flag:
    Intent.FLAG_ACTIVITY_REORDER_TO_FRONT
表示“如果这个activity已经启动了,就不产生新的activity,而只是把这个activity实例加到栈顶“。这正是我们需要的
 
索性删除taskAffinity,LaunchMode都改为改为standard,启动时的Intent都添加上Flag:
Intent.FLAG_ACTIVITY_REORDER_TO_FRONT
问题完美解决

查看评论

杂记之activity之间的跳转

代码结构图 manifest.xml
  • chenzheng_java
  • chenzheng_java
  • 2011-03-07 23:31:00
  • 11437

两个Activity之间跳转时,生命周期的执行顺序

一,当由Activity A跳转到Activity B时的执行顺序 A的onPause() > B的onCreate() > B的onStart() > B的onResume() > A的onSto...
  • yinzhijiezhan
  • yinzhijiezhan
  • 2015-08-19 10:25:39
  • 3598

Android:同一App不同Activity间跳转踩过的坑

Android:同一个app,不同activity间跳转,从第一个activity正常跳转(startActivity)到第二个activity,第一个activity就被onDestroy了,这是为...
  • weiren1101
  • weiren1101
  • 2017-01-10 18:17:54
  • 457

两个 Activity 之间跳转时必然会执行的是哪几个方法

onCrante() //在 Activity 生命周期开始时调用  onRestoreInstanceState()//用来恢复 UI 状态 onReStart()//当 Activity 重新...
  • d0099
  • d0099
  • 2016-07-08 12:03:56
  • 2236

android之两个activity相互跳转

android跳转大概有两种方法!! 但是一般都用intent进行跳转。另一种是改变activity的布局     setContentView(R.layout.main); 也就是改变main...
  • crazy1235
  • crazy1235
  • 2012-02-15 20:07:46
  • 4160

两个Activity之间跳转时必然会执行的是哪几个方法?

这是一道面试题,答案如下: 一般情况下比如说有两个activity,分别叫A,B。 当在A 里面激活B 组件的时候, A会调用onPause()方法,然后B调用onCreate() ,o...
  • m_xiaoer
  • m_xiaoer
  • 2017-06-06 15:33:59
  • 1596

两个Activity跳转时 生命周期函数的变化

Activity 的生命周期:生命周期函数调用时机 onCreate 在Activity对象被第一次创建时调用 onStart当Activity 变得可见是调用该函数 onResume当Activit...
  • cs__song
  • cs__song
  • 2015-08-31 23:16:17
  • 1443

两个activity之间跳转会执行那几个方法

首先我们要知道activity的生命周期有 onCreate onDestory onStart onStop onRestart onPause onResume 如果从a跳转到b界面 a 会调用o...
  • mp624183768
  • mp624183768
  • 2017-02-05 20:05:00
  • 1038

两个Activity之间跳转问题之activity的四种加载模式

activity的四种加载模式 在android的多activity开发中,activity之间的跳转可能需要有多种方式,有时是普通的生成一个新实例,有时希望跳转到原来某个activity实例,而不...
  • luohai859
  • luohai859
  • 2015-08-20 17:46:12
  • 949

Android-From-Screen-To-Screen-Acticity-Example.

  • 2012年04月18日 23:47
  • 15KB
  • 下载
    个人资料
    持之以恒
    等级:
    访问量: 7万+
    积分: 1706
    排名: 2万+
    最新评论