0

上下文:我正在尝试通过 AlarmManager 实现一个服务调用第二个服务(第一个服务的子类)。为此,我需要创建一个广播接收器作为内部类,如此处所推荐的(Service 和 BroadCastReceiver)。但是,似乎第一个服务从未成功调用第二个服务,或者第二个服务没有接收到调用。

我环顾四周,发现其他人也遇到了类似的问题,但从未解决:来自 service 的 AlarmManager

第一个服务中调用第二个服务的代码很简单:

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);
4

1 回答 1

1

我没有实现一个方法吗?

好吧,LocalWordSubClass除了继承的方法之外,似乎没有方法。

Intent此外,您正在尝试向Service(通过您的)发送广播PendingIntent,但这是行不通的。

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

接下来,根据您的相关评论

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

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

您似乎正在尝试实现我在前面的评论中所写的内容:

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

我的意思是,您将使用set()onAlarmManager和 agetService() PendingIntent将控制权交付给您已经运行Service的已经获得WakeLock的 ,以便它可以获取位置、释放WakeLockstopSelf()

于 2013-07-02T16:35:14.467 回答