Как закрыть приложение в активности

Мое приложение начинается с заставки. Экран-заставка виден в течение 5 секунд, после чего начинается действие меню. Но когда на дисплее отображается заставка, и я нажимаю «Назад» или «Домой», приложение button переходит в фоновый режим, но через несколько секунд оно автоматически появляется на переднем плане с активностью меню. Я хочу, чтобы пользователь нажал кнопку «Домой» или «Назад» навсегда закрыть приложение. Вот что я пробовал до сих пор.

Активность экрана-заставки-

public class SplashScreen extends Activity 
{
    /** Called when the activity is first created. */
    TimerTask task;
    Intent objIntent, intent;

    @Override
    public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.splash);
       UtilClass.playing = true;
       objIntent = new Intent(SplashScreen.this, PlayAudio.class);
       startService(objIntent);
       new Handler().postDelayed(csRunnable2, 5000);  
       }

   Runnable csRunnable2=new Runnable() 
    {      
       @Override
       public void run() 
       {
            intent = new Intent(SplashScreen.this, MainActivity.class);
            startActivity(intent);
            finish();
       }
   };

   public void onBackPressed()  
    {    
        objIntent = new Intent(this, PlayAudio.class);
        stopService(objIntent);
        finish();
        return;  
    }  

   @Override
    protected void onPause() {
        super.onPause();
        objIntent = new Intent(this, PlayAudio.class);
        stopService(objIntent);
        finish();
    }
}

Вы можете видеть в onPause и onBackPressed, что я закрываю приложение. Но его запуск с активностью меню через несколько секунд.


person John R    schedule 28.01.2014    source источник
comment
Ваша проблема заключается в Handler().postDelayed(). Это будет выполнено через 5000 миллисекунд, даже если ваше приложение скрыто. Вы должны отменить обработчик. См. ответ на этот вопрос: stackoverflow.com/questions/4378533 /   -  person kasoban    schedule 28.01.2014
comment
Вы можете попробовать вызвать обработчик.удалитьCallbacks в вашем методе onStop   -  person suitianshi    schedule 28.01.2014
comment
Но в моем коде нет имени обработчика. Тогда как это сделать?   -  person John R    schedule 28.01.2014


Ответы (2)


то, что предлагает Сутианши,

    public class SplashScreen extends Activity
{
    /** Called when the activity is first created. */
    TimerTask task;
    Intent objIntent, intent;
    Handler handler;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.splash);
        UtilClass.playing = true;
        objIntent = new Intent(SplashScreen.this, PlayAudio.class);
        startService(objIntent);
        handler = new Handler();
        handler.postDelayed(csRunnable2, 5000);
    }

    Runnable csRunnable2 = new Runnable()
    {
        @Override
        public void run()
        {
            intent = new Intent(SplashScreen.this, MainActivity.class);
            startActivity(intent);
            finish();
        }
    };

    public void onBackPressed()
    {
        objIntent = new Intent(this, PlayAudio.class);
        stopService(objIntent);
        finish();
        return;
    }

    @Override
    protected void onPause() {
        super.onPause();
        objIntent = new Intent(this, PlayAudio.class);
        stopService(objIntent);
        finish();
    }

    @Override
    protected void onStop() {
        super.onStop();
        handler.removeCallbacks(csRunnable2);
    }
}
person Chris    schedule 28.01.2014

Как упомянул Крис, объявите свой HANDLER глобально как,

 Handler handler;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.splash);
    UtilClass.playing = true;
    objIntent = new Intent(SplashScreen.this, PlayAudio.class);
    startService(objIntent);
    handler = new Handler();
    handler.postDelayed(csRunnable2, 5000);
}

Здесь, в этой строке,

        handler.postDelayed(csRunnable2, 5000);

Вы вызываете свой «csRunnable2» через 5 секунд, поэтому он появится через 5 секунд, пока, если только,

=> Вы полностью уничтожаете свой экземпляр класса обработчика или,

=> Сделать все ссылки нулевыми.

Итак, когда вы когда-либо закрываете или приостанавливаете свою деятельность (как в onBackPressed(), onPause(), onStop(), onDestroy() и т. д.), обязательно вызовите:

 handler.removeCallbacksAndMessages(null);

прежде чем вы начнете следующее действие.

Это сделает null всех экземпляров Handler.

Например, в вашем коде вы можете позвонить,

     public void onBackPressed()
{
    handler.removeCallbacksAndMessages(null); 
    objIntent = new Intent(this, PlayAudio.class);
    stopService(objIntent);
    finish();
    return;
}

@Override
protected void onPause() {
    super.onPause();
    handler.removeCallbacksAndMessages(null);
    objIntent = new Intent(this, PlayAudio.class);
    stopService(objIntent);
    finish();
}
person sai    schedule 28.01.2014