应用程序被杀死时Android服务重新启动

dun*_*lli 10 service android

我是Android新手.我正在开发一个记录传感器数据的应用程序.我有两个按钮的活动.当用户按下开始按钮时,我想要启动服务并记录传感器数据,直到用户按下停止按钮.我不确定我想使用哪种类型的服务.我读到了本地与远程服务,但我并没有真正理解其中的区别.

我到现在为止做了什么:

我创建了一个带有两个按钮的活动,用于启动和停止本地服务:

//Start Service
startService(new Intent(this, MyService.class));

//Stop Service
stopService(new Intent(this, MyService.class));
Run Code Online (Sandbox Code Playgroud)

我还创建了一个粘性服务,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;
}
Run Code Online (Sandbox Code Playgroud)

AndroidManifest.xml中:

<service android:name=".MyService" android:enabled="true" android:process=":HelloSensors_background"/>
Run Code Online (Sandbox Code Playgroud)

它运行良好,但问题是当我终止启动服务的应用程序时,此服务重新启动并丢失所有以前记录的数据.我应该使用什么来使服务顺利运行并且即使在应用程序被杀死时仍继续运行以便不丢失任何记录数据?

cla*_*ker 11

在您澄清有关杀戮之后:

您可能希望Service在不同于您的过程中运行您的过程Application,您可以通过清单中的此类声明来实现:

<service
    android:name=".ServiceClassName"
    android:process=":yourappname_background" >
    ...
Run Code Online (Sandbox Code Playgroud)

android:processreceiver清单中的任何声明使用相同的属性.

如果您只想接收可以在清单中声明的​​事件,则可以考虑使用a IntentService,由于活动时间较短,用户几乎看不到它.但是,如果你需要监听只有在以编程方式注册接收者时才能收到的事件(在这种情况下,很明显,receiver清单中的条款毫无意义)那么你就无法对用户做任何事情(或者是"智能"之一)应用程序杀手")杀死你的服务.优点仍然是,用户希望了解您的应用程序可能会被杀死,而您Service不能(如果他们希望它做某事).

此外,您可以将您Service带到前台.

  • 将服务带到前台解决了我的问题.非常感谢 :) (2认同)