Android Tasks and Back Stack (一)
2011-06-21 16:32
246 查看
前几天遇到LogOut一次性不成功的问题!最后发现问题在!从第二个activity回到前面的activity时,使用了 StartActivity(new Intent(...)),这种方式默认是新创建已Activity实例,加入到栈顶,就会导致 有重复的activty,所以要退两次 才能成功。比如我一个应用程序myApp,4个activity: LoginActivitty(登录界面),HomeActivity(主界面),NoticeListActivity(公告列表界面),NoticeDetailActivity(公告详情界面),流程如下
在login界面登录时使用:
startActivity(new Intent(LoginActivity.this, HomeActivity.class));
Task stack:
| |
|LoginActivity |
-------------------
在Home界面进公告列表示时使用:
startActivity(new Intent(HomeActivity.this, NoticeListActivity.class));
Task stack:
|HomeActivity |
|LoginActivity |
-------------------
在列表界面进详情时使用:
startActivity(new Intent(NoticeListActivity.this, NoticeDetailActivity.class));
Task stack:
|NoticeListActivity |
|HomeActivity |
|LoginActivity |
------------------------
在列表详情时:
startActivity(new Intent(NoticeListActivity.this, NoticeDetailActivity.class));
Task stack:
|NoticeDetailActivity |
|NoticeListActivity |
|HomeActivity |
|LoginActivity |
------------------------
而这时如果我想当用户点击HomeButton(自定义) 按钮时要回到HomeActivity, 如果还是用:startActivity(new Intent(NoticeDetailActivity.this, HomeActivity.class));大家都知道出现如下效果,即两个
HomeActivity,在堆栈中:
|HomeActivity |
|NoticeDetailActivity |
|NoticeListActivity |
|HomeActivity |
|LoginActivity |
------------------------
这个时候用户单击系统自带Back按钮时 就会出现两次HomeActivity,虽然按正常来说是没什么的,因为我只是想返回到上一个点击的界面。但是有的时候是 当我在HomeActivity中时,点击back 按钮必须跳转到Login界面(即logOut).那么就有问题了!当然你也可以再启动LoignActivity,并且清空当前Task 堆栈。
但是我想说的 有简单的方式,
<!-- 主界面 -->
<activity android:name=".activity.HomeActivity"
android:windowSoftInputMode="adjustPan" android:screenOrientation="portrait"
android:launchMode="singleTask"
>
使用android:launchMode="singleTask",即启动模式使用“singleTask”,即同时只有一个实例存在于手机中,当这个实例已经存在了,就不会新创建实例,而调用该实例的 onNewIntent(),并显示,并且会清空他上面的历史堆栈记录,
如当用户点击HomeButton(自定义) 按钮时要回到HomeActivity, 还是用:startActivity(new Intent(NoticeDetailActivity.this, HomeActivity.class));但是这时我们设置了android:launchMode="singleTask" 在manifest.xml中,
那么这个时候Task堆栈就变成了
|HomeActivity |
|LoginActivity |
------------------------
而不是
|HomeActivity |
|NoticeDetailActivity |
|NoticeListActivity |
|HomeActivity |
|LoginActivity |
------------------------ 这个时候你在HomeActivity 中点击系统的back 键时就能保证,每次都会到loginActivity。
我今天测试发现一个问题,android:launchMode="singleTask"并不是新创建一个新Task ,而还是加入到原来的Task 堆栈中,但是android:launchMode="singleInstance"会创建一个新Task ,里面有且只有该activity.
在login界面登录时使用:
startActivity(new Intent(LoginActivity.this, HomeActivity.class));
Task stack:
| |
|LoginActivity |
-------------------
在Home界面进公告列表示时使用:
startActivity(new Intent(HomeActivity.this, NoticeListActivity.class));
Task stack:
|HomeActivity |
|LoginActivity |
-------------------
在列表界面进详情时使用:
startActivity(new Intent(NoticeListActivity.this, NoticeDetailActivity.class));
Task stack:
|NoticeListActivity |
|HomeActivity |
|LoginActivity |
------------------------
在列表详情时:
startActivity(new Intent(NoticeListActivity.this, NoticeDetailActivity.class));
Task stack:
|NoticeDetailActivity |
|NoticeListActivity |
|HomeActivity |
|LoginActivity |
------------------------
而这时如果我想当用户点击HomeButton(自定义) 按钮时要回到HomeActivity, 如果还是用:startActivity(new Intent(NoticeDetailActivity.this, HomeActivity.class));大家都知道出现如下效果,即两个
HomeActivity,在堆栈中:
|HomeActivity |
|NoticeDetailActivity |
|NoticeListActivity |
|HomeActivity |
|LoginActivity |
------------------------
这个时候用户单击系统自带Back按钮时 就会出现两次HomeActivity,虽然按正常来说是没什么的,因为我只是想返回到上一个点击的界面。但是有的时候是 当我在HomeActivity中时,点击back 按钮必须跳转到Login界面(即logOut).那么就有问题了!当然你也可以再启动LoignActivity,并且清空当前Task 堆栈。
但是我想说的 有简单的方式,
<!-- 主界面 -->
<activity android:name=".activity.HomeActivity"
android:windowSoftInputMode="adjustPan" android:screenOrientation="portrait"
android:launchMode="singleTask"
>
使用android:launchMode="singleTask",即启动模式使用“singleTask”,即同时只有一个实例存在于手机中,当这个实例已经存在了,就不会新创建实例,而调用该实例的 onNewIntent(),并显示,并且会清空他上面的历史堆栈记录,
如当用户点击HomeButton(自定义) 按钮时要回到HomeActivity, 还是用:startActivity(new Intent(NoticeDetailActivity.this, HomeActivity.class));但是这时我们设置了android:launchMode="singleTask" 在manifest.xml中,
那么这个时候Task堆栈就变成了
|HomeActivity |
|LoginActivity |
------------------------
而不是
|HomeActivity |
|NoticeDetailActivity |
|NoticeListActivity |
|HomeActivity |
|LoginActivity |
------------------------ 这个时候你在HomeActivity 中点击系统的back 键时就能保证,每次都会到loginActivity。
我今天测试发现一个问题,android:launchMode="singleTask"并不是新创建一个新Task ,而还是加入到原来的Task 堆栈中,但是android:launchMode="singleInstance"会创建一个新Task ,里面有且只有该activity.
相关文章推荐
- Android Notes 05 - Tasks and Back Stack
- 【Android】任务和返回栈(tasks and back stack)
- Android官方开发指南-Tasks and Back Stack
- Android Dev Guide---Tasks and Back Stack(上)
- Android Tasks and Back Stack
- Android - 《Tasks and Back Stack》
- 【Android】任务和返回栈(tasks and back stack)
- Android Api Component---翻译任务和回退栈(Tasks and Back Stack)
- android 之 Tasks and Back Stack
- android的Tasks and Back Stack
- android Tasks and Back Stack
- Android Dev Guide---Tasks and Back Stack(下)
- Android任务与返回堆栈 (Tasks and Back Stack)
- Android-Tasks and Back Stack
- 【Android】任务和返回栈(tasks and back stack)
- Android官方文档之App Components(Tasks and Back Stack)
- Android 阅读Tasks and Back Stack文章后的重点摘抄
- android 任务和返回堆栈(Tasks and Back Stack)
- android之Activity的Tasks and Back Stack
- Android任务和返回栈(Tasks and Back Stack)