只要android设备打开,我就想在后台运行服务。我已经有一个广播接收器正在监听BOOT_COMPLETED
以确保它在应该启动的时候启动,并且确实如此。但是当主要活动开始时,我想确保服务仍在运行,如果没有,则重新启动它。我对服务一开始还很陌生,所以我不确定我做得对。
在清单中,服务定义为
<service
android:name="MyService"
android:icon="@drawable/myicon"
android:label="MyServiceLabel"
android:process=":my_process">
</service>
它是从 BroadcastReceiver 开始使用的
public void onReceive(Context context, Intent intent) {
Intent service = new Intent(context, OgLogService.class);
context.startService(service);
}
我服务的重点是
public int onStartCommand(Intent intent, int flags, int startId) {
Timer t = new Timer();
t.scheduleAtFixedRate(new TimerTask() {
synchronized public void run() {
// call web service, do stuff
}
}, 0, 1000 * 60);
return Service.START_STICKY;
}
@Override
public IBinder onBind(Intent arg0) {
return null;
}
这项服务会无限期地保持下去还是操作系统会关闭它?如果它已关闭,我的活动如何判断?如果我的活动确实需要重新启动服务,我是否需要以一种特殊的方式来确保它是一个独立的进程,不会在主要活动死亡时死亡?很抱歉有这么多问题,我只是对自己流程中的服务(以及一般服务)感到有点误导。我读到的一切都是关于服务的,而不是在他们自己的过程中。
我问是因为有一次我相信我的服务运行了多次。服务和活动不直接交互。服务写入活动读取的同一数据库。有一次,数据库中的信息似乎重复了,我认为这是由同时运行的多个服务实例引起的。
我尝试使用此答案中的代码,但它似乎不适用于在不同进程中运行的服务。在系统设置 > 应用程序 > 运行中,它显示我的应用程序正在运行 1 个进程和 1 个服务(由广播接收器启动),但该isMyServiceRunning
方法返回 false 并且单步执行它似乎没有列出我的服务。