2013-04-04 70 views
0

只要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,并逐步通过它似乎没有列出我的服务。

回答

1

不保证您的服务能够继续。基本上你必须预料会被杀,然后重新开始或杀死。另一件事,除非你是音频播放器,你不需要一直熬夜。如果你需要一直做连续工作,那么你可能会忘记移动环境是多么有限(电池等)。如果你需要这样一些重复的任务,那么我建议去AlarmManager在给定的时间或间隔触发工人,并使用IntentService来实际完成这项工作。

+0

我的服务纯粹是在设备开启的整个过程中定期执行某些操作。 AlarmManager能否可靠地做到这一点? AlarmManager让我想起闹钟设置的闹钟,比如早上醒来。它与这些警报有什么关系? – 2013-04-04 18:31:36

+0

是的 - 你的名字错了。这基本上是为了这个目的。闹钟是由时间驱动的事件。就像“每5分钟跑一次”或“在15:40跑我”。因此,引导接收器应设置第一个警报,然后警报处理代码将设置下一个警报(或者您只需将其设置为循环警报 - 取决于您所需)。请参阅http://developer.android.com/reference/android/app/AlarmManager.html上的AlarmManager文档 – 2013-04-04 18:35:24

相关问题