[我的 android 应用程序的摘要] 我的应用程序以固定的时间间隔(30 秒)监控服务器。
[结果(问题)]
- 18[h] 00[m] 00[s] 服务器检查正常。
- 18[h] 00[m] 30[s] 服务器检查正常。
18[h] 03 [m] 14 [s] 服务器检查正常。<= 这是问题。我的应用程序应该在 18:01:00 检查服务器。
我的应用程序无法在 Sony xperia 上以固定间隔连接服务器。
[预期成绩]
- 18[h] 00[m] 00[s] 服务器检查正常。
- 18[h] 00[m] 30[s] 服务器检查正常。
- 18[h] 01 [m] 00 [s] 服务器检查正常。
[关于我的程序] 我的应用程序以固定的时间间隔从 AlarmManager 接收广播。BroadcastReceiver 启动服务。在服务中,我的应用程序连接到服务器。我的应用程序的详细信息如下。
[Step1] : 通过 AlarmManager 设置重复
private void setRepeating () {
AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
am.setRepeating(AlarmManager.RTC_WAKEUP,System.currentTimeMillis(),pollingIntervalmsec, pendingIntent);
}
[Step2] : 从 AlarmManager 接收广播并启动服务
public class PollingAlarmBroadcastReceiver extends BroadcastReceiver {
private static final String WAKELOCK_TAG = "xxx.xxx.xxx.xxx.PollingAlarmBroadcastReceiver";
private static PowerManager.WakeLock wl;
@Override
public void onReceive(Context context, Intent arg1) {
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, WAKELOCK_TAG);
wl.acquire();
Intent intent = new Intent(context, MonitoringService.class);
context.startService(intent);
}
private void doOperation(Context context) {
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, WAKELOCK_TAG);
wl.acquire();
Intent intent = new Intent(context, MonitoringService.class);
context.startService(intent);
}
}
AndroidManifest.xml
<receiver
android:name="xxx.xxx.xxx.xxx.PollingAlarmBroadcastReceiver"
android:exported="false">
<intent-filter>
<action android:name="cxxx.xxx.xxx.xxx.PollingAlarm" />
</intent-filter>
</receiver>
[Step3] : 在服务端,连接服务器。
HttpGet request = new HttpGet(url);
request.setHeaders(headers);
HttpParams params = new BasicHttpParams();
DefaultHttpClient httpClient = new DefaultHttpClient(params);
HttpResponse response = httpClient.execute(request);
【Step4】:连接服务器后解除唤醒锁。
wl.release();
[问题日志] 我的应用程序成功接收到来自AlarmManager 的广播,我的服务也成功启动了。但是我的程序在“httpClient.execute”处暂停了大约 2 分钟,日志如下。
I/QCNEA(10674):|NIMS| getaddrinfo: 主机名 google.co.jp 服务名 NULL numeric 4 appname I/QCNEJ(686): |CORE| 收到 CNE_NOTIFY_NSRM_BLOCKED_UID
[普通日志]
I/QCNEA(10674):|NIMS| getaddrinfo: 主机名 google.co.jp 服务名 NULL 数字 4 应用程序名 I/QCNEA(10674): |NIMS| getaddrinfo: 主机名 google.co.jp 服务名 NULL 数字 0 应用程序名 I/QCNEA(278): |NIMS| getaddrinfo: 主机名 google.co.jp 服务名 NULL 数字 0 应用程序名 I/QCNEA(10674): |NIMS| getaddrinfo: 主机名 173.194.126.151 服务名 NULL 数字 4 应用程序名 I/QCNEA(10674): |NIMS| 连接:对于 43 saddr 00000000000000000000000000000000:52017 (28) daddr 10 0000000000000000ffff00007681007d:80
【环境】 Sony xperia SOL22,这是Sony Xperia Z的日系机型。Android 4.2.2。网络环境仅为移动互联网(LTE)。Wifi 开关已关闭。
【问题分析】 我的xperia设备不休眠时,我的应用程序运行正常。当我只使用 Wifi 时,我的应用程序也能正常工作。我也在 Nexus7 上试过这个应用程序。它工作正常。即使我的应用程序从 PowerManager 获取了 WakeLock,我的 xperia 网络设备或软件仍可能继续休眠。
[问题] 如何解决这个问题?任何想法都非常受欢迎。