2017-04-24 11 views
3

問題が発生しました理由を把握できないようです。スプラッシュ画面でホームボタンを押して数秒後にAndroidアプリが開きます

アプリを起動すると、最初にスプラッシュ画面が2.5秒間表示されてから、新しいアクティビティが終了して開始されます。この時間中にホームボタンまたは戻るボタンを押すと、アプリは通常通り終了します。しかし、数秒後(2.5より長い)、アプリはスプラッシュスクリーンの後に来るアクティビティから開いて開始します。

これがなぜ起こるかについての助けに感謝します!ここで

は、スプラッシュスクリーンを実装したものです

`public class SplashScreenActivity extends AppCompatActivity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_splash_screen); 

    Thread myThread = new Thread(){ 
     @Override 
     public void run() { 
      try { 
       sleep(2500); 
       Intent intent = new Intent(getApplicationContext(),MainActivity.class); 
       startActivity(intent); 
       finish(); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    }; 
    myThread.start();` 

(しかし私は、私は別の実装を試みたとして、ここでは何がこの問題の原因とは考えていない)ここでマニフェスト

<?xml version="1.0" encoding="utf-8"?> 

です
<uses-permission android:name="android.permission.VIBRATE" /> 
<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:roundIcon="@mipmap/ic_launcher_round" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme"> 
    <activity 
     android:name=".activities.MainActivity" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme.NoActionBar" 
     android:launchMode = "singleInstance"> 
    </activity> 
    <activity android:name=".activities.SplashScreenActivity" 
     android:theme="@style/Theme.AppCompat.NoActionBar"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
    <receiver android:name=".alert.BroadCaster" > 
    </receiver> 
    <service android:name=".timer.TimerService" 
     android:process=":timerservice" /> 
</application> 

+0

http://stackoverflow.com/a/5486970/6017001 –

+0

良い質問、おめでとうございます。 – statosdotcom

答えて

2

これは新しいThreadを作成しているために起こります。このスレッドは、アプリケーションをバックグラウンドに置いた後もまだ有効です。 Handlerを使用してアプローチを変更することができます。スプラッシュ画面がバックグラウンドの場合、次のActivityが起動しないようにする必要がある場合は、遅延が開始する前に現在の時刻を保存する必要があります。

private static final long SPLASH_SCREEN_MS = 2500; 

private long mTimeBeforeDelay; 
private Handler mSplashHandler; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_splash_screen); 
    // Create a new Handler. 
    mSplashHandler = new Handler(); 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    // The first time mTimeBeforeDelay will be 0. 
    long gapTime = System.currentTimeMillis() - mTimeBeforeDelay; 
    if (gapTime > SPLASH_SCREEN_MS) { 
     gapTime = SPLASH_SCREEN_MS; 
    } 
    mSplashHandler.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      Intent intent = new Intent(SplashScreenActivity.this, MainActivity.class); 
      startActivity(intent); 
      SplashScreenActivity.this.finish(); 
     } 
    }, gapTime); 
    // Save the time before the delay. 
    mTimeBeforeDelay = System.currentTimeMillis(); 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    mSplashHandler.removeCallbacksAndMessages(null); 
} 
+2

これは完璧に動作します、ありがとう! – smuvv

2

ちょうどこの

のようなハンドラの代わりに、スレッドのスリープを使用
new Handler().postDelayed(new Runnable(){ 
      @Override 
      public void run() { 
       Intent intent = new Intent(SplashScreenActivity.this, MainActivity.class); 
       startActivity(intent); 
       SplashScreenActivity.this.finish(); 
      } 
     }, SPLASH_DURATION); 
+0

コメントありがとう!前にハンドラを使ってみましたが、問題は解決していません。 – smuvv

+0

これは動作しません。 – user3090370

0

あなたは、データとメモリを節約したい場合にのみ、onStop()メソッドを実装する必要があります。

関連する問題