如何在一定量的不活动后关闭窗口/活动

时间:2011-02-14 01:59:16

标签: java android

我正在为Android设计一款具有弹出控件功能的音乐播放器应用。我目前正试图在一段时间不活动后关闭这些控件,但似乎并没有一个明确记录的方法。到目前为止,我已经设法使用本网站和其他人的一些建议来拼凑以下解决方案。

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

}

应该关闭窗口的代码

//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();
    }
};

上面的代码对我来说非常有意义,但强制关闭任何用户交互。然而,如果我没有接触并且如果我删除了第二个时间表,则在交互之后不会关闭,所以这似乎是问题所在。另请注意,我想我会将此计时任务移动到另一个线程,以帮助保持UI的快节奏。我需要先让它工作:D。如果还有我需要提供的更多信息,请询问并感谢您的帮助......你们很棒!

2 个答案:

答案 0 :(得分:11)

基于@ CommonsWare的建议,切换到Handler。完美的工作。非常感谢!

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);

}

和其他方法......

//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);
    }
};

答案 1 :(得分:0)

要完成上述答案,请注意只有在关注点击时,Activity.onUserInteraction()才足够。

http://developer.android.com/reference/android/app/Activity.html#onUserInteraction%28%29处的文档说明:“请注意,此触控将针对触摸手势开始触摸操作调用,但触摸移动和触摸操作可能无法调用接下来。“

实际的实施证明它确实忽略了平板电脑上的所有动作,这意味着时钟永远不会被重置,例如,在不松开手指的情况下进行绘图。另一方面,它也意味着时钟不会经常复位,这限制了开销。