我正在使用唤醒响铃来定期更新应用状态。 wifi需要一段时间才能连接三星手机。此外,Wifi 上的“保持清醒”选项不会在三星手机上运行(nor are they interested in fixing the issue)。所以当唤醒锁发生时,它应该等待wifi连接。我是否需要为wifi连接创建一个监听器才能工作,或者应该唤醒,有点阻止该wifi连接?
mWakeLock = ((PowerManager) getSystemService(POWER_SERVICE)).newWakeLock(
PowerManager.PARTIAL_WAKE_LOCK, "Taxeeta");
mWakeLock.acquire();
// do some network activity, in a asynctask
// in the doPost of asyscTask, release lock
编辑: 问题是,如果网络没有连接,那么在AsyncTask中,OR需要时间(3g需要一段时间才能启动),Async doInBackground中的webservice调用将失败。而且无论如何我都要释放锁。
SO
我应该放入wifi /数据连接侦听器吗?或者有更好的方法吗?
答案 0 :(得分:1)
我有类似的情况 - 我被警报唤醒,the alarm's BroadcastReceiver启动 WakefulIntentService ,服务开始扫描网络。 I use a stupid way of holding on to the lock 1 - 我打算用闩锁替换它。我建议你用WakefulIntentService替换“AsyncTask”。机会是AsyncTask永远不会被解雇。在 WakefulIntentService 的,你必须获得并留住有wifi锁 - 我会做这个的静态的的YourWakefulIntentService的领域 - 这个还不完全清楚 - 这是一个而回。如果这不起作用,我会在YourWakefulIntentService中使用一个锁存器:
// register an alarm
Intent i = new Intent(context, YourReceiver.class);
PendingIntent alarmPendingIntent= PendingIntent.getBroadcast(context, 0, i,
PendingIntent.FLAG_UPDATE_CURRENT);
public class YourReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
WakefulIntentService.sendWakefulWork(context, YourWIS.class);
}
}
//pseudocode !
public class YourWIS extends WakefulIntentService { // you must add a cstor !
@Override
doWakefulWork() {
acquireWifiLock();
enableScanReceiver();
startScan();
serviceLatch.wait();
releaseWifiLock();
}
}
// in YourScanReceiver
onReceive() {
if(action.equals(SCAN_RESULTS) {
// do something that does not take time or start another/the same
// WakefulIntentService
serviceLatch.notify();
}
}
首先尝试WakefulIntentService(我猜你从警报接收器启动AsyncTask)。扫描接收器是一个注册接收扫描结果的接收器(参见WifiManager文档 - 更愿意将接收器发送给听众以解决睡眠问题)
1:这是一个工作类 - 我只是使用第二个唤醒意图服务来保持唤醒锁 - 仍然要重构它以使用锁存器但这种方法至少可行(我有第二个服务(看门人)在监视器上等待并在关守内部进行唤醒锁定。看门人也保持其CPU锁定所以一切都很好(和丑陋)