如何在崩溃后自动重启活动?

时间:2011-08-31 08:59:00

标签: android service crash restart

有没有办法让我创建一个服务来跟踪我的活动类并在崩溃后重新启动它?请注意,我不能使用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


}

一旦崩溃,在后台收听的服务将自动重启我的应用。有人知道这是怎么回事吗?谢谢!

1 个答案:

答案 0 :(得分:3)

你可以这样做,是的,如下所述。但如果此类技术可能对实验有意义,则绝对不适合生产。那将是非常丑陋和低效的。

这就是说,这是一条路:

  • 设置Service stickyredelivered,确保它在启动一次后始终保持运行状态,而不是明确停止。

  • 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 a(通常很短但理论上不可预测)。 警告:除非您对此Activity或其基础Contextmemory leak,否则会这样做,因为此泄漏会阻止崩溃的实例的垃圾回收

  • 然后,您只需使用Activity

  • Service开始startActivity(Intent)的新实例