在某些情况下,我需要在我的应用程序中调用exit()
(我知道这不是最好的方法,但这不是问题)。此外,我想显示一个新的对话框,告知用户崩溃。
我创建了一个新的活动类,一个新的广播接收器,在清单中注册它们。接下来,我打电话给:
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);
问题是新窗口出现有时!首先,我认为System.exit(0);
在新活动有机会开始之前触发(因为异步调用,思想无法在文档中找到),所以我在Thread.sleep(1000)
和pendingIntent.send();
之间添加了System.exit(0);
{{1}},但结果相同 - 新窗口出现有时。日志中没有任何内容,也不例外。
新活动只是一个静态文本。
答案 0 :(得分:1)
这不可靠。如果导致VM关闭,则无法显示任何内容,因为不再运行VM。唯一可行的方法是确保BroadcastReceiver
和Activity
在不同的操作系统进程中运行以显示您的消息。这也不是100%可靠,因为根据异常的性质,您现有的VM可能无法启动其他组件,但它可能比您当前的实现更可靠。例如,如果您的应用因OutOfMemoryException
而崩溃,则可能无法执行任何有用的操作。
要确保组件在单独的进程中运行,请添加
android:process=":other"
指向这些组件的清单中的<activity>
和<receiver>
定义。
您还应该尝试将调用延迟到System.exit()
,以便让VM有机会实际启动对话框的启动。此外,您不需要使用PendingIntent
。尝试这样的事情:
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();