2012-02-08 10 views
0

アンドロイド2.3.5携帯電話で正常に動作するように見えるが、アンドロイド3.0エミュレータでクラッシュするアプリがあります。私は、2つのデバイスの動作の違いを見つけようとするために、数多くのLogcatメッセージを追加しました。アンドロイド3.0の不要なonPauseを診断

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起動:奇妙な何かが起こるキーコード(簡体字)はここに私のスプラッシュ画面の活動です。私のsplashscreenクラスのonPauseメソッドは、新しいアクティビティを開始する前に発生するようにfinish()を呼び出すようになりました。

私はこれを修正するために何ができるでしょうか?

答えて

1

いつでも好きなときにonPause()/onResume()と呼ぶことができます。あなたがこれをやってしまうのを防ぐことはできないので、あなたはそれをそのように修正することはできません。

本当のアクティビティが表示されているときにランチャーアクティビティが消えてしまった場合は、startActivity(in); finish();を実行してランチャーを終了しても差し支えありません。次に、onPause()を完全に省略するだけです。

ちなみに、エンジンスレッド(finish()も)からstartActivity()を確実に呼び出すことはできません。Activity.runOnUiThread()をUIスレッドに委譲する必要があります。ここのクリーナーソリューションはおそらく次のようなことをするでしょう:

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

これはスレッドの問題を完全に回避します。

関連する問題