2011-08-31 112 views
1

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


} 

一旦崩溃,在后台监听服务会自动重新启动我的应用程序。有人知道这有可能吗?谢谢!

回答

3

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

此说,这里是很长的路要走:

  • 让您Servicestickyredelivered,以确保它总是会已启动一次,而不是后运行明确地停止。

  • 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)

+0

谢谢,我一定会尝试了这一点!但既然你说这个方法会很丑并且效率不高,你知道一个更好的方法来重启我的应用程序,一旦它崩溃而不使用线程异常处理程序吗? – Sith

+0

实际上,这个方法本身就是这样的:重启崩溃的东西而不是修复这个东西并不好,并且效率不高,因为用户看到崩溃消息,重启总是需要一些时间等。我的评论不是与该特定代码相关。 – Shlublu

相关问题