2017-04-24 8 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

그냥 당신이 데이터와 메모리를 절약하려는 경우에만 경우 onStop() 메소드를 구현하기 위해 필요한이

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

같은 핸들러 대신 스레드 잠을 사용합니다.