Как автоматически перезапустить активность после ее сбоя? - PullRequest
1 голос
/ 31 августа 2011

Могу ли я создать службу для отслеживания моего класса активности и перезапустить его после сбоя?Обратите внимание, что я не могу использовать метод потока 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 Ответ

3 голосов
/ 31 августа 2011

Вы можете сделать это, да, как описано ниже.Но если такие методы могут иметь смысл для экспериментов , то они определенно не подходят для производства .Это было бы ужасно уродливо и неэффективно.

Сказал, вот путь:

  • Сделайте свой Service липким или доставлено , чтобы гарантировать, что он всегда будет работать после того, как был запущен один раз и не был явно остановлен.

  • в вашем классе Activity, статически сохраняйте WeakReference s, указывающие навсе его запущенные экземпляры и предоставляют возможность статической проверки, выделен ли хотя бы один из них:

    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 являются ссылками на объекты, которые не предотвращают эти объектыдля сбора мусора, подробности здесь )

  • Затем из вашего Service время от времени звоните MyActivity.nbInstances().Он вернет 0 a (обычно короткий, но теоретически непредсказуемый) во время сбоя последнего запущенного экземпляра MyActivity. Предупреждение : это произойдет, если у вас не будет утечка памяти относительно этого Activity или лежащего в его основе Context, так как эта утечка предотвратит сборку мусора сбойного экземпляра.

  • Тогда вам просто нужно запустить новый экземпляр вашего Activity с вашего Service, используя startActivity(Intent)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...