2016-10-31 5 views
1

Unter bestimmten Umständen muss ich exit() in meiner Anwendung aufrufen (ich weiß, es ist nicht der beste Weg, um zu beenden, aber das ist nicht die Frage). Außerdem möchte ich einen neuen Dialog anzeigen, der den Benutzer über den Absturz informiert.Neue Aktivität startet manchmal nicht

Ich erstellte eine neue Aktivitätsklasse, einen neuen Broadcast-Empfänger, registriert sie in Manifest. Als nächstes rufe ich:

Intent intent = new Intent(this, AppCloseReceiver.class); 
PendingIntent pendingIntent = PendingIntent.getBroadcast(this.getApplicationContext(), 0, intent, 0); 
try 
{ 
    pendingIntent.send(); 
} 
catch(Exception ex){} 

System.exit(0); 

Das Problem ist, dass neue Fenster manchmal erscheint! Zuerst dachte ich, dass System.exit(0); ausgelöst wird, bevor neue Aktivität eine Chance haben zu starten (wegen Async-Aufruf, Gedanke konnte dies in der Dokumentation nicht finden), so fügte ich Thread.sleep(1000) zwischen pendingIntent.send(); und System.exit(0);, aber das Ergebnis ist das gleiche - neues Fenster erscheint manchmal . Es gibt nichts in den Protokollen, keine Ausnahme.

Die neue Aktivität ist nur ein statischer Text.

+0

Dies ist absolut nicht zuverlässig. Durch den Aufruf von 'System.exit()' wird die VM im Grunde beendet. Sie können nicht garantieren, dass beim Herunterfahren der VM etwas passiert. Sie können sicherlich nicht erwarten, dass in der Benutzeroberfläche etwas angezeigt wird. Bitte erläutern Sie Ihren Anwendungsfall und vielleicht können wir Ihnen eine Alternative vorschlagen. –

+0

Mein Anwendungsfall ist es, unter bestimmten Bedingungen 'zu beenden 'und dem Benutzer mitzuteilen, warum die Anwendung gestoppt wurde. Als Alternative verwende ich eine Benachrichtigung, aber ich möchte mehr Persistenzlösung, die auf dem Bildschirm bleiben und warten soll, bis Benutzer sie manuell schließt. – nikitablack

Antwort

1

Dies ist nicht zuverlässig. Wenn Sie die VM herunterfahren, können Sie nichts anzeigen, da keine VM mehr ausgeführt wird. Der einzige zuverlässige Weg, dies zu tun, wäre sicherzustellen, dass die BroadcastReceiver und Activity in einem anderen Betriebssystemprozess ausgeführt werden, um Ihre Nachricht anzuzeigen. Dies ist auch nicht 100% zuverlässig, da Ihre vorhandene VM je nach Art der Ausnahme möglicherweise nicht in der Lage ist, die anderen Komponenten zu starten, aber wahrscheinlich zuverlässiger ist als Ihre aktuelle Implementierung. Wenn Ihre App beispielsweise aufgrund von OutOfMemoryException abstürzt, ist es wahrscheinlich nicht möglich, etwas Nützliches zu tun.

Um sicherzustellen, dass eine Komponente in einem separaten Prozess ausgeführt wird, fügen Sie

android:process=":other" 

die <activity> und <receiver> Definitionen im Manifest für diese Komponenten.

Sie sollten auch versuchen, den Anruf auf System.exit() zu verzögern, damit die VM den Start des Dialogfelds tatsächlich initiieren kann. Außerdem müssen Sie dafür keine PendingIntent verwenden. Versuchen Sie etwas wie folgt:

Intent intent = new Intent(this, AppCloseReceiver.class); 
sendBrodcast(intent); 
// Start separate Thread to terminate the process 
new Thread(new Runnable() { 
    @override 
    public void run() { 
     SystemClock.sleep(1000); // Sleep a bit to give the VM enough time to actually send the broadcast Intent 
     System.exit(0); 
    } 
}).start(); 
Verwandte Themen