Как перезапустить приложение Android из приложения - PullRequest
7 голосов
/ 02 декабря 2010

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

Process.killProcess(Process.myPid());

, и это работает для меня, чтобы убить приложение.Но мне нужно перезапустить приложение.Средства убивают процесс и запускают новый процесс, поэтому приложение снова запускается заново.

Есть ли способ сделать это?

Заранее спасибо.

Ответы [ 7 ]

5 голосов
/ 03 декабря 2010

Это не то, что, вероятно, следует пытаться делать вне среды тестирования.

Тем не менее, две идеи:

1) Установить будильник на некоторое время в непосредственной близостибудущее и затем убить ваш процесс

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

Вы также можете попробовать запуститьот намерения начать себя и затем быстро умереть, но это звучит как потенциальное состояние гонки в зависимости от реализации.Если вы извлекли связыватель fd из / proc и совершили дурные поступки в нативном коде, вы можете запустить намерение таким образом, что ваше приложение аварийно завершится по возвращении из ioctl ...

4 голосов
/ 02 декабря 2010

Android не предназначен для этого, и это не «требование».Это реализация.Что именно является требованием?Почему вы не можете разработать свое приложение для обработки изменений предпочтений без перезапуска?Это кажется очень плохим решением.

2 голосов
/ 10 октября 2012

Поскольку вы закончили с завершением процесса, для перезапуска приложения используйте этот код:

Intent i = getBaseContext().getPackageManager().getLaunchIntentForPackage( getBaseContext().getPackageName() );
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(i);
2 голосов
/ 02 декабря 2010

Разработка ОС, чтобы приложение могло перезапускаться, выглядит очень плохой идеей.Операционная система Android должна быть свободна для уничтожения процесса, чтобы освободить память - если приложение может внезапно перезапустить себя, освободившаяся память снова используется.Я согласен с Falmarri, вам нужно выяснить, почему ваше приложение не может справиться с изменением предпочтений на лету.

1 голос
/ 12 марта 2014

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

public static void doRestart(Context c) {
        try {
            //check if the context is given
            if (c != null) {
                //fetch the packagemanager so we can get the default launch activity 
                // (you can replace this intent with any other activity if you want
                PackageManager pm = c.getPackageManager();
                //check if we got the PackageManager
                if (pm != null) {
                    //create the intent with the default start activity for your application
                    Intent mStartActivity = pm.getLaunchIntentForPackage(
                            c.getPackageName()
                    );
                    if (mStartActivity != null) {
                        mStartActivity.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                        //create a pending intent so the application is restarted after System.exit(0) was called. 
                        // We use an AlarmManager to call this intent in 100ms
                        int mPendingIntentId = 223344;
                        PendingIntent mPendingIntent = PendingIntent
                                .getActivity(c, mPendingIntentId, mStartActivity,
                                        PendingIntent.FLAG_CANCEL_CURRENT);
                        AlarmManager mgr = (AlarmManager) c.getSystemService(Context.ALARM_SERVICE);
                        mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 100, mPendingIntent);
                        //kill the application
                        System.exit(0);
                    } else {
                        Log.e(TAG, "Was not able to restart application, mStartActivity null");
                    }
                } else {
                    Log.e(TAG, "Was not able to restart application, PM null");
                }
            } else {
                Log.e(TAG, "Was not able to restart application, Context null");
            }
        } catch (Exception ex) {
            Log.e(TAG, "Was not able to restart application");
        }
    }

Это также приведет к повторной инициализации классов jni и всех статических экземпляров.

0 голосов
/ 13 марта 2014

Если это корпоративный проект, в котором у вас есть контроль над устройствами, вы можете легко установить второе приложение, которое работает в качестве сторожевого таймера для первого.Один из моих клиентов использует такое сторожевое приложение для обработки таких вещей, как ночная перезагрузка приложения (по странным, нетехническим причинам), а также для проверки и установки обновлений приложения самообслуживания (не Play Store).

Но если вы действительно хотите сделать это из своего приложения, вы можете сделать следующее (включая процесс уничтожения, описанный выше):

Process.killProcess(Process.myPid());
AlarmManager am = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
am.set(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime() + 500 /* half a second*/,
       PendingIntent.getActivity(this, 0, new Intent(this, this.getClass()),
                                 Intent.FLAG_ACTIVITY_NEW_TASK));
0 голосов
/ 30 мая 2012

вот идея:

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

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

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

...