前に書いた「SCREEN_ONとかSCREEN_OFFとか
」の続きです。




追加補足で書いた、タスクキラーなどの対策ですが


完璧ではないけど対策にはなるかもな話です。




方法として先に言うと、


レシーバーセット用のサービスを用意し


onCreate内でレシーブ登録をする。




これだけです。




サービスのonCreateは生きている限りは一度しか呼ばれないため


そこでレシーバー登録処理を行っておけば重複でレシーバー登録をしません。


んで定期的にそのサービスを呼ぶ処理をしてあげて、死んでればonCreateでまた復活という流れです。


ウィジェットの処理なんかをサービスにしている場合はそのサービス内でやってもいいかと思います。




あとはアプリだったりウィジェットだったりが完全に捨てられる時なんかや


正しくサービスがonDestroyされるときにはunregisterReceiverで


登録したレシーブを破棄してやる必要はある感じ。




まぁ流れをあらわすとこんな感じ?




#初回


onCreate(レシーバー登録) -> onStartCommand -> onDestroy(レシーバー削除) -> 定期処理でonCreateから始める




#初回以降


onStartCommand -> onDestroy(レシーバー削除) -> 定期処理で初回に戻る




#タスクキラー


onStartCommand -> キルされる(レシーバー削除) -> 定期処理で初回に戻る




#ウィジェット捨てられる(ACTION_APPWIDGET_DISABLED)


onStartCommand -> intent拾ってstopSelf() -> onDestroy(レシーブ削除)




あとは細かい所で言うと


例えばACTION_TIME_TICKなんかやってる場合は別でレシーバー登録しておいて




SCREEN_ONされた -> ACTION_TIME_TICKのレシーバー登録


SCREEN_OFFされた -> ACTION_TIME_TICKのレシーバー削除




とか必要かと。


TIME_TICKも動的にレシーバー登録せないけないので


タスクキラーされた場合は動かなくなる。


なので必要な処理は上記のSCREEN_ON、OFFでの解除くらいかなと思ってます。


間違ってたらすいません。。




定期的にサービスを起動してあげる方法は


android.intent.action.DATE_CHANGEDで毎度日付が変わったら


レシーブして登録しなおしたりとか


別途、AlarmManagerをしこんでおいたりと色々あると思います。




Broadcast Intentについてはこちらをみてください。


http://developer.android.com/reference/android/content/Intent.html




なお、以下のBroadcast Intentは動的な登録が必要なようです。


なのでタスクキラーで死ぬ可能性があります。


他にもあるかも。。。




Intent.ACTION_TIME_TICK -> 1分経過した

Intent.ACTION_SCREEN_ON -> スクリーンがONになった

Intent.ACTION_SCREEN_OFF -> スクリーンがOFFになった

Intent.ACTION_CONFIGURATION_CHANGED -> システムの設定が変更

Intent.ACTION_CLOSE_SYSTEM_DIALOGS -> システムのダイアログを閉じた

Intent.ACTION_BATTERY_CHANGED -> バッテリーの状態が変化

Intent.ACTION_HEADSET_PLUG -> ヘッドフォンの抜き差し




一応サンプルアプリも用意してみました。


簡単な時計ウィジェットです。




>ここ