電話がスタンバイ状態になると、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 を解放します)。