在服务中没有收到CountDownTimer回调

时间:2014-11-14 08:10:52

标签: android service countdowntimer

我有一个绑定服务,每15分钟收集一次位置3分钟。一旦服务在onServiceConnected ServiceConnection内连接,我就会启动CountDownTimer。
我完全接收所有定时器回调(onFinish)(onTick)到bindService可见的活动。
当设备被锁定时,我没有从计时器收到任何更新。

MyLocationService

public class MyLocationService extends Service implements MyTimerListener{

    private IBinder mBinder = new MyLocationBinder(); 

    public void onCreate() {
        locationManager = new MyLocationManager(this);
    }

    @Override
    public IBinder onBind(Intent arg0) {
        return mBinder;
    }

    public class MyLocationBinder extends Binder
    {
        public MyLocationService getService()
        {
            return MyLocationService.this;
        }
    }

    public void startFetchingLocations()
    {
        if(locationManager != null){
            locationManager.startFetchingLocations();
            if(publishPeriodCountDownTimer != null) {
                publishPeriodCountDownTimer.cancel();
                publishPeriodCountDownTimer = null;
            }
            publishPeriodCountDownTimer = new MyCountTimer(gpsPublishPeriod * 60 * 1000, 1000, MyLocationService.this);
            publishPeriodCountDownTimer.start();    
        }
    }


    @Override
    public void onTimeFinished() {
        //Start fetching locations
        locationManager.startFetchingLocations(); //Start 3 min CountdownTimer
    }


    @Override
    public void onTick() {

    }

    public void onAllLocationsRecieved(ArrayList<Location> locations)
    {
        //Do stuff on Locations

        locationManager.stopFetchingGPS(); //Stops 3 min countdownTimer
    }
}

MyActivty

public class MyActivity
    {

            @Override
            protected void onStart() {
                super.onStart();
                btnStop.setVisibility(View.VISIBLE);
                MyNoificationManager.cancelAllNotifications();

                if (!isLocationServiceBound) {
                    Intent locServiceIntent = new Intent(this, MyLocationService.class);    
                    bindService(locServiceIntent, locationServiceConnection, Context.BIND_AUTO_CREATE);
                }
        }

        private ServiceConnection locationServiceConnection = new ServiceConnection(){

            @Override
            public void onServiceDisconnected(ComponentName name) {
                isLocationServiceBound = false;

            }

            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                MyLocationBinder locationBinder = (MyLocationBinder) service;
                locationService = locationBinder.getService();
                isLocationServiceBound = true;
                locationService.startFetchingLocations();
            }
        };
    }

当Activity可见时,它按预期工作。设备锁定时,计时器不提供任何onTick()onTimeFinished()回调 这可能是什么问题?

1 个答案:

答案 0 :(得分:0)

当手机进入睡眠模式时,CountDownTimer将无法工作。这是设计和节省电池寿命。

或者,您可以使用android.app.AlarmManager来实现您的目标。以下是示例代码如何执行此操作。设置如下所示的alaram

   AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
   Intent intent = new Intent(this, MyLocationService.class);
   intent.putExtra("need_to_fetch_loc", true);
   PendingIntent alarmIntent = PendingIntent.getBroadcast(this, 0, intent, 0);
   alarmManager.set(AlarmManager.RTC_WAKEUP, gpsPublishPeriod * 60 * 1000, alarmIntent);

将以下方法添加到MyLocationService类

 @Override
 public int onStartCommand(Intent intent, int flags, int startId) {

     if(locationManager!= null && intent.getBooleanExtra("need_to_fetch_loc", false))
     {
         locationManager.startFetchingLocations();
     }

     return super.onStartCommand(intent, flags, startId);
 }