Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to close a window/activity after a certain amount of inactivity

Tags:

java

android

I'm designing a music player app for Android that will feature pop-up controls. I'm currently trying to get these controls to close after a certain period of inactivity but there doesn't seem to be a clearly documented method of doing this. So far I have managed to cobble the following solution together using a few suggestions both from this site and others.

private Timer originalTimer = new Timer();

@Override
public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.playcontrols);

    View exitButton = findViewById(R.id.controls_exit_pane);
    exitButton.setOnClickListener(this);
    View volUpButton = findViewById(R.id.controls_vol_up);
    volUpButton.setOnClickListener(this);
    View playButton = findViewById(R.id.controls_play);
    playButton.setOnClickListener(this);
    View volDownButton = findViewById(R.id.controls_vol_down);
    volDownButton.setOnClickListener(this);

    musicPlayback();

    originalTimer.schedule(closeWindow, 5*1000);    //Closes activity after 10 seconds of inactivity

}

And the code that should close the window

//Closes activity after 10 seconds of inactivity
public void onUserInteraction(){
    closeWindow.cancel();   //not sure if this is required?
    originalTimer.cancel();
    originalTimer.schedule(closeWindow, 5*1000);
}

private TimerTask closeWindow = new TimerTask() {

    @Override
    public void run() {
        finish();
    }
};

The above code makes perfect sense to me but it force closes upon any user interaction. It does however close normally if untouched and won't close after interaction if I remove the second schedule, so this seems to be the problem. Also note that I imagine I will be moving this timing task to another thread to help keep the UI snappy. I need to get it working first though :D. If there's any more info I need to supply please ask and thanks for any help...Ye guys are brilliant!

like image 488
stephenfin Avatar asked Dec 22 '22 17:12

stephenfin


1 Answers

Based on @CommonsWare's suggestion, switched to a Handler. Works perfectly. Thanks very much!

private final int delayTime = 3000;
private Handler myHandler = new Handler();

@Override
public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.playcontrols);

    View exitButton = findViewById(R.id.controls_exit_pane);
    exitButton.setOnClickListener(this);
    View volUpButton = findViewById(R.id.controls_vol_up);
    volUpButton.setOnClickListener(this);
    View playButton = findViewById(R.id.controls_play);
    playButton.setOnClickListener(this);
    View volDownButton = findViewById(R.id.controls_vol_down);
    volDownButton.setOnClickListener(this);

    musicPlayback();

    myHandler.postDelayed(closeControls, delayTime);

}

and the other methods...

//Closes activity after 10 seconds of inactivity
public void onUserInteraction(){
    myHandler.removeCallbacks(closeControls);
    myHandler.postDelayed(closeControls, delayTime);
}

private Runnable closeControls = new Runnable() {
    public void run() {
        finish();
        overridePendingTransition(R.anim.fadein, R.anim.fadeout);
    }
};
like image 77
stephenfin Avatar answered Dec 24 '22 08:12

stephenfin