Я думал, есть ли способ предотвратить процесс приложения от Android, если нет видимого компонента пользовательского интерфейса.Процесс, который Android не сможет убить?
Например, есть Service
, который выполняет важную работу. Разработчик не хочет показывать уведомления через startForeground
, таким образом, процесс будет иметь Сервисный процесс уровень в соответствии с http://developer.android.com/guide/components/processes-and-threads.html. Таким образом, если система будет находиться под большим давлением в памяти, тогда есть большой шанс, что андроид остановит обслуживание.
У меня в голове одна сумасшедшая идея. В соответствии с этой страницы, процесс будет иметь процесс переднего плана уровень, если
Он принимает
BroadcastReceiver
, что выполняет его методonReceive()
.
Что делать, если разработчик запускает отдельный процесс с услугой и широковещательным приемником, который onReceive()
никогда не останавливается?
Код будет выглядеть следующим образом. Например, разработчик имеет IntentService
и BroadcastReceiver
, которые работают на отдельном процессе:
<service
android:name=".MyService"
android:process=":myprocess">
</service>
<receiver
android:name=".MyReceiver"
android:process=":myprocess">
<intent-filter>
<action android:name="MY_ACTION" />
</intent-filter>
</receiver>
BroadcastReceiver
выглядит следующим образом:
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// block main thread
try {
Thread.sleep(5000);
} catch (InterruptedException e) {}
// run this receiver again
Intent intent = new Intent();
intent.setAction(MY_ACTION);
context.sendBroadcast(intent);
}
}
Итак, что здесь происходит, блоки разработчик onReceive
метод так, чтобы процесс остается на переднем плане. Поток спит в течение 5 секунд, потому что 10-секундная задержка вызовет ANR (согласно http://developer.android.com/reference/android/content/BroadcastReceiver.html). Насколько я понимаю, нет никакой опасности блокировать поток пользовательского интерфейса здесь, потому что приемник работает в отдельном процессе. Затем приемник отправляет новую трансляцию самому себе, и этот процесс никогда не останавливается, пока разработчик не отключит приемник через PackageManager
во время выполнения.
Между тем разработчик взаимодействует со своим IntentService
через вызовы startService
. IntentService
работает на фоновом потоке, поэтому на него не будет влиять MyReceiver
.
Итак, предотвратит ли процесс и услугу от того, что Android будет убит, если на нем мало памяти? Конечно, я не собираюсь реализовывать это в своем приложении, но мне очень интересно, если это будет работать или нет.
Как насчет перезапуска вашего процесса, когда он был убит? – ashutiwari4
Может быть, разработчик не хочет останавливать процесс? Например, они используют некоторое соединение сокетов –