0

Я искал этот сценарий на SO. Но мне нужна какая-то основная информация.Перезапуск приложения Android с ожидающим намерением (BEHAVIOR)

Корпус прост: приложение необходимо перезапустить, но экран устройства запуска не должен отображаться. (по какой-то очевидной причине я хочу освободить память приложения).

Отложенный намерение используется для перезапуска приложения:

restartTime = 0; 
alarmManager.set(AlarmManager.RTC, System.currentTimeMillis() 
        + restartTime, pendingIntent); //Restarting application 

& приложение убивается с помощью этой команды:

android.os.Process.killProcess(android.os.Process.myPid()); 

Журналы:

02-05 11:01:59.475: D/HomeActivity(31009): Restarting application 
02-05 11:01:59.485: I/Process(31009): Sending signal. PID: 31009 SIG: 9 
02-05 11:01:59.635: I/HomeActivity(956): On Create 
02-05 11:01:59.715: D/dalvikvm(956): GC_FOR_ALLOC freed 163K, 15% free 50758K/59248K, paused 22ms, total 22ms 
02-05 11:01:59.745: I/dalvikvm-heap(956): Grow heap (frag case) to 65.724MB for 15816616-byte allocation 
02-05 11:01:59.815: D/dalvikvm(956): GC_FOR_ALLOC freed 2K, 12% free 66204K/74696K, paused 17ms, total 17ms 
02-05 11:01:59.845: I/dalvikvm-heap(956): Grow heap (frag case) to 78.908MB for 13824016-byte allocation 
02-05 11:01:59.915: D/dalvikvm(956): GC_FOR_ALLOC freed <1K, 10% free 79709K/88200K, paused 18ms, total 18ms 
02-05 11:02:00.045: I/HomeActivity(956): On Resume 

Как можно видеть , GC вызывается после onCreate of HomeActivity. Возможно ли, что любой поток, работающий с (последним) контекстом приложения, все еще жив?

Непонятный вопрос: если в случае использования ЦП устройства высокий, возможно ли, что приложение перезапускается (до ожиданий намерений) до того, как приложение будет уничтожено.

+0

Является ли приложение на переднем плане при вызове 'killProcess()'. Какой компонент вызывает 'killProcess()'? –

+0

@DavidWasser Да, приложение находится на переднем плане. Скажем, простой щелчок на кнопке вызывает killprocess(). – vipulfb

ответ

0

Использование killProcess() действительно плохой архитектуры. Если ваше приложение находится на переднем плане, пользователь получит диалоговое окно («Приложение перестало работать» или что-то в этом роде). Кроме того, если это произойдет, Android предполагает, что активность в верхней части стека сделала что-то плохое, и она удаляет Activity из стека и автоматически перезапускает приложение, начиная с Activity под ним (это поведение может отличаться в разных версиях Android).

Вместо этого вы должны написать какой-то метод повторной инициализации, который очищает старый мусор и восстанавливает чистое состояние. Либо это, либо просто перезапустите приложение, снова запустив свою активность с помощью Intent.FLAG_ACTIVITY_CLEAR_TOP или Intent.FLAG_ACTIVITY_CLEAR_TASK