Перезагрузка Android-сервиса, когда приложение убито
Я новичок в Android. Я разрабатываю приложение, которое регистрирует данные датчиков. У меня есть активность с двумя кнопками. Когда пользователь нажимает кнопку запуска, я хочу, чтобы служба запускалась и регистрировала данные датчика, пока пользователь не нажмет кнопку остановки. Я не уверен, какой тип сервиса я хочу использовать. Я читал о локальных или удаленных службах, но я не совсем понял разницу.
То, что я пробовал до сих пор:
Я создал операцию с двумя кнопками, которые запускают и останавливают локальную службу:
//Start Service
startService(new Intent(this, MyService.class));
//Stop Service
stopService(new Intent(this, MyService.class));
Я также создал липкую услугу, которая onStartCommand()
начинает регистрировать данные датчиков:
public int onStartCommand(Intent intent, int flags, int startId) {
mSensorManager.registerListener(this, accelerometer,
SensorManager.SENSOR_DELAY_FASTEST);
mSensorManager.registerListener(this, magnetometer,
SensorManager.SENSOR_DELAY_UI);
mSensorManager.registerListener(this, lightSensor,
SensorManager.SENSOR_DELAY_UI);
Toast.makeText(this, "Service Started", Toast.LENGTH_LONG).show();
return Service.START_STICKY;
}
AndroidManifest.xml:
<service android:name=".MyService" android:enabled="true" android:process=":HelloSensors_background"/>
Это хорошо работает, однако проблема в том, что когда я убил приложение, которое запустило службу, эта служба перезагружается и теряет все ранее зарегистрированные данные. Что я должен использовать для обеспечения бесперебойной работы и продолжения работы, даже когда приложение будет убито, чтобы не потерять какие-либо зарегистрированные данные?
Ответы
Ответ 1
После разъяснения относительно убийства:
Вероятно, вы хотите запустить свой Service
в другом процессе, чем ваш Application
, который вы можете достичь с помощью такого объявления в манифесте:
<service
android:name=".ServiceClassName"
android:process=":yourappname_background" >
...
Используйте те же атрибуты android:process
для любых объявлений receiver
в манифесте.
Если вы хотите получать события, которые могут быть объявлены в манифесте, вы можете использовать IntentService
, который почти никогда не будет виден пользователю из-за его короткого периода активности. Однако, если вам нужно прослушивать события, которые могут быть получены только при программном использовании приемников (в этом случае, очевидно, в предложении receiver
в манифесте нет смысла), то вы не можете ничего сделать против пользователя (или одного из "умные убийцы приложений" ), убивающие вашу службу. Преимущество, тем не менее, состоит в том, что пользователи надеются понять, что ваше приложение может быть убито, а ваш Service
не может (если он хочет что-то сделать).
Кроме того, вы можете перенести Service
на передний план.
Ответ 2
Я думаю, вам нужно объявить службу в AndroidManifest.xml.