Як повністю перезапустити програму?

У мене є програма, яка запускає віддалену службу в її першій запущеній діяльності. Потім, в іншій діяльності, користувач може встановити конфігурацію програми. Зауважте, що ця друга діяльність не пов'язана з Службою, і я не хочу пов'язати це.

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

Наразі я використовую кнопку, яка на 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);
}

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

Будь-які ідеї?

6
Талановиті програмісти не будуть "перезапускати всю програму", наскільки така річ навіть можливо. Талановиті програмісти використовуватимуть шаблон спостерігача, щоб дозволити компонентам програми, які залежать від цієї "конфігурації", щоб дізнатися про зміни. Прикладом може бути використання SharedPreferences для зберігання "конфігурації", з іншими компонентами, що реєструють екземпляри OnSharedPreferenceChangedListener , щоб дізнатися про відповідні зміни.
додано Автор CommonsWare, джерело
На жаль, я не талановитий програміст, якщо я почав кодування в Android приблизно 4 місяці тому. Крім того, я не маю багато часу, щоб налаштувати поведінку програми. Нарешті, дозвольте мені просто поставити запитання: чи можна обробляти кілька файлів різного роду з SharedPreferences?
додано Автор WhiskThimble, джерело
@ dd619, я не погоджуюсь із використанням System.exit (0) в android. напишіть тут
додано Автор CRUSADER, джерело
Ой! .. моя помилка ..
додано Автор dd619, джерело
спробуйте System.exit (0) .
додано Автор dd619, джерело

6 Відповіді

You can use the Androids system AlarmManager like this:

Код для перезапуску додатка у вашій активності:

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

An example can be looked up 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());
9
додано
Android Studio не любить цю частину: getIntent (). GetFlags() Отже, що я повинен замінити?
додано Автор gonzobrains, джерело
getIntent (). getFlags() чудово працює в Android Studio для мене. Оскільки * getFlags() 'доступний з рівня API 1, не повинно бути жодних проблем із використанням його всередині, наприклад. Діяльність . Які повідомлення про помилку?
додано Автор alex, джерело
Я оновив свою відповідь.
додано Автор alex, джерело
На жаль, я не зробив приклад коду ясним, я виправив його. Моє приклад тепер ясно вам?
додано Автор alex, джерело
Я бачив цей блог, але в цьому прикладі незрозуміло: що таке ACTIVITY і RESTART_INTENT? Де я повинен їх оголосити, щоб отримати доступ до них іншою діяльністю?
додано Автор WhiskThimble, джерело
Я вже пробував це. Вона дійсно закриває додаток, але перезапускає її на активність, що вийшла з неї. І це не те, що я хотів би ...
додано Автор WhiskThimble, джерело
Ваш шлях - це кращий спосіб зробити. Дякую
додано Автор Huy Tower, джерело
Це не правильно взагалі. Використання AlarmManager для запланованого наміру початку програми обмежується багатьма виробниками, такими як Huawei. Вам краще зануритися за допомогою програми Context або скинути пакети.
додано Автор blueware, джерело
У мене виникла проблема з внесенням змін до вибраної теми за допомогою програмного забезпечення, яке не поширюється правильно через фрагменти після закінчення (); startActivity() і повністю перезавантаження, як це виправлена ​​проблема.
додано Автор steven smith, джерело

спробуйте цей код,

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
додано
@WhiskThimble тепер я оновлена ​​моя відповідь спробуйте це!
додано Автор Stack Overflow User, джерело
@ CRUSADER sauvegarde() - це метод, який перезаписує мій файл конфігурації (і кілька інших продуктів)
додано Автор WhiskThimble, джерело
@Stack Overflow User from documentation for Android: finish (): викликати це, коли ваша активність закінчена і повинна бути закрита. Таким чином, він закриває діяльність, але не програму
додано Автор WhiskThimble, джерело
Тепер це те ж саме, що і alex: це перезапускає активність, яка вийшла з програми
додано Автор WhiskThimble, джерело
будь ласка, надайте інформацію про sauvegarde ();
додано Автор CRUSADER, джерело

Рішення AlarmManager не може працювати, оскільки в програмі kill, усі очікувані наміри можуть бути вилучені. У андроїд-10 у мене є це питання.

Але я знайшов інший спосіб - створіть клас Instrumentation і зателефонуйте startInstrumentation в Context . Працював дуже приємно.

булевий android.content.Context.startInstrumentation (ім'я_компонентаName className,   Строкова профільФайла, аргументи Bundle)

     

Почніть виконувати клас android.app.Instrumentation. Даний   Контрольно-вимірювальний компонент буде працювати, вбиваючи його ціль   програма (якщо вона запущена), починаючи цільовий процес,   придумуючи компонент вимірювального приладу, а потім дозволяючи йому їхати   заявка.

     

Ця функція не синхронна - вона повертається, як тільки   приладобудування почалася і поки вона працює.

     

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

Instrumentation must be defined in manifest. Google how use it.

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
0
додано

в операції перезапуску додайте це

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

for each of your activity add getactivity(yourclassname) then finish activity. if you add all your activity like this your application close & restart

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, джерело
android_jobs_ua
android_jobs_ua
120 учасників

Публикуем вакансии и запросы на поиск работы по направлению Android. Здесь всё: full-time, part-time, remote и разовые подработки.

Mobile Dev Jobs UA
Mobile Dev Jobs UA
20 учасників

Публикуем вакансии и запросы на поиск работы по направлению iOS, Android, Xamarin, RN и т.д.