2011-08-29 126 views
3

有没有办法让我的程序我的应用程序在崩溃时自动重新启动?我的应用程序只是一个简单的媒体渲染应用程序,但它偶尔会崩溃(应该是)。这是可能吗?谢谢。我的代码看起来像这样以编程方式崩溃后重新启动应用程序 - Android

public void Play(){ if(mp != null) { 
      mp.reset(); 
      mp.release(); 
      mp = null; 
     } 
AudioRenderer mr = new AudioRenderer(); 
mp = mr.AudioRenderer(filePath); 
} 

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 
} 
+2

我真的好奇......为什么应用程序应该崩溃? – Tenfour04

+1

为什么不只是将'应该[try]'的代码包装在try/catch中并正确处理错误? – CrackerJack9

+0

@ CrackerJack9这是不高效的。在某些情况下,例如,nullpointerexc,现在有办法处理它。重新启动后,并不好。 – alicanbatur

回答

10

这会为你做这项工作。

How to start the automatically stopped android service?

我还是不明白为什么它应该崩溃。

您在上创建了未捕获的异常

private Thread.UncaughtExceptionHandler onRuntimeError= new Thread.UncaughtExceptionHandler() { 
     public void uncaughtException(Thread thread, Throwable ex) { 
      //Try starting the Activity again 
    }; 

的处理UPDATE创建,你注册一个处理程序未捕获的异常

@Override 
    protected void onCreate() { 
     super.onCreate(); 
     Thread.setDefaultUncaughtExceptionHandler(onRuntimeError); 
    } 
+0

谢谢!我相信这会派上用场 – Sith

+1

如果这项工作可以考虑标记为答案。 – Samuel

+1

这似乎是一种不可靠的方式来处理所有未被捕获的错误,并且对用户来说是一个令人困惑的体验,他们只会看到应用程序突然再次导航到顶级活动。您是否有条件不想重新开始该活动?你确定要重新启动所有未被捕获的错误吗?应用程序处于不一致状态吗?这对你的Activity堆栈有什么影响?你记录异常吗?同意CrackerJack9:你应该包装偶尔崩溃的特定代码,并记录下来。像这样的全球处理程序通常是一个糟糕的想法。 –

1

我可能会晚点了很多,但我找到了2合1解决方案来解决您的问题。

public void doRestart() { 
    Intent mStartActivity = new Intent(context, LoginActivity.class); 
    int mPendingIntentId = 123456; 
    PendingIntent mPendingIntent = PendingIntent.getActivity(context, mPendingIntentId, mStartActivity, PendingIntent.FLAG_CANCEL_CURRENT); 
    AlarmManager mgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
    mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 100, mPendingIntent); 
    System.exit(0); 
} 

private void appInitialization() { 
    defaultUEH = Thread.getDefaultUncaughtExceptionHandler(); 
    Thread.setDefaultUncaughtExceptionHandler(_unCaughtExceptionHandler); 
} 

//make crash report on ex.stackreport 
private Thread.UncaughtExceptionHandler defaultUEH; 
// handler listener 
private Thread.UncaughtExceptionHandler _unCaughtExceptionHandler = new Thread.UncaughtExceptionHandler() { 
    @Override 
    public void uncaughtException(Thread thread, Throwable ex) { 
     ex.printStackTrace(); 
     doRestart(); 
    } 
}; 



@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_index); 
    appInitialization(); 
相关问题