繁体   English   中英

即使我的应用在PowerManager(Sony Xperia)上获得了PARTIAL_WAKE_LOCK,也无法在Android设备处于睡眠状态时立即连接到服务器

[英]Cannot immediately connect to the server when android device is on sleep even though my app gets the PARTIAL_WAKE_LOCK at PowerManager (Sony Xperia)

[我的Android应用程序摘要]我的应用程序以固定的时间间隔(30秒)监视服务器。

[结果(问题)]

  1. 18 [h] 00 [m] 00 [s]服务器检查正常。
  2. 18 [h] 00 [m] 30 [s]服务器检查正常。
  3. 18 [h] 03 [m] 14 [s]服务器检查正常。 <=这是问题。 我的应用程序应在18:01:00检查服务器。

    我的应用程序无法以固定的时间间隔在Sony xperia上连接服务器。

[预期成绩]

  1. 18 [h] 00 [m] 00 [s]服务器检查正常。
  2. 18 [h] 00 [m] 30 [s]服务器检查正常。
  3. 18 [h] 01 [m] 00 [s]服务器检查正常。

[关于我的程序]我的应用程序以固定的时间间隔从AlarmManager接收广播。 BroadcastReceiver开始服务。 服务时,我的应用程序连接到服务器。 我的应用程序的详细信息如下。

[Step1]:通过AlarmManager设置setRepeating

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 servname NULL数字4 appname I / QCNEJ(686):| CORE | 收到CNE_NOTIFY_NSRM_BLOCKED_UID

[普通日志]

I / QCNEA(10674):| NIMS | getaddrinfo:主机名google.co.jp servname NULL数字4应用程序名称I / QCNEA(10674):| NIMS | getaddrinfo:主机名google.co.jp servname NULL数字0应用程序名称I / QCNEA(278):| NIMS | getaddrinfo:主机名google.co.jp servname NULL数字0应用程序名称I / QCNEA(10674):| NIMS | getaddrinfo:主机名173.194.126.151 servname NULL数字4应用程序名称I / QCNEA(10674):| NIMS | 连接:对于43 Saddr 00000000000000000000000000000000:52017(28)daddr 10 0000000000000000ffff00007681007d:80

[环境] Sony xperia SOL22,这是Sony Xperia Z的日本模式。Android4.2.2。 网络环境仅是移动互联网(LTE)。 Wifi开关已关闭。

[问题分析]当我的xperia设备不睡眠时,我的应用程序可以正常工作。 仅使用Wifi时,我的应用程序也可以正常工作。 我也在Nexus7上试用了此应用。 工作正常。 即使我的应用程序从PowerManager获取了WakeLock,我的xperia网络设备或软件仍可能继续休眠。

[问题]如何解决此问题? 任何想法都非常欢迎。

我对开发手机应用程序一无所知,但我拥有XperiaZ。当手机处于睡眠状态时,它通常会切换Wifi和移动互联网-屏幕打开时会重新打开。

这可能是您的问题吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM