当前位置:编程学习 > wap >>

Android程序启动时,系统自动忽略默认主画面,跳入第二个画面的奇怪状况

有一个程序。程序启动时,其默认顺序是LauncherActivity==>MainActivity.
在LaucherActivity处理完一些系统初始化工作后,再用startActivity来启动MainActivity.
这个流程在模拟器上是正常的。在Nexus One上,偶尔启动会不正常。
Nexus One上正常的LOG如下:
I/ActivityManager(   96): Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.zerosoft.FreeMoney/.Activity.LaunchActivity bnds=[245,392][355,510] } from pid 179
I/ActivityManager(   96): Start proc com.zerosoft.FreeMoney for activity com.zerosoft.FreeMoney/.Activity.LaunchActivity: pid=11495 uid=10083 gids={3003}
V/RenderScript_jni(  179): surfaceDestroyed
D/LaunchActivity(11495): onCreate
D/LaunchActivity(11495): onResume
D/LocalDatabase(11495): initialize
D/LaunchActivity(11495): lanchMainActivity
I/ActivityManager(   96): Starting: Intent { cmp=com.zerosoft.FreeMoney/.Activity.MainActivity } from pid 11495
D/MainActivity(11495): onCreate
D/MainActivity(11495): onResume

发生错误时的LOG如下:
I/ActivityManager(   96): Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.zerosoft.FreeMoney/.Activity.LaunchActivity bnds=[245,392][355,510] } from pid 179
I/ActivityManager(   96): Start proc com.zerosoft.FreeMoney for activity com.zerosoft.FreeMoney/.Activity.MainActivity: pid=11472 uid=10083 gids={3003}
D/MainActivity(11472): onCreate
D/MainActivity(11472): onResume

这个问题搞得很头大。由于极偶尔才出现,调试已经花了很长时间了。求各位大虾帮忙。 --------------------编程问答-------------------- LZ的意思就是该问题为偶现问题?
偶现问题确实很纠结,我一般碰到偶现问题直接忽略... --------------------编程问答-------------------- 你看看你的startActivity放在哪个地方了哦...最好放在点击事件里头,因为生命周期—————— --------------------编程问答-------------------- 有一种可能:假如你的startActivity是放在onResume()里,那么如果程序崩溃或者其他问题导致程序跳过onCreate(),直接执行onResume()方法的startActivity,那么由于当前的activity的存在时间太短暂了,所以会让你觉得好像忽略了这个activity --------------------编程问答--------------------
引用 1 楼 fff32165 的回复:
LZ的意思就是该问题为偶现问题?
偶现问题确实很纠结,我一般碰到偶现问题直接忽略...


不是偶现问题,是极偶现问题,一般不停启动,退出程序是不会出现这个问题的。停上几个小时不用这个程序,如一个晚上,出现的机率会高一些。 --------------------编程问答--------------------
引用 2 楼 zzl3015508 的回复:
你看看你的startActivity放在哪个地方了哦...最好放在点击事件里头,因为生命周期——————


我是在onResume中启动的一个thread,处理一些事情后,再由Handler.sendMessage来发送一个消息,然后在handleMessage函数中,执行startActivity。
因为是一个启动画面,所以不会有点击事件,事情处理完之后,就自动跳入了主画面了。 --------------------编程问答--------------------
引用 3 楼 ncuboy045wsq 的回复:
有一种可能:假如你的startActivity是放在onResume()里,那么如果程序崩溃或者其他问题导致程序跳过onCreate(),直接执行onResume()方法的startActivity,那么由于当前的activity的存在时间太短暂了,所以会让你觉得好像忽略了这个activity


我把log.d放在每个函数的开头,对于启动主画面的函数还有专门的打印"lanchMainActivity是放在",你可以在我贴出来的正常启动的log中,看到onCreate、onResume和lanchMainActivity都被打印出来了。
但在出错的情况下,可以看到Launcher画面所有的log都没有出来,也就是说一个函数都没有被调用,包括onCreate。系统就自动的启动了主画面,也就是程序的第二个画面了。 --------------------编程问答--------------------
引用 6 楼 netdigger_2000 的回复:
引用 3 楼 ncuboy045wsq 的回复:

有一种可能:假如你的startActivity是放在onResume()里,那么如果程序崩溃或者其他问题导致程序跳过onCreate(),直接执行onResume()方法的startActivity,那么由于当前的activity的存在时间太短暂了,所以会让你觉得好像忽略了这个activity


