android服务以特定间隔连续执行任务

时间:2012-06-14 12:40:38

标签: java android android-service

经过长时间的搜索,我仍然对此感到困惑,虽然我发现了一些相关的帖子,但他们没有回答我在寻找什么。在我的场景中,我想以固定的间隔(例如每5分钟)将用户的lat发送到服务器。为了做到这一点,我使用了一个具有自己进程的服务,以便在Activity销毁时不会被杀死,并且在服务方法onStartCommand中我使用了一个条件为always的while循环,并且在该循环中我将位置更新到服务器并给出延迟thread.sleep如下所示

@Override
    public int onStartCommand(Intent intent, int flags, int startId) {
   While(true)
           {
            Location currentLocation = getLocation();
            updateLocationToServer(currentLocation);
            try
               {
                Thread.sleep(300000)
               }
            catch(Exception e)
               {
                e.printStackTrace()
               }
           }
return Service.START_STICKY;

这里我无法理解return语句是无法访问的,那么服务如何在销毁时自动重启,其次使用thread.sleep导致ANR(应用程序无响应),而服务是后台进程,我发现它直接在UI线程中运行这些信息让我感到困惑,在这种情况下,获得所需功能的最佳方法是什么。

3 个答案:

答案 0 :(得分:3)

您应该使用AlertManager代替!

AlarmManager mgr=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent i=new Intent(context, OnAlarmReceiver.class);
PendingIntent pi=PendingIntent.getBroadcast(context, 0, i, 0);

mgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), PERIOD, pi);

http://justcallmebrian.com/?p=129

答案 1 :(得分:1)

secondly using thread.sleep causing ANR (Application Not Responding) while service is a background process

http://developer.android.com/reference/android/app/Service.html

请注意,服务与其他应用程序对象一样,在其托管进程的主线程中运行。

答案 2 :(得分:0)

请尝试使用警报管理器,请参阅how to set it to repeat every 5 minutes

的此示例