问题阐述:
当我们写一款App的时候,势必会有这种情况:用户已经进行了多级的操作,现返回栈中已存在多个activity,那么这个时候我们想回到最初的activity难道要一层层的返回吗,对用户来说 无疑是一个不好的操作体验,这个时候我们就想到了android的四大启动模式,四大模式的详情请自行查询学习,singleTask就是四大启动模式其中的一个,使用了singleTask模式的activity会在当前的返回栈中有且只有一个实例,当我们需要重新调用这个activity 的时候,并不是new 一个该activity,而是从返回栈中直接调用这个已存在的实例,并将之其上的所有activity清空,保持返回栈中有且仅有其一个activity实例。
那么,说了这么多,与本文有什么关系呢?
先来说一下 我的app需求:第一个activity为登录页,登录后保存用户数据,进入主页,除了修改密码和退出登录外其他操作都应当自动登录,实现用户点击app后 直接进入主页的效果
最初,笔者也是觉得singleTask模式非常的方便,并且没发现什么缺点。but 把apk打包给后端小哥测试的时候,他发现当用户点击home键返回系统桌面的时候,这个时候重新点击启动app会发现,并没有显示关闭之前的那个activity,而是进入了登录页面。这是,笔者第一个想到的是 会不会本地缓存的用户数据被清掉了,感觉去检查了一下,发现用户数据还在。
那是什么问题呢,之后又考虑到会不会是home键按下后,需要做一个home键的监听拦截,但是这样有些得不偿失,因为拦截下来还是得关掉所有的activity。
死来想去,想想数据也在,但是没有自动登录,会不会是查询本地用户缓存数据的方法没有执行到呢?一番排查,发现只有第一次进入app的时候这个验证本地数据的方法才被调用了,之后按下home键后再打开app并不会执行该方法,那么就能解释为什么 按下home键后在进入程序不会自动登录到主页,而是打开登录页了。
可是,为什么没有执行到呢?
解决方案:
想了一下,验证本地数据的方法我是在onCreate()方法中进行调用的,而singleTask启动模式,调用已存在的activity实例却是调用的onNewIntent()方法,那么相对应的在onCreate()中调用的验证本地用户缓存数据的方法势必要在onNewIntent()重新调用一下。果不其然,调整之后,问题解决了。(下面附上 自动登录方法 和onCreate()、onNewIntent()的方法体 )