So schließen Sie ein Fenster/Aktivität nach einer gewissen Inaktivität
Ich bin der Gestaltung einer music player app für Android-mit pop-up-Kontrollen. Ich bin derzeit versuchen, um diese Steuerelemente zu schließen nach einer bestimmten Zeit der Inaktivität, aber es scheint nicht zu sein, eine klar dokumentierte Methode, dies zu tun. So weit ich habe es geschafft, cobble folgende Lösung zusammen mit ein paar Vorschläge, sowohl aus dieser Website und anderen.
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
}
Sowie der code, sollte das Fenster schließen
//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();
}
};
Dem obigen code macht das vollkommen Sinn für mich, aber es Kraft schließt auf jegliche Interaktion mit dem Benutzer. Es hat jedoch in der Nähe in der Regel, wenn unberührt und wird sich nicht schließen, nachdem die Interaktion, wenn ich entfernen Sie die zweite Liste, also das scheint das problem zu sein. Beachten Sie auch, dass ich mir vorstellen, werde ich in dieser timing-Aufgabe zu einem anderen thread zu helfen, halten Sie die Benutzeroberfläche bissig. Ich brauche, um es arbeiten jedoch zuerst :D. Wenn du noch mehr info, die ich brauche zu liefern bitte Fragen und danke für jede Hilfe...Ihr Jungs sind Brillant!
- Verwenden
adb logcat
, DDMS, oder die DDMS-Perspektive in Eclipse zu prüfen, LogCat und Blick auf die stack-trace in Verbindung mit Ihrem "force close". - Anstatt
Timer
undTimerTask
ich würde empfehlen, mit einemHandler
undpostDelayed()
zu planenRunnable
aufgerufen werden, nachdem Ihre Periode zu verzögern. Wenn es Interaktion mit dem Benutzer, können SieremoveCallbacks()
auf die Zeitplanung aufheben derRunnable
und verwendenpostDelayed()
um wieder einplanen. Der Vorteil ist, dass Sie die Kontrolle über die wichtigsten Anwendungs-thread, in der Erwägung, dassTimerTask
ist auf einem hintergrund-thread, und das ist wahrscheinlich die Ursache für deinen Absturz. - Noch immer verwenden, um diese...nie benutzt logcat vor...gib mir die folgende Ausgabe: E/AndroidRuntime( 3835): FATAL EXCEPTION: main-E/AndroidRuntime( 3835): java.lang.IllegalStateException: Timer wurde storniert E/AndroidRuntime( 3835): bei java.util.Timer.scheduleImpl(Timer).java:566) E/AndroidRuntime( 3835): bei java.util.Timer.Zeitplan(Timer).java:463) E/AndroidRuntime( 3835): bei org.stephenfin.zoomplayer.PlayerControls.Beweislast erInteraction(PlayerControls.java:69)
- Also...was ist auf der Linie 69 von Ihrem
PlayerControls
Klasse? - Es war der timer Abbrechen() rufen. Nicht sicher, warum, aber er war nicht glücklich darüber, abgesagt. Der handler wie erwartet funktioniert aber und ist scheinbar eine bessere Lösung
Du musst angemeldet sein, um einen Kommentar abzugeben.
Basierend auf @CommonsWare Vorschlag, wechselte zu einem Handler. Funktioniert perfekt. Dank sehr viel!
und die anderen Methoden...
Zur Vervollständigung der Antwort oben, beachten Sie, dass sich die Aktivität.onUserInteraction() ist ausreichend, wenn Sie sich über Klicks.
In der Dokumentation bei http://developer.android.com/reference/android/app/Activity.html#onUserInteraction%28%29 Staaten: "Beachten Sie, dass dieses callback wird aufgerufen, für die touch-down-Aktion, die beginnt, eine touch-Geste kann aber nicht aufgerufen werden, die für die touch-verschoben und touch-up-Aktionen, die Folgen."
Tatsächliche Umsetzung erwies es sich in der Tat ignoriert alle Bewegungen auf dem tablet, was bedeutet, die Uhr wird nie zurückgesetzt, während, sagen wir, ziehen ohne loslassen der finger. Auf der anderen Seite bedeutet es auch, dass die Uhr nicht zurücksetzen, zu oft, die Grenzen der overhead.