1

15分ごとに実行されるAndroidサービスを書いています。

サーバーにリクエストを送信し、サーバーの応答が「ok」のような場合、サービスはコードを実行するため、インターネット接続が必要です。

電話機がスタンバイ状態でない場合(画面がオンの場合)はすべて正常に機能しますが、電話機がスタンバイモードの場合、接続は利用できず、サービスは正しく機能しません。サービスが利用可能な接続を待機してから、サーバーにリクエストを送信するようにします。

たとえば、電話がスタンバイモードになっていて、15分後にサービスが開始され、サーバーに要求を送信しようとしますが、接続は利用できません。この場合、サービスが接続が利用可能になるのを待ってから、サーバーにリクエストを送信する必要があります。

誰かがそれが何をすべきかを提案できますか?

わかりましたが、私はアラームマネージャーと放送受信機を使用していません。例を投稿してください。しかし、電話がスタンバイ状態の場合、アラームマネージャーとブロードキャストレシーバーは機能しますか?書き込みエラー書き込み15分ではなく2時間ごとにサービスを実行する必要があります。

4

2 に答える 2

2

電話がスタンバイ状態になると、CPU の動作が停止し、すべてのプロセスが実行を停止します。これを回避するには、PowerManager を使用して CPU をロックし、電話機がスタンバイ状態になっても CPU が確実にオンのままになるようにします。

m_wakeLock = m_powerManager.newWakeLock(
                PowerManager.PARTIAL_WAKE_LOCK, "My Tag");

m_wakeLock.acquire();
... cpu is assured to be on during this time ...
m_wakeLock.release();

ただし、スタンバイ状態であっても 15 分ごとにサービスを起動する必要があるため、これはバッテリーの消耗を引き起こす可能性があります。これを回避するには、AlarmManager を使用して 15 分ごとにイベントをスケジュールし、適切な BroadcastReceiver を起動します。BroadcastReceiver では、インテント (インテント内のパラメーターを使用してサービスを起動する) を介してサービスにメッセージを送信し、CPU を取得し、作業を行い、CPU を解放するだけです。

- - - - - - - - - - - - - アップデート - - - - - - - - - - - - --

まず、マニフェストで BroadcastReceiver を宣言します。

<receiver
        android:name="StartUpReceiver"
        <intent-filter>
             <action android:name="my.Package.MyEvent" />
             <category android:name="android.intent.category.HOME" />
         </intent-filter>
</receiver>

BroadcastReceiver は次のようになります。

public class StartUpReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Intent serviceIntent = new Intent();
        serviceIntent.setAction("my.Package.MyService");
        context.startService(serviceIntent);

    }

}

このように、アクション「my.Package.MyEvent」を持つインテントが、たとえば sendBroadcast(Intent) メソッド ( CHECK HERE )を使用して起動されるたびに、ブロードキャスト レシーバー (つまり、BroadcastReceiver クラスを拡張するクラスCHECK HERE ) ) はその onReceive() メソッドを実行します。私のコードでは、適切なアクション (「my.Package.MyService」) でインテントを作成し、MyService を起動するだけです。

AlarmManager クラスは、 sendBroadcast() メソッドと同様に、将来起動されるインテントをスケジュールする方法を提供するだけです (ここをチェック))。AlarmManager に関連付けられた onReceive() メソッドのすべての実行中、CPU はオンのままになります。その後、CPU をロックし、サービスを起動する必要があります。サービスは確実に実行されます。その間、onReceive() メソッドは停止しますが、サービスは確実に実行されます。必要な唯一のことは、AlarmManager のメイン ページに記載されているように、サービスが実行された後に CPU ロックを解放するために、サービスが AlarmManager と通信できるようにする方法に関する回避策を見つけることです。つまり、必要な情報を保存するために外部オブジェクトを使用して、サービスをブロードキャスト レシーバーと同期するだけです (この場合、サービスの終了時に CPU がロックされている場合は、CPU を解放します)。

于 2012-06-05T10:45:52.717 に答える
2

サービスを実行する前に、接続が利用可能かどうかを確認してください。以下のコード スニペットは、有効なネットワーク接続があるかどうかを識別するのに役立ちます。

    ConnectivityManager connectivity = (ConnectivityManager) context
            .getSystemService(Context.CONNECTIVITY_SERVICE);
    if (connectivity != null) {
        NetworkInfo[] info = connectivity.getAllNetworkInfo();
        if (info != null) {
            for (NetworkInfo networkInfo : info) {
                if (networkInfo.getState() == NetworkInfo.State.CONNECTED) {
                    return true;
                }
            }
        }
    }
    return false;

接続がない場合は、サービス コールを一時停止し、約 30 秒後にネットワーク接続をポーリングします。

于 2012-06-05T10:45:15.770 に答える