11

我是安卓新手。我正在开发一个记录传感器数据的应用程序。我有一个带有两个按钮的活动。当用户按下开始按钮时,我希望启动服务并记录传感器数据,直到用户按下停止按钮。我不确定我想使用哪种类型的服务。我阅读了有关本地服务与远程服务的信息,但我并没有真正理解它们的区别。

我到目前为止所尝试的:

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

//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"/>

它运行良好,但问题是当我终止启动该服务的应用程序时,该服务重新启动并丢失所有以前记录的数据。我应该使用什么才能使服务平稳运行并在应用程序被终止时继续运行,以免丢失任何记录的数据?

4

2 回答 2

11

在你澄清杀人事件后:

您可能希望在与您Service的不同的进程中运行您的进程Application,您可以通过清单中的这样一个声明来实现:

<service
    android:name=".ServiceClassName"
    android:process=":yourappname_background" >
    ...

android:process对清单中的任何receiver声明使用相同的属性。

如果您只想接收可以在清单中声明的​​事件,则可以考虑使用IntentService,由于其活动时间跨度短,用户几乎永远不会看到它。但是,如果您需要收听只能在以编程方式注册接收器时接收的事件(在这种情况下,显然receiver清单中的子句没有意义),那么您不能对用户(或“智能”之一应用程序杀手”)杀死您的服务。优点仍然是用户希望了解您的应用程序可以被杀死,而您Service不能(如果他们希望它做某事)。

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

于 2013-03-18T10:19:05.390 回答
-3

我认为您必须在 AndroidManifest.xml 中声明该服务。

于 2013-03-18T10:03:12.123 回答