前言
最近项目集成微信登录中遇到一个问题:微信登录成功后,退出应用时,原有的普通登录页面还存在。
第一反应就是在跳转的时候怎么将其finish(),后来结合实际情况,好像并不方便。
于是想到:在跳转后续页面的时候,从LoginActivity中转一下,然后到达指定页面,这样就可以将LoginActivity关闭。
于是面临一个新问题,如何让LoginActivity只创建一次,于是我们想到了launchMode。
- 这里我们使用singleInstance,在AndroidManifest.xml文件中配置:
<activity
android:name=".LoginActivity"
android:launchMode="singleInstance" >
</activity>
- 我们还需要在LoginActivity重写onNewIntent(Intent intent)方法:
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
// 跳转首页或者其他操作
...
}
至于我们为什么不使用singleTask,因为在创建WXEntryActivity时创建了新的任务栈。singleTask在新的任务栈需要创建新的LoginActivity实例;而使用singleInstance,无论位于哪个Task中,系统都会把该LoginActivity所在的Task转到前台并显示LoginActivity。
Android四种启动模式
- standard:每次调用startActivity()启动时都会创建一个新的Activity放在栈顶(默认模式)
- singleTop:启动Activity时,指定Activity不在栈顶就创建,如在栈顶,则不再创建
注:不会出现两个相同的Activity相邻 - singleTask:如果启动的Activity不存在就创建Activity,如果存在直接跳转到指定的Activity所在位置
注:在其上面的Activity会被移出栈,也就是一个栈中不能有重复的Activity - singleInstance:如果启动的Activity不存在就创建一个Activity同时创建一个栈,如果存在就将指定的Activity存在的栈移动到栈顶
注:表示这个Activity只能存在于一个独立的任务栈中,同应用的其它Activity与其无关