2017-04-24 23 views
3

我有一個問題,我似乎無法找出原因。在啓動畫面按下主頁按鈕幾秒鐘後Android應用程序打開

當您啓動應用程序時,啓動屏幕首先顯示2.5秒,然後完成並開始新的活動。如果在此期間按Home或Back按鈕,應用程序將照常關閉。然而,幾秒鐘後(超過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()方法,只要你想保存數據和記憶。

相關問題