1

アラームにウェイクロックを使用して、アプリの状態を定期的に更新しています。Wi-Fi は、Samsung の携帯電話では接続に時間がかかります。また、Wifi の "keep awake" オプションは、Samsung の電話では機能しません(問題の修正にも関心がありません)。そのため、ウェイクロックが発生した場合は、wifi が接続されるまで待機する必要があります。これを機能させるには、wifi 接続用のリスナーを作成する必要がありますか、それとも、その wifi を接続するためにウェイクロック、ちょっとブロックする必要がありますか?

mWakeLock = ((PowerManager) getSystemService(POWER_SERVICE)).newWakeLock(
            PowerManager.PARTIAL_WAKE_LOCK, "Taxeeta");
    mWakeLock.acquire();
// do some network activity, in a asynctask
// in the doPost of asyscTask, release lock

編集:問題は、AsyncTask でネットワークが接続されていない場合、または取得に時間がかかる場合 (3g が取得するのに時間がかかる場合)、Async doInBackground での webservice 呼び出しが失敗することです。とにかくロックを解除する必要があります。

それで

にwifi/データ接続リスナーを配置する必要がありますか? それとももっと良い方法がありますか?

4

1 に答える 1

1

同様のシナリオがあります-アラームで目が覚め、アラームのBroadcastReceiverがWakefulIntentServiceを起動し、サービスがネットワークのスキャンを開始します。私はロックを保持する愚かな方法を使用します1 - これをラッチに置き換えるつもりです。「AsyncTask」を WakefulIntentService に置き換えることをお勧めします。AsyncTask が起動されない可能性があります。WakefulIntentServiceでは、wifi ロックを取得して保持する必要があります - これを YourWakefulIntentService の静的フィールドにします - これについては完全には明確ではありません - 少し前のことです。これが機能しない場合は、 YourWakefulIntentService でラッチを使用します。

// register an alarm
Intent i = new Intent(context, YourReceiver.class);
PendingIntent alarmPendingIntent= PendingIntent.getBroadcast(context, 0, i,
            PendingIntent.FLAG_UPDATE_CURRENT);

public class YourReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        WakefulIntentService.sendWakefulWork(context, YourWIS.class);
    }
}

//pseudocode !
public class YourWIS extends WakefulIntentService { // you must add a cstor !

    @Override
    doWakefulWork() {
      acquireWifiLock();
      enableScanReceiver();
      startScan();
      serviceLatch.wait();
      releaseWifiLock();
    }
}

// in YourScanReceiver
onReceive() {
  if(action.equals(SCAN_RESULTS) {
   // do something that does not take time or start another/the same
   // WakefulIntentService
   serviceLatch.notify();
  }
}

最初に WakefulIntentService を試してください (アラーム レシーバーから AsyncTask を起動すると思います)。スキャン レシーバーは、スキャン結果を受信するために登録されたレシーバーです (WifiManager のドキュメントを参照してください - スリープの問題については、リスナーよりもレシーバーを優先してください)。

1 : これはワーキング クラスです - 私は 2 番目のウェイクフル インテント サービスを使用してウェイク ロックを維持するだけです - ラッチを使用するようにリファクタリングする必要がありますが、このアプローチは少なくとも機能します (2 番目のサービス (ゲートキーパー) をモニターで待機させます)ゲートキーパー内にウェイクロックを持っています.ゲートキーパーはCPUロックも保持しているので、すべて問題ありません(そして醜いです)

于 2013-10-15T14:50:02.547 に答える