安卓开发之解决android不同activity切换闪烁的问题
标签:
安卓相关it |
问题描述:项目需要,标题栏有四个菜单,每个菜单对应按钮事件转到一个相应的activity,所有的activity都有这四个菜单,由于activity是同级的,因此,在切换的时候,需要将当前的activity
结束掉(直接调用finish()方法,虽然sdk上面不推荐直接使用)。跳转的方法为startActivity(Intent
intent). 问题来了,当跳转到另一个activity时,屏幕会闪烁下。
解决思路:
1.思考。是否调用的跳转方法startActivity有问题。打开sdk文档,找到startActivity方法,看完描述,最终该方法还是调用的startActivityForResult方法,只不过requestCode默认小于0,然后翻看startActivityForResult方法介绍,有句话说了,要在onCreate方法里面调用startActivityForResult能避免闪烁(果然,闪烁问题他们自己也遇到过)。可是,我并不是在onCreate的时候进行跳转啊。预计使用startActivityForResult效果也是一样,实验结果确实,还存在闪烁问题。此路不通。
2.翻google。google上面就有一个说的,说是要让线程睡眠3秒钟,然后再跳转到另外一个activity。姑且一试,结果失败。怀疑是finish()方法有问题,把finish去掉,果然,不闪烁了。
3.怒了,到底这个跳转是个怎样的过程,不就是两个activity么。为什么加finish的时候会闪烁?activity的生命周期也就是这几部分,在第一个activity里面将几个方法onResume(),onPause(),onStart(),onRestart()全部重写一遍,加上日志功能,看看它跳转的时候是怎么个过程。
加载第一个activity,姑且为A,依次加载:onCreate(),onStart(),onResume(),如图1:
@Override
protected void onResume(){
super.onResume();
Log.i("tag", "onResume");
}
@Override
protected void onPause(){
super.onPause();
Log.i("tag", "onPause");
}
@Override
protected void onStart(){
super.onStart();
Log.i("tag","onStart");
}
@Override
protected void onRestart(){
super.onRestart();
Log.i("tag","onReStart");
}
@Override
protected void onDestroy(){
super.onDestroy();
Log.i("tag","onDestroy");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
try {
super.onCreate(savedInstanceState);
this.hashCode();
Log.i("tag", "onCreate");
....}
}
加载第一个activity,姑且为A,依次加载:onCreate(),onStart(),onResume(),如图1:
跳转到第二个activity,称为B,此时A加载onPause,如图2:
预计再跳转回A,直接调用onResume方法,可是,实际情况是从onCreate再掉了一遍,如图3(图时间跟前面两张有点不一样,因为程序两分钟没动,自动的onPause了,为了更好的说明,重新运行了下)
图3 加载A
问题来了:为何再次调用A,又是从onCreate开始的??难道说每次调用startActivity方法,都是新建一个activity?
再次翻看sdk文档,上述过程竟然和activity的生命周期有所区别,遇到问题时,一定不能想这不可能,任何现象的产生都是有原因的。activity的生命周期里面所说的onResume是在再次唤醒的时候会调用,再次调用的意思就是B自己finish,不直接跳转到A。由于B在栈顶,下面就是A,此时,Bfinish后,A自动的出来了。跟直接startActivity不一样。
3.再次深入思考。验证下每次调用startActivity方法是否新开的activity,onCreate方法中加入hashCode,验证通过,每次都是一个新的activity。
@Override
protected void onCreate(Bundle savedInstanceState) {
try {
super.onCreate(savedInstanceState);
this.hashCode();
Log.i("tag", "onCreate"+this.hashCode());
...
}
}
图4 加入HashCode
可以看出,每次都是新的activity,这样的话,跳转的时候finish方法必须要调用,否则,多跳转几次,每次新创建的activity会越来越多,资源没有释放,会引起问题。
4.必须要调用finish方法,而调用又会引起闪烁。finish的时候,同时在加载B,这时候可以看出问题就出在调用finish方法的时间上。考虑下,加载完B以后在调用finish方法,这时候想到了线程,A跳转的时候一定会调用onPause方法,在该方法里面另起一个线程,让它先睡个3秒再调A的finish方法。
结果,不会发生闪烁了。
@Override
protected void onPause(){
super.onPause();
Thread thread =new TestThread();
thread.start();
}
class TestThread extends Thread{
@Override
public void run(){
try {
Thread.currentThread().sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Log.i("tag", "onPause");
finish();
}
}
感谢上海青大实训引领我进入软件开发行业,深深记得教android开发环境搭建的时候自己还很菜,如今月薪早已高出绝大部分同龄人一大截,感谢他们科学的androi实训课程体系,希望上海青大实训能够解决更多和我一样的8090后们的就业问题。
前一篇:安卓开发之多余下载是多余的

加载中…