2012-02-08 21 views
0

我出現在Android 2.3.5的手機上正常工作的應用程序,但崩潰。我添加了大量的Logcat消息,試圖發現這兩種設備的行爲差異。關鍵代碼(簡體),其中一些奇怪的事情發生在我的閃屏活動在這裏:診斷在Android 3.0模擬器不需要的onPause在Android 3.0的

public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    this.setVolumeControlStream(AudioManager.STREAM_MUSIC); 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
      WindowManager.LayoutParams.FLAG_FULLSCREEN); 

    setContentView(R.layout.splash); 

    Thread timer; 
    timer = new Thread() 
    { 
     public void run() 
     { 
      try 
      { 
       sleep(2600); 
      } 
      catch (InterruptedException ex) 
      { 
       ex.printStackTrace(); 
      } 
      finally 
      { 
       Intent in; 
       in = new Intent("android.intent.action.TTMODESELECT"); 
       startActivity(in); 
      } 
     } 
    }; 
    timer.start(); 
} 
protected void onPause() 
{ 
    super.onPause(); 
    finish(); // kill the launcher - free its memory 
} 

運行2.3.5設備我看到它開始然後完成休眠(上)然後啓動android.intent。 action.TTMODESELECT,但在3.0我看到它開始睡眠 - 但它永遠不會結束,而不是我的SplashScreen類的的onPause方法被調用套管精加工()新的活動可以開始之前之前進行。

任何想法我能做些什麼來解決這個問題?

回答

1

允許onPause()/onResume()它喜歡的,恐怕隨時調用該系統的。你不能阻止它這樣做,所以你不能這樣修復它。

如果你想讓你的發射器活動在你的真實活動出現在其頂部時消失,那麼一旦你調用真正的活動器,就可以做startActivity(in); finish();關閉發射器。那麼你完全省略了onPause()。順便說一句,我敢肯定你不能從引擎線程(finish()也可以)可靠地調用startActivity() ---你需要將它委託給你的UI線程Activity.runOnUiThread()。這裏一個更清潔的解決方案可能是這樣做的:

Handler handler = new Handler(); 
handler.postDelayed(
    new Runnable() 
    { 
     @Override 
     public void run() 
     { 
      startActivity(...insert code here...); 
      finish(); 
     } 
    }, 
    2600 * 1000 /* ms */); 

這可以完全避免線程問題。

相關問題