Android Serviceタイミングタスク

4499 ワード

Androidのタイミングタスクには一般的に2つの実現方法があります
(ここではAndroidのAlarmメカニズムを使用しています)
1.Java APIが提供するTimerクラス
バックグラウンドで長期にわたって実行する必要があるタイミングタスクには適していません.バッテリーを長持ちさせるためには、どの携帯電話にもスリープ戦略があり、Android携帯電話は長時間操作せずにCPUを自動的にスリープ状態にし、Timerのタイミングタスクが正常に動作しない可能性があることはよく知られています.
2.AndroidのAlarmメカニズム
Alarmメカニズムは、CPUを起動させる機能を備えています.つまり、タイミングタスクを実行するたびにCPUが正常に動作することを保証します.
 
Alarmメカニズムの使用方法
Alarmメカニズム:主にAlarmManagerクラスによって実現される.
このクラスはNotificationManagerと少し似ていますが、ContextのgetSystemService()メソッドを呼び出すことでインスタンスを取得します.ただし、ここで入力するパラメータはContextです.ALARM_SERVICE.
したがって、AlarmManagerのインスタンスを取得するには、次のように書くことができます.
AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

タイミングタスク設定:(例えばタスク8時間実行設定)
int anHour = 8 * 60 * 60 * 1000; //   8      
long triggerAtTime = SystemClock.elapsedRealtime() + anHour;
manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtTime, PendingIntent);

set()メソッドで入力する必要がある3つのパラメータは少し複雑ですが、詳しく分析してみましょう.
最初のパラメータは、AlarmManagerの作業タイプを指定する整数パラメータです.オプションは4つあります.
------ELAPSED_REALTIME ELAPSED_REALTIMEは、タイミングタスクのトリガ時間をシステムの起動からカウントするが、CPUを起動しないことを示している
------ELAPSED_REALTIME_WAKEUP ELAPSED_REALTIME_WAKEUPも同様にタイミングタスクのトリガ時間をシステムの起動から計算するが、CPUを起動する
------RTC RTCは、タイミングタスクのトリガ時間を1970年1月1日0時からとしているが、CPUを起動させることはない
------RTC_WAKEUP RTC_WAKEUPも同様にタイミングタスクのトリガー時間を1970年1月1日0時からとするが、CPUが起動する
2番目のパラメータは、タイミングタスクがトリガーされる時間です.ミリ秒単位です.
最初のパラメータがELAPSED_を使用している場合REALTIMEまたはELAPSED_REALTIME_WAKEUPでは、ここで起動から現在までの時間に加えて実行が遅延した時間が入力されます.
最初のパラメータがRTCまたはRTC_を使用している場合WAKEUPは、ここで1970年1月1日0時現在までの時間に加えて実行遅延時間を伝えます.
3番目のパラメータPendingIntentは、一般にgetBroadcast()メソッドを呼び出して、ブロードキャストを実行できるPendingIntentを取得します.これにより、タイミングタスクがトリガーされると、ブロードキャスト受信機のonReceive()メソッドが実行される.
次に、バックグラウンドで長期にわたってタイミングタスクを実行できるサービスを作成します.
public class AutoUpdateService extends Service {

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
    new Thread(new Runnable() {
    @Override
    public void run() {
    Log.d("AutoUpdateService ", "executed at " + new Date().toString());
    }
    }).start();
        AlarmManager manager = (AlarmManager) getSystemService(ALARM_SERVICE);
        int anHour = 8 * 60 * 60 * 1000; //   8      
        long triggerAtTime = SystemClock.elapsedRealtime() + anHour;
        Intent i = new Intent(this, AutoUpdateService.class);
        PendingIntent pi = PendingIntent.getBroadcast(this, 0, i, 0);
        manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtTime, pi);
        return super.onStartCommand(intent, flags, startId);
    }
}

私たちはonStartCommand()メソッドでサブスレッドを開き、サブスレッドで具体的な論理操作を実行することができます.ここでは簡単にするために、現在の時間を印刷しただけです.
スレッド作成後のコードは、先ほど説明したAlarmメカニズムの使い方です.まず、AlarmManagerのインスタンスを取得し、タスクのトリガ時間を1時間と定義した後、PendingIntentを使用してタイミングタスクを処理するブロードキャスト受信機をAlarmReceiverに指定し、最後にset()メソッドを呼び出して設定を完了します.
明らかに、AlarmReceiverは現在存在しないので、次の手順では、BroadcastReceiverクラスを新規作成し、BroadcastReceiverから継承します.コードは次のとおりです.
public class AlarmReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
Intent i = new Intent(context, AutoUpdateService.class);
context.startService(i);
}
}

onReceive()メソッドのコードは非常に簡単で、Intentオブジェクトを構築し、AutoUpdateServiceというサービスを起動します.では、ここではなぜこのように書くのでしょうか.実はいつの間にか、バックグラウンドで長期にわたって稼働しているサービスが完了しています.AutoUpdateServiceを起動すると、onStartCommand()メソッドにタイミングタスクが設定されるため、1時間後にAlarmReceiverのonReceive()メソッドが実行され、ここでAutoUpdateServiceを再起動することで、AutoUpdateServiceが8時間おきに起動できるように永続的なサイクルが形成されます.バックグラウンドで長期にわたって稼働しているサービスも自然に完了します.
次のタスクも明確です.プログラムを開くときにAutoUpdateServiceを起動する必要があります.その後、AutoUpdateServiceはずっと実行できます.次のように、MainActivityのコードを変更します.
public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = new Intent(this, AutoUpdateService.class);
startService(intent);
}
}

最後に忘れないでください.私たちが使っているサービスと放送受信機はAndroid Manifestにあります.xmlに登録してください.コードは次のとおりです.