Java 如何在一定程度的不活动后关闭窗口/活动
我正在为Android设计一款音乐播放器应用程序,它将具有弹出控件。我目前正试图让这些控件在一段时间的不活动后关闭,但似乎没有一个明确的方法来实现这一点。到目前为止,我已经设法利用本网站和其他网站的一些建议拼凑出以下解决方案Java 如何在一定程度的不活动后关闭窗口/活动,java,android,Java,Android,我正在为Android设计一款音乐播放器应用程序,它将具有弹出控件。我目前正试图让这些控件在一段时间的不活动后关闭,但似乎没有一个明确的方法来实现这一点。到目前为止,我已经设法利用本网站和其他网站的一些建议拼凑出以下解决方案 private Timer originalTimer = new Timer(); @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceSt
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.如果有任何更多的信息我需要提供,请询问并感谢任何帮助…你们这些家伙太棒了 根据@commonware的建议,切换到处理程序。工作完美。非常感谢
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);
}
};
要完成上面的回答,请注意,只有当您关心单击时,Activity.onUserInteraction()才足够 文档中的状态为:“请注意,此回调将为开始触摸手势的触摸操作调用,但可能不会为随后的触摸移动和触摸操作调用。”
实际的实现证明,它确实忽略了平板电脑上的所有动作,这意味着时钟永远不会在不松开手指的情况下重置。另一方面,这也意味着时钟不会太频繁地重置,这限制了开销。使用Eclipse中的
adb logcat
、DDMS或DDMS透视图来检查logcat并查看与“强制关闭”相关联的堆栈跟踪。而不是定时器
和定时器任务
,我建议使用处理程序
和postDelayed()
来计划在延迟期后调用Runnable
。如果存在用户交互,则可以使用removeCallbacks()
取消计划Runnable
,并使用postDelayed()
再次计划。优点是,这将使您可以控制主应用程序线程,而TimerTask
位于后台线程,这可能是崩溃的原因。仍在使用此功能…以前从未使用过logcat…给我以下输出:E/AndroidRuntime(3835):致命异常:main E/AndroidRuntime(3835):java.lang.IllegalStateException:计时器被取消E/AndroidRuntime(3835):在java.util.Timer.scheduleImpl(Timer.java:566)E/AndroidRuntime(3835):在java.util.Timer.schedule(Timer.java:463)E/AndroidRuntime(3835):在org.stephenfin.zoomplayer.PlayerControls.onUs eInteraction(PlayerControls.java:69)那么,PlayerControls
类的第69行是什么?是timer cancel()调用。不知道为什么,但它对被取消感到不高兴。不过,处理程序工作正常,显然是一个更好的解决方案