新活动有时无法启动

时间:2016-10-31 16:46:19

标签: android android-activity android-pendingintent

在某些情况下,我需要在我的应用程序中调用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}},但结果相同 - 新窗口出现有时。日志中没有任何内容,也不例外。

新活动只是一个静态文本。

1 个答案:

答案 0 :(得分:1)

这不可靠。如果导致VM关闭,则无法显示任何内容,因为不再运行VM。唯一可行的方法是确保BroadcastReceiverActivity在不同的操作系统进程中运行以显示您的消息。这也不是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();