只要Android设备处于打开状态,我想在后台运行服务。我已经有了一个广播接收器,在监听BOOT_COMPLETED
以确保它在它应该的时候开始,并且它确实如此。但是当主要活动开始时,我想确保服务仍在运行,如果没有,请重新启动服务。我很早就开始接触服务,所以我不确定我是否做得对。确定服务在启动时是否正在运行,因为它是自己的进程?
清单中的服务被定义为
<service
android:name="MyService"
android:icon="@drawable/myicon"
android:label="MyServiceLabel"
android:process=":my_process">
</service>
它正在从广播接收器使用
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;
}
将这项服务逗留无限期地或OS可以关闭它?如果它关闭了,我的活动如何说明?如果我的活动确实需要重新启动服务,那么是否需要采取特殊的方式来确保它是一个单独的进程,当主要活动消失时不会死亡?对于有这么多问题感到抱歉,我只是觉得在他们自己的流程中(以及一般的服务)有点误导了服务。我读过的所有内容都是关于服务不在他们自己的过程中
我问,因为有一次我相信我有多次运行的服务。服务和活动不直接相互作用。该服务写入活动读取的同一个数据库。有一次,似乎信息被复制到数据库中,我认为这是由同时运行的多个服务实例引起的。
我试过使用this answer中的代码,但它似乎不适用于在不同进程中运行的服务。在系统设置>应用程序>运行中,它显示我的应用程序运行1个进程和1个服务(由broadcastreceiver启动),但isMyServiceRunning
方法返回false,并逐步通过它似乎没有列出我的服务。
我的服务纯粹是在设备开启的整个过程中定期执行某些操作。 AlarmManager能否可靠地做到这一点? AlarmManager让我想起闹钟设置的闹钟,比如早上醒来。它与这些警报有什么关系? – 2013-04-04 18:31:36
是的 - 你的名字错了。这基本上是为了这个目的。闹钟是由时间驱动的事件。就像“每5分钟跑一次”或“在15:40跑我”。因此,引导接收器应设置第一个警报,然后警报处理代码将设置下一个警报(或者您只需将其设置为循环警报 - 取决于您所需)。请参阅http://developer.android.com/reference/android/app/AlarmManager.html上的AlarmManager文档 – 2013-04-04 18:35:24