今天项目中遇到一个存在已久的问题,当app登录之后,按home回到桌面,然后再次点击APP图标,就需要重新登录.
目前已经解决,写这个用来备忘.
为了解决这个问题,第一个想法是禁用掉三大金刚键,但是找来找去,也就返回键可以拦截,home和任务键只有改底层才能彻底解决.
于是,再次看了一遍activity启动模式,决定从启动模式来解决这个BUG.
标准启动模式,即,standard
这是系统默认的启动模式,即:不用再在AndroidManifest.xml配置的android:launchMode。
作用:标准模式下,只要用intent 跳转,系统会自动创建一个新的activity实例,并且放在栈顶。按下回退键,系统会从顶部开始一个一个清除Activity。
singleTop
作用:singleTop模式下,如果要跳转的activity的实例已经在栈中存在,看其是否位于栈顶,如果位于栈顶,则直接启用旧的,不在创建实例,如果不在栈顶,则创建一个新的实例。
singleTask
作用:如果要启动的activity的实例不存在,则创建一个新的实例。如果要启动activity的实例在栈中已经存在,则清除此activty旧实例以上的所有activity,启动旧activity的实例并且至于栈顶,开始执行OnResum()方法。
singleInstance
作用:系统会重新启用一个栈,并且把这个activity放入新的栈中,并且保证不会再让其他的activity进入。再次跳转该activity,activity如果存在则直接启用,不存在创建新的。
注意:5.0以上的部分手机,一个应用存在多个栈的情况下,切到后台,后台会出现多个后台同一个应用的界面,这是因为界面不在同一个栈中。
single 是唯一的,仅仅只有一个的意思,task是伴随着AC生成的管理AC的对象,一个task可以管理多个AC,Instance是实例的意思,不过多解释.
标准模式对系统消耗太大,一半不考虑,但是这个BUG却可以在使用标准模式后解决.
所以,继续往下看,寻找有没有更好的办法.
singleTop,如果在任务的栈顶正好存在该Activity的实例, 就重用该实例,否者就会创建新的实例并放入栈顶(即使栈中已经存在该Activity实例,只要不在栈顶,都会创建实例)。
singleTask,此启动模式和singleTop在名字上即可看出区别,即singleTop每次只检测当前栈顶的Activity是否是我们需要请求创建的,而singleTask则会检测栈中全部的Activity对象,从上向下,如果检测到是我们所请求的则会消灭此Activity对象上面的对象,直接把检测到的我们需要的Activity置为栈顶。并不会重新创建AC,所以大多数时候用的都是这种启动模式.
但是我的APP中所有的AC用的也是这个啊,为什么还是不行,究其原因,入口,还是入口问题,如果入口AC设置的是singleTask,但是在创建过多个AC之后,如果入口AC被销毁了,巧妙设置Activity的启动模式才会节省系统开销和程序运行效率。
但是兼顾这个BUG ,我在此做出的操作是,把入口改为标准启动模式standard,其他AC设置为singleTask,这样会兼顾系统开销和程序运行效率.
网友评论