我把log.d放在每个函数的开头,对于……

你的第一个界面是不是在启动第二个界面的时候就finish掉了,我记得我在返回的onActivityResult方法中finish掉了activity,然后每次程序崩溃了都会恢复到第二个界面 --------------------编程问答--------------------
引用 7 楼 ncuboy045wsq 的回复:
你的第一个界面是不是在启动第二个界面的时候就finish掉了,我记得我在返回的onActivityResult方法中finish掉了activity,然后每次程序崩溃了都会恢复到第二个界面

对的,我是finish掉了。不过我的程序并没有崩溃。理论上说程序启动时,每次都会调用第一个画面。难道长时间不使用,系统会认为程序崩溃?
我试着看看两种情况:一种是打开程序,按home键返回桌面,再等上一天后启动程序,会不会崩溃。一种是返回键退出程序,等上一天后再启动程序。 --------------------编程问答-------------------- 偶尔可能是你的程序根本就没重新启动,不是重新启动,而你的第一个又被finish掉了,所以就理所当然从第二个启动了 --------------------编程问答--------------------
引用 9 楼 ncuboy045wsq 的回复:
偶尔可能是你的程序根本就没重新启动,不是重新启动,而你的第一个又被finish掉了,所以就理所当然从第二个启动了


如果不是重启动,那已经完成初始化的实例就不会变成null了吧?现在问题就是跳了第一个,所以第一个画面做的初始化动作没有进行,实例都是null. --------------------编程问答--------------------
引用 10 楼 netdigger_2000 的回复:
引用 9 楼 ncuboy045wsq 的回复:

偶尔可能是你的程序根本就没重新启动,不是重新启动,而你的第一个又被finish掉了,所以就理所当然从第二个启动了


如果不是重启动,那已经完成初始化的实例就不会变成null了吧?现在问题就是跳了第一个,所以第一个画面做的初始化动作没有进行,实例都是null.

在第一个界面初始化变量是放哪,是onCreate()吗? --------------------编程问答-------------------- 不是放在onCreate的。 --------------------编程问答--------------------
引用 12 楼 netdigger_2000 的回复:
不是放在onCreate的。

我也糊涂了,如果可以,贴出代码来 --------------------编程问答--------------------
引用 13 楼 ncuboy045wsq 的回复:
引用 12 楼 netdigger_2000 的回复:
不是放在onCreate的。

我也糊涂了,如果可以,贴出代码来


不用关心代码放哪里。因为LaucherActivity的所有函数都没有被调用。而我的困惑就在于为什么LauncherActivity不被调用? --------------------编程问答--------------------
引用 14 楼 netdigger_2000 的回复:
引用 13 楼 ncuboy045wsq 的回复:

引用 12 楼 netdigger_2000 的回复:
不是放在onCreate的。

我也糊涂了,如果可以,贴出代码来


不用关心代码放哪里。因为LaucherActivity的所有函数都没有被调用。而我的困惑就在于为什么LauncherActivity不被调用?

偶尔现象可能是一些细节问题,建议你在出现问题的下一次debug或者打印信息,可能问题就出来了 --------------------编程问答-------------------- 打印出来的信息都在上面的,就是出问题那一次和下一次。
至于debug,不可能啊,在真机上,模拟器上不会出问题的。
--------------------编程问答-------------------- 如果真机上有问题的话可以考虑换一个其他厂家的机器试试,也许是真机OS的bug, 用排除法筛一下原因 --------------------编程问答--------------------
引用 9 楼 ncuboy045wsq 的回复:
偶尔可能是你的程序根本就没重新启动,不是重新启动,而你的第一个又被finish掉了,所以就理所当然从第二个启动了


应该是这原因,楼主仔细查下 --------------------编程问答-------------------- 我通过按home键来切换程序,而不是返回键来退出程序,发现长时间后(8个小时以上),重现BUG率非常高。
目前应该可以确认没有重新启动,而且系统的一些静态变量都已经被释放了,所以拿到很多NULL。
目前看来只能在程序中判断程序中静态变量变成NULL后,再重新进行一次初始化动作了。不过这样基本上对这些变量进行使用时,都要进行一次判断。不知道各位有好的解决办法吗?
补充:移动开发 ,  Android
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,