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

11

我是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
你说的“kill the application”是什么意思?如果用户进入应用程序的设置页面并选择“强制停止”,则服务将被停止,这是无法避免的。 - Premsuraj
这就是我所说的终止应用程序。 - duncanportelli
我也想知道 "kill the application" 是什么意思?不过,我想指出的是服务可以被分离出来,这样如果用户停止了应用程序,服务仍然可以继续运行。 - class stacker
@ClassStacker,我指出了如何通过放置链接来“杀死应用程序”。是的,我需要的是一个即使应用程序停止也能继续运行的服务。现在我拥有的是一个虽然可以继续运行的服务,但当应用程序停止时会重新启动。 - duncanportelli
我已经提供了一个答案。我不确定我是否正确理解了“当应用程序停止时重新启动”的含义。您能否更详细地描述一下,并提供在其上下文中启动和停止服务的代码,即您的Activity的生命周期方法。 - class stacker
@ClassStacker 我通过在手机上进入“设置”-->“应用程序”-->“正在运行的服务”来检查这个问题。当我像视频中所示杀死应用程序时,即使我添加了android:process属性,设置中的服务仍然显示为重新启动。 - duncanportelli
2个回答

11

关于杀死的澄清之后:

你可能想要在你的应用程序服务中分别运行不同的进程。你可以通过在你的清单文件中添加以下声明来实现:

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

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

如果您只想接收可以在清单中声明的事件,则可以考虑使用IntentService,由于其短暂的活动时间,它几乎永远不会对用户可见。但是,如果您需要监听仅可通过编程方式注册接收器才能接收的事件(在这种情况下,显然,在清单中的receiver子句毫无意义),则无法防止用户(或其中一个“智能应用程序杀手”)关闭您的服务。优点仍然在于,用户希望执行某些操作时可能会了解到您的应用程序可以被关闭,而您的Service则不能被关闭。

此外,您可以将您的Service 置于前台


2
将服务置于前台解决了我的问题。非常感谢 :) - duncanportelli
你在 OnTaskRemoved() 中把它带到了哪里? - TaRan LaYal
如果你不像我这样使用别名TaRanLaYal,@user1135357可能没有注意到你的问题。很遗憾,我的答案中的参考链接今天部分失效了,但你仍然可以自己找到页面上的那一部分。无论如何,也许user1135357能够对他的具体解决方案提供一些帮助。 - class stacker
很难知道,抱歉。 - famfamfam

-3

我认为你需要在AndroidManifest.xml中声明该服务。


1
真的吗?那与问题有什么关系呢? - class stacker
好的,除了没有我的代码(我手头没有可访问的代码)之外,它与您提供的内容相同。我必须在我的一个应用程序中做类似的事情,这就是为什么我不需要澄清; 我知道用户想要什么。话虽如此,我不能像你那样提供详细的答案,因为我对Android还是比较新的。不过我可以解释一下需求的原因。对此很抱歉。 - confused_at_times
这个回答是误导性的,与问题无关。 - ralphgabb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接