不能立即连接到服务器时,Android设备上睡觉,即使我的应用程序得到PARTIAL_WAKE_LO

2019-11-03 04:50发布

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

[结果(问题)]

  1. 18并[h] 00 [M]。00 [s]的服务器检查OK。
  2. 18并[h] 00 [M]。30 [s]的服务器检查OK。
  3. 18并[h] 03 [M]。14 [s]的服务器检查OK。 <=这是问题。 我的应用程序应该在18时01分00秒检查服务器。

    我的应用程序不能在索尼XPERIA固定的时间间隔连接服务器。

[预期成绩]

  1. 18并[h] 00 [M]。00 [s]的服务器检查OK。
  2. 18并[h] 00 [M]。30 [s]的服务器检查OK。
  3. 18并[h] 01 [M]。00 [s]的服务器检查OK。

[关于我的程序]我的应用从临危AlarmManager以固定间隔广播。 广播接收器启动服务。 在服务,我的应用程序连接到服务器。 我的应用程序的细节如下。

[步骤1]:通过AlarmManager setRepeating

private void setRepeating () {
    AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
          am.setRepeating(AlarmManager.RTC_WAKEUP,System.currentTimeMillis(),pollingIntervalmsec, pendingIntent);
}

[步骤2]:收到广播从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>

[步骤3]:在提供服务,连接到服务器。

HttpGet request = new HttpGet(url);
request.setHeaders(headers);
HttpParams params = new BasicHttpParams();
DefaultHttpClient httpClient = new DefaultHttpClient(params);
HttpResponse response = httpClient.execute(request);

[步骤4]:在连接服务器后释放唤醒锁。

wl.release();

[问题日志]我的应用程序成功地从AlarmManager接收braodcast和我的服务成功启动了。 但我的计划摆在“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 | 连接:43 SADDR 00000000000000000000000000000000:52017(28)DADDR 10 0000000000000000ffff00007681007d:80

[环境]索尼XPERIA SOL22,这是索尼的Xperia Z.的Android 4.2.2的日本模式。 网络环境是唯一的移动互联网(LTE)。 wifi开关是关闭的。

[问题分析]当我XPERIA设备不睡我的应用程序工作正常。 当我只使用WiFi我的应用程序也能正常工作。 我在Nexus7试过这个程序了。 它工作正常。 我XPERIA网络设备或软件可以继续工作,即使我的应用程序从电源管理器获得激活锁定睡觉。

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

Answer 1:

我不知道开发手机应用什么,但我拥有的Xperia Z.当手机处于睡眠,经常切换Wifi和移动互联网 - 它回来时,画面切换上。

难道这是你的问题?



文章来源: 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)