Перезагрузка 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.