【私のAndroidアプリの概要】 私のアプリは一定間隔(30秒)でサーバーを監視しています。
【結果(課題)】
- 18[h] 00[m] 00[s] サーバーチェックOK。
- 18[h] 00[m] 30[s] サーバーチェックOK。
18[h] 03 [m] 14 [s] サーバーチェックOK。<= これは問題です。私のアプリは 18:01:00 にサーバーをチェックする必要があります。
Sony Xperiaで一定時間間隔でサーバーに接続できません。
[予想された結果]
- 18[h] 00[m] 00[s] サーバーチェックOK。
- 18[h] 00[m] 30[s] サーバーチェックOK。
- 18[h] 01 [m] 00 [s] サーバーチェックOK。
【私のプログラムについて】 私のアプリはAlarmManagerからのBroadcastを一定間隔で受信しています。BroadcastReceiverがサービスを開始。サービスで、私のアプリはサーバーに接続します。私のアプリの詳細は以下の通りです。
[Step1] : setRepeating by AlarmManager
private void setRepeating () {
AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
am.setRepeating(AlarmManager.RTC_WAKEUP,System.currentTimeMillis(),pollingIntervalmsec, pendingIntent);
}
[Step2] : AlarmManager から Broadcast を受信し Service を起動
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 servname NULL 数値 4 appname I/QCNEJ(686): |CORE| CNE_NOTIFY_NSRM_BLOCKED_UID を受け取りました
【通常ログ】
I/QCNEA(10674): |NIMS| getaddrinfo: ホスト名 google.co.jp servname NULL 数値 4 appname I/QCNEA(10674): |NIMS| getaddrinfo: ホスト名 google.co.jp servname NULL 数値 0 appname I/QCNEA(278): |NIMS| getaddrinfo: ホスト名 google.co.jp servname NULL 数値 0 appname I/QCNEA(10674): |NIMS| getaddrinfo: ホスト名 173.194.126.151 servname NULL 数値 4 appname I/QCNEA(10674): |NIMS| 接続: for 43 saddr 0000000000000000000000000000000:52017 (28) daddr 10 000000000000000ffff00007681007d:80
【環境】 Sony Xperia SOL22、Sony Xperia Zの日本モデルです。Android 4.2.2。ネットワーク環境はモバイルインターネット(LTE)のみです。Wi-Fi スイッチがオフになっています。
[問題分析] Xperia デバイスがスリープ状態にならない場合でも、アプリは正常に動作します。私のアプリは、Wifi のみを使用している場合でも正常に動作します。Nexus7でもこのアプリを試しました。それは正常に動作します。アプリが PowerManager から WakeLock を取得しても、xperia ネットワーク デバイスまたはソフトウェアがスリープ状態を続けることがあります。
【質問】 この問題を解決するには?どんなアイデアでも大歓迎です。