上下文:我试图通过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);
答案 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
,以便它可以获取位置,释放WakeLock
和stopSelf()
。