如何在崩溃后自动重新启动活动?
问题描述:
有没有办法让我创建一个服务来跟踪我的活动类,并在崩溃后重新启动它?请注意,我不能使用uncaughthandlers线程方法重新启动我的应用程序。我的应用程序应该会崩溃,不要担心该部分。我的应用程序是简单的东西,像这样如何在崩溃后自动重新启动活动?
private class AudioRenderer extends Activity {
private MediaPlayer AudioRenderer(String filePath) {
File location = new File(filePath);
Uri path = Uri.fromFile(location);
mp= MediaPlayer.create(this, path);
}
return mp
}
一旦崩溃,在后台监听服务会自动重新启动我的应用程序。有人知道这有可能吗?谢谢!
答
你可以这样做,是的,如下所述。但如果这样的技术可能对实验有意义,则它们是绝对不适合生产。这将是非常丑陋和无效的。
此说,这里是很长的路要走:
让您
Service
sticky或redelivered,以确保它总是会已启动一次,而不是后运行明确地停止。- 在
Activity
类,静态
WeakReference
指点下保存其所有正在运行的实例,并提供一种方式来静态地检查当前是否被分配它们中的至少一个:public class MyActivity extends Activity { private static ArrayList<WeakReference<MyActivity >> sMyInstances = new ArrayList<WeakReference<MyActivity >>(); public MyActivity() { sMyInstances.add(new WeakReference<MyActivity >(this)); } private static int nbInstances() { int ret = 0; final int size = sMyInstances.size(); for (int ctr = 0; ctr < size; ++ctr) { if (sMyInstances.get(ctr).get() != null) { ret++; } } return ret; } }
(WeakReference
是提及不妨碍这些物体被垃圾收集的物体,更多详情here)
然后,从您的
Service
,随时拨打MyActivity.nbInstances()
。在最后一次运行MyActivity
实例崩溃之后,它将返回0个(通常短但理论上不可预知)。 警告:它会这样做,除非您有memory leak关于此Activity
或其基础Context
,因为此泄漏将阻止垃圾收集的实例崩溃。然后你只需从你
Service
启动Activity
的新实例,使用startActivity(Intent)
谢谢,我一定会尝试了这一点!但既然你说这个方法会很丑并且效率不高,你知道一个更好的方法来重启我的应用程序,一旦它崩溃而不使用线程异常处理程序吗? – Sith
实际上,这个方法本身就是这样的:重启崩溃的东西而不是修复这个东西并不好,并且效率不高,因为用户看到崩溃消息,重启总是需要一些时间等。我的评论不是与该特定代码相关。 – Shlublu