有一个程序。程序启动时,其默认顺序是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这个问题搞得很头大。由于极偶尔才出现,调试已经花了很长时间了。求各位大虾帮忙。

解决方案 »

  1.   

    你看看你的startActivity放在哪个地方了哦...最好放在点击事件里头,因为生命周期——————
      

  2.   

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

  3.   


    我是在onResume中启动的一个thread,处理一些事情后,再由Handler.sendMessage来发送一个消息,然后在handleMessage函数中,执行startActivity。
    因为是一个启动画面,所以不会有点击事件,事情处理完之后,就自动跳入了主画面了。
      

  4.   


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

  5.   

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

  6.   

    对的,我是finish掉了。不过我的程序并没有崩溃。理论上说程序启动时,每次都会调用第一个画面。难道长时间不使用,系统会认为程序崩溃?
    我试着看看两种情况:一种是打开程序,按home键返回桌面,再等上一天后启动程序,会不会崩溃。一种是返回键退出程序,等上一天后再启动程序。
      

  7.   

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

  8.   


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

  9.   

    在第一个界面初始化变量是放哪,是onCreate()吗?
      

  10.   


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

  11.   

    偶尔现象可能是一些细节问题,建议你在出现问题的下一次debug或者打印信息,可能问题就出来了
      

  12.   

    打印出来的信息都在上面的,就是出问题那一次和下一次。
    至于debug,不可能啊,在真机上,模拟器上不会出问题的。
      

  13.   

    如果真机上有问题的话可以考虑换一个其他厂家的机器试试,也许是真机OS的bug, 用排除法筛一下原因
      

  14.   

    我通过按home键来切换程序,而不是返回键来退出程序,发现长时间后(8个小时以上),重现BUG率非常高。
    目前应该可以确认没有重新启动,而且系统的一些静态变量都已经被释放了,所以拿到很多NULL。
    目前看来只能在程序中判断程序中静态变量变成NULL后,再重新进行一次初始化动作了。不过这样基本上对这些变量进行使用时,都要进行一次判断。不知道各位有好的解决办法吗?