Androidバックグラウンドのタイミングタスクの実現と改善

1499 ワード

  • CounDownTimer CounDownTimer(long millisInFuture,long countDownInterval)を浅く分析しますが、不適切な使用をすると、ポインタが異常になることがよくありますか?

  • ソースコード解析により,CounDownTimerの内部実装はHandlerメカニズムを採用し,sendMessageDelayed遅延により1つのメッセージをプライマリスレッドlooperに送信し,その後,自身で受信した後に残りの時間を判断し,関連コールバックを発行し,再びメッセージを送信する方式である.ActivityまたはFragmentが回収されたときにCounDownTimerを呼び出さないcancel()メソッドが存在するため、CoundownTimerメソッドでは実行が継続され、onTick()がコールバックされ、このメソッドでFragmentを使用する変数がnullである場合、空のポインタが表示されます.
    Androidのタイミングタスクには、JavaのTimerクラスとAndroidのAlarmメカニズムの2つの実装方法があります.
    この2つの方法は多くの場合似ていますが、Timerはバックグラウンドで長期的に実行する必要があるタイミングタスクには向いていません.実際には、携帯電話の省電力のために、どの携帯電話にも休眠戦略があります.携帯電話が長時間操作されていない場合、スリープ状態に入ると、Timerのタイミングタスクが正常に動作しない可能性があります.Alarmメカニズムでは、CPUを起動する機能があるため、このようなことは起こりませんが、CPUを起動することと画面を起動することは概念ではありません.
    Alarm実装
    まずContextのgetSystemService()メソッドでAlarmManagerインスタンスを取得します.ここではALARM_への転送が必要です.SERVICE
    次に、AlaramManagerのset()メソッドを使用して、5 s後にタスクを設定するなど、タイミングタスクを設定できます.
    ``
    long trrigerAtTime = SystemClock.elapsedRealtime()+5*1000;
    manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,trrigerAtTime,pi);
    

    ここでset()メソッドの第1パラメータはAlarmManagerの動作タイプを指定し、4種類あり、それぞれELALSED_WAKE,ELAPSED_WAKEUP\RTC\RTC_WAKEUP.そのうちELAPSED_WAKEは、システムの起動時間からタスクトリガーイベントをカウントしますが、CPUは起動しません.ELAPSED_WAKEUPは、CPUを起動し、システムの起動時間から計算することを示します.RTCは、タスクのトリガ時間が1970.1.1日0時から計算され、CPUが起動しないことを示す.RTC_WAKEUP、CPUを起動する.3番目のパラメータはPendingIntentであり、ここでは一般的にgetBrodcast()を呼び出してブロードキャストを実行できるPendingIntentを取得し、タスクがトリガーされるとブロードキャストのonReceive()メソッドが実行される.