2013年8月7日水曜日

【Android】Serviceを設定したら終わらせよう

AndroidのWidgetを作る場合には
クリックイベントを処理したり,
はたまた時計を作ろうとAlarmManagerをセットしたり
Activityを作るのと違ってServiceを多用することになると思う.


こんな感じでサービスを登録するが,
サービスはアプリ(Activity/Widget)を終了させても終わってくれない.
再起動するか,
ユーザが手動で【設定>アプリ>実行中】から停止するかしない限り
サービスが残りっぱなしになる.

時計ウィジェットを作ろうとAlarmManagerを再帰呼び出しさせた日には
サービスを手動で終了させても次のアラーム時にサービスが勝手に復帰する.
こうなったらアプリをアンインストールするか
再起動するかしないと消えない.

なので,アプリを終了するときにサービスを停止させよう.
ウィジェットならばウィジェットがHOME配置から消されたら終了させよう.

ウィジェットの場合,HOME配置から消されるとonDeletedイベントが発生する.
なので,onDeletedをオーバーライドして,
上記の例に倣うと


サービスを登録したときと同じ方法でIntentを宣言し,
stopServiceを呼び出す.
これでサービスの停止が完了である.

なお,サービス登録時にIntentを作成しているからといって
Intentをクラスフィールドにして停止のときもそのまま再利用~
などと考えてもIntentの中身はnullになっているため,不可能である.
クラスフィールドにしてもいいが,
再度Intentのコンストラクタを呼ばないといけない.

開始と停止とで(作り方は同じだとしても)違うオブジェクトを作って
それで本当に停止できるのかとちょっとオブジェクト指向の考えからいくと
不安になるかもだが,これで停止ができるのである.

次に,時計ウィジェットなどでアラームを設定した場合にも
作成時と同じ方法で
Intent/PendingIntent/AlarmManagerを作成し,
キャンセルしてやることで解除される.
すなわち,


このようにセットしたのなら


このようにキャンセルすることになる.
サービスの停止の前にアラームの解除をする必要がある
IntentのsetActionも解除時に必要.
このsetActionが足りなくても解除に失敗する.

何度「まだいる!」と思わされたことか.

0 件のコメント:

コメントを投稿