2015-03-06 6 views
0

Вот как я убить приложение и запустить его сноваAndroid, как надежно перезапустить приложение

Intent mStartActivity = new Intent(this, InitialActivity.class); 
int mPendingIntentId = 123456; 
PendingIntent mPendingIntent = PendingIntent.getActivity(this, mPendingIntentId, mStartActivity, PendingIntent.FLAG_CANCEL_CURRENT); 
AlarmManager mgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 500, mPendingIntent); 
android.os.Process.killProcess(android.os.Process.myPid()); 

Некоторые устройства, по-видимому не в состоянии убить приложение, а затем запустить его в 500 милисекунд, и пользователь видит черный экран. Есть ли лучший, более надежный способ сделать это?

+0

Трудно сказать, если вы не объясните, что именно вы пытаетесь достичь. Зачем вам нужно убивать процесс? Если вы просто хотите воссоздать свою текущую «деятельность», не могли бы вы просто использовать 'recreate()'? –

+0

У меня такая же проблема, я также использую AlarmManager, но я думаю, что для получения данных из базы данных требуется время, потому что мое приложение работает так гладко, когда у меня мало элементов в списке, и требуется время, только когда элементы намного больше в списке, поэтому может быть проблемой при загрузке адаптера или извлечении элементов из db. – Apurva

+0

Очень надежным способом было бы «бросить новое RuntimeException (« Почему я делаю это с моими бедными пользователями? »);' Внутри метода, который предназначен для перезапуска вашего приложения. Сомневаюсь, что потребуется 500 мс, чтобы убить его, и по умолчанию снова перезапустите процесс. Не уверен, почему вы хотели бы это сделать. – kha

ответ

0

Я использую следующий код довольно надежно, и нет необходимости ждать 500мс, а также позволяет вызывать overridePendingTransition в случае, если вы хотите, чтобы некоторые конкретные анимации

public static void restart(Activity activity) { 
     Intent intent = new Intent(activity, <your main activity>.class); 
     intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
     intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); 
     intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); 
     activity.startActivity(intent); 
    } 
+0

Это не перезапуск приложения, хотя это вопрос. – kha

+0

ну, нет необходимости повторно запускать приложение. Этот код очищает навигационный стек и перезапускает «основное действие». – Budius

+0

Полностью согласен. Это признак очень плохого дизайна. Тебе никогда не нужно это делать. Увы, ОП задал вопрос о том, как перезапустить приложение, убив его и возродив процесс. – kha

0

Начать новую деятельность, позволяет называть его SuicideActivity ,

Внутри SuicideActivity просто вызовите System.exit().

JVM остановится, и система перезапустит ваше приложение, но в родительской активности. Внутри SuicideActivity вам, возможно, придется отложить самоубийство, как

onCreate(Bundle savedInstanceState) { 
    runOnUiThread(new Runnable() { public void run() { System.exit(0); }}); 
} 
+0

Почему внутри 'runOnUiThread'? – Blackbelt

+0

runOnUiThread() только для того, чтобы получить задержку вызова до * после завершения * onCreate(). Его, вероятно, не нужно –

+0

J. K. Вы попробовали это? –

Смежные вопросы