在服务中调用AlarmManager

时间:2013-07-02 15:45:04

标签: android broadcastreceiver alarmmanager

上下文:我试图通过AlarmManager实现一个服务调用第二个服务(第一个服务的子类)。为此,我需要按照此处的建议(Service and a BroadCastReceiver)创建一个广播接收器作为内部类。但是,似乎第一个服务从未成功调用第二个服务,或者第二个服务未接收到该呼叫。

我环顾四周,发现其他人有类似的问题从未得到解决:AlarmManager from service

第一个调用第二个服务的代码就是:

private final long ONE_MINUTE = 60*1000*1;

 Context theContext = getBaseContext(); 
    AlarmManager theService = (AlarmManager) theContext
            .getSystemService(Context.ALARM_SERVICE);

    Intent i = new Intent(theContext, LocalWordSubClass.class);

    PendingIntent thePending = PendingIntent.getBroadcast(theContext, 0, i,
            PendingIntent.FLAG_CANCEL_CURRENT);

    //call this after two minutes 
    theService.set(AlarmManager.RTC_WAKEUP, SystemClock.elapsedRealtime()+TWO_MINUTES, thePending);

我的第二项服务是:

public class LocalWordSubClass extends LocalWordService {
BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        if(checkIfGooglePlay() && checkTime()) {
            getPostLocation();
        }
        mLocationClient.disconnect(); //connected in the first service class
        stopSelf();
    }
};  

}

我的第二项服务表明:

<service
        android:name=".LocalWordSubClass"
        android:label="LocalWordSubClass" >
    </service>

问题:我是否未能实施某种方法?或者我是否需要将广播接收器添加到清单中?我有点困惑为什么第二堂课没有回应。

**更新:**感谢CommonWare的多项建议,我能够在连接LocationClient和获取其最后位置之间实现这一分钟。但是,当MainActivity的AlarmManager的setRepeating方法调用时,该服务不再重复运行。

这是代码(成功提供locationClient连接时间)

 if(mLocationClient==null) {
    pm = (PowerManager) getBaseContext().getSystemService(Context.POWER_SERVICE);
    wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "");
    wl.acquire();
        initalizeLocks();
        mLocationClient = new LocationClient(this, this, this);
    mLocationClient.connect();
        Context theContext = getBaseContext();

    AlarmManager theService = (AlarmManager) theContext
            .getSystemService(Context.ALARM_SERVICE);

    Intent i = new Intent(LocalWordService.this, this.getClass());

    PendingIntent thePending = PendingIntent.getService(this, 0, i,
            PendingIntent.FLAG_CANCEL_CURRENT);
    //call this after two minutes 
    theService.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + ONE_MINUTE, thePending);
    } else {
        getPostLocation();
        wl.release();
        mLocationClient = null;
        stopSelf();
    }

MainActivity的AlarmManager是:

Calendar cal = Calendar.getInstance();

    Intent intent = new Intent(this, LocalWordService.class);
    PendingIntent pintent = PendingIntent.getService(this, 0, intent, 0);
    AlarmManager alarm = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

    alarm.
    setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), EVERY_TWO_MINUTES, pintent);

1 个答案:

答案 0 :(得分:1)

  

我未能实施方法吗?

嗯,LocalWordSubClass似乎没有方法,除了继承的方法。

此外,您正尝试将广播Intent发送到Service(通过您的PendingIntent),这不会起作用。

而且,BroadcastReceiver中定义的LocalWordSubClass未使用。

接下来,来自your related comment

  

我有一个初始服务调用一个新的子类(可以访问LocationClient)两分钟后

您的“新子类”将拥有自己的mLocationClient,与您流程中任何其他mLocationClient的{​​{1}}无关。

您似乎正在尝试实施我在the preceding comment中撰写的内容:

  

@ jsc123:“在轮询该位置之前,您会如何建议我将我的LocationClient连接两分钟窗口?” - 你可以使用AlarmManager,在两分钟内调用set()来获得控制权。

我的意思是,您可以Service set()使用AlarmManager getService() PendingIntent将控制权交还给已经投放的Service使用已获得的WakeLock,以便它可以获取位置,释放WakeLockstopSelf()