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

时间:2014-05-08 11:28:38

标签: android sony wakelock sony-xperia lte

[我的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上以固定间隔连接服务器。

  4. [预期结果]

    1. 18 [h] 00 [m] 00 [s]服务器检查确定。
    2. 18 [h] 00 [m] 30 [s]服务器检查确定。
    3. 18 [h] 01 [m] 00 [s]服务器检查确定。
    4. [关于我的计划] 我的应用程序以固定的时间间隔从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的braodcast,我的服务也成功启动。 但我的程序暂停在&#34; httpClient.execute&#34;用下面的日志约2分钟。

        

      I / QCNEA(10674):| NIMS | getaddrinfo:hostname google.co.jp servname   NULL数字4 appname I / QCNEJ(686):| CORE |   已收到CNE_NOTIFY_NSRM_BLOCKED_UID

      [普通日志]

        

      I / QCNEA(10674):| NIMS | getaddrinfo:hostname google.co.jp servname   NULL numeric 4 appname I / QCNEA(10674):| NIMS | getaddrinfo:主机名   google.co.jp servname NULL数字0 appname I / QCNEA(278):| NIMS |   getaddrinfo:hostname google.co.jp servname NULL numeric 0 appname   I / QCNEA(10674):| NIMS | getaddrinfo:hostname 173.194.126.151 servname   NULL numeric 4 appname I / QCNEA(10674):| NIMS |连接:为43 saddr   00000000000000000000000000000000:52017(28)daddr 10   0000000000000000ffff00007681007d:80

      [环境] 索尼xperia SOL22,这是Sony Xperia Z的日本型号。 Android 4.2.2。网络环境仅为移动互联网(LTE)。 Wifi开关关闭。

      [问题分析] 当我的xperia设备没有睡眠时,我的应用程序正常工作。 当我只使用Wifi时,我的应用程序也能正常工作。 我也在Nexus7上试过这个应用程序。它工作正常。 即使我的应用程序从PowerManager获取WakeLock,我的xperia网络设备或软件仍可能继续睡眠。

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

1 个答案:

答案 0 :(得分:0)

我对开发手机应用程序一无所知,但我拥有Xperia Z.当手机处于睡眠状态时,它通常会切换到Wifi&amp;移动互联网 - 在屏幕开启时重新启动。

这可能是你的问题吗?