6

У меня есть приложение, которое запускает удаленную службу в своем первом запущенном действии. Затем в другом действии пользователь может установить конфигурацию приложения. Обратите внимание, что это второе действие не связано с Сервисом, и я не хочу его связывать.Как полностью перезапустить приложение?

Теперь мой вопрос: как я мог перезапустить все приложение из второго действия после изменения настроек конфигурации?

В настоящем время, я использую кнопку, которая onClickListener является:

public void onClick(DialogInterface dialog, int which) { 
    sauvegarde(); 
    Intent i = getBaseContext().getPackageManager().getLaunchIntentForPackage(getBaseContext().getPackageName()); 
    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    startActivity(i); 
} 

Проблемы в том, что только перезагружает текущую деятельность без отключения всего приложения, и, следовательно, без перезапуска службы

Есть идеи?

+0

попробовать 'System.exit (0)'. – dd619

+1

@ dd619, я не согласен с использованием 'System.exit (0)' in android .. [см. Здесь] (http://stackoverflow.com/a/16480930/2345913) – CRUSADER

+0

О! .. моя ошибка .. – dd619

ответ

0

попробуйте этот код,

public void onClick(DialogInterface dialog, int which) { 
    sauvegarde(); 
    restart(2); 
} 

метод перезапуска

public void restart(int delay) { 
    Intent launchIntent = new Intent(context, YourStartUpActivity.class); 
    PendingIntent intent = PendingIntent.getActivity(getApplicationContext(), 0, launchIntent , 0); 
    AlarmManager manager = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE); 
    manager.set(AlarmManager.RTC, System.currentTimeMillis() + delay, intent); 
    System.exit(2); 
} 
+0

, пожалуйста, дайте представление о 'sauvegarde();' – CRUSADER

+0

@CRUSADER sauvegarde() - это метод, который перезаписывает мой файл конфигурации (и еще несколько вещей) – WhiskThimble

+0

@Stack Overflow Пользователь из документации для Android: 'finish(): Позвонить, когда ваш активность завершена и должна быть закрыта. Таким образом, он закрывает активность, но не приложение – WhiskThimble

0

попробовать это

public void reload() { 
    Intent intent = getIntent(); 
    overridePendingTransition(0, 0); 
    intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); 
    finish(); 

    overridePendingTransition(0, 0); 
    startActivity(intent); 
    } 
+0

Это не сработало ... – WhiskThimble

9

Вы можете использовать систему андроиды AlarmManager так:

Код для Рез терпкий приложение в вашей деятельности:

AlarmManager mgr = (AlarmManager)getSystemService(Context.ALARM_SERVICE); 
mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 1000, PendingIntent.getActivity(this.getBaseContext(), 0, new Intent(getIntent()), getIntent().getFlags())); 
System.exit(2); 

Пример можно посмотреть на here

UPDATE

Как @CommonsWare указал, его плохой способ для разработки вашего приложения, когда у вас есть перезапустить его (плохая практика). Если вы действительно хотите сделать это, вы можете попробовать установить alarmmanager запустить приложение через секунду после того, как вы убили свой собственный процесс:

AlarmManager mgr = (AlarmManager)getSystemService(Context.ALARM_SERVICE); 
mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 1000, PendingIntent.getActivity(this.getBaseContext(), 0, new Intent(getIntent()), getIntent().getFlags())); 
android.os.Process.killProcess(android.os.Process.myPid()); 
+0

Я видел этот блог, но на этом примере не ясно: что такое ACTIVITY и RESTART_INTENT? Где я должен объявить их, чтобы другие действия могли получить к ним доступ? – WhiskThimble

+0

Извините, я не сделал пример кода достаточно ясным, я исправил его. Мой пример теперь вам понятен? – alex

+0

Я уже пробовал это. Он действительно закрывает приложение, но перезапускает его на активность, которая вышла из него. И это не то, что я хотел бы ... – WhiskThimble

0

в вашем рестарте деятельности добавить

restart.this.finish(); 
getActivity(otheractivity.class).finish(); 
Intent in = new Intent(this,main.class); 
startActivity(in); 

для каждого из ваша активность добавляет getactivity (yourclassname), а затем завершает активность. , если вы добавите все действия, подобные вашему приложению закрыть & restart

0

Решение AlarmManager не может работать, потому что при уничтожении приложения все отложенные намерения могут быть удалены. На андроиде-10 у меня есть эта проблема.

Но я нашел другой путь - создайте класс Instrumentation и позвоните по телефону startInstrumentation по телефону Context. Работала очень хорошо.

булево android.content.Context.startInstrumentation (ComponentName имя класса, Строка profileFile, Bundle аргументы)

Начало выполнения класс android.app.Instrumentation.Данный компонент Instrumentation будет запущен путем уничтожения его целевого приложения (если он запущен в данный момент), начиная с целевого процесса, , создавая экземпляр компонента инструментария, а затем позволяя ему управлять приложением.

Эта функция не является синхронной - она ​​возвращается, как только прибор запущен и во время работы.

Instrumentation обычно только разрешено работать с пакетом, который является либо знаком или без знака с подписью, что пакет инструментовки также подписанные с (обеспечения в цели трастов инструментовки).

Instrumentation должно быть определено в манифесте. Google, как использовать его.

0

Это новейший ответ с последним обновлением 2017 года протестирован и работает как шарм надеется, что помощь :)

 Intent i = getBaseContext(). 
       getPackageManager(). 
      getLaunchIntentForPackage(getBaseContext().getPackageName()); 
      i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);//clear the stack 
      i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
      finish();//don`t forget to finish before starting again 

         startActivity(i);//start the activity again