Androidプログラミングの基礎[4] サービス [Android]
今回のテーマは「サービス」です。
第4回: サービスによる常駐アプリケーション
サービスとは時間のかかるような処理を行うための仕組み。
1.サービスとは
サービスを使うと、ユーザーが異なるアプリケーションを実行していてもバックグラウンドで作業を行うことができる。いわゆる「常駐型プログラム」を作成できる。
◎ サービスの作成方法
サービスは、Serviceクラス(android.app.Service)を継承して、次のようなコールバックメソッドを必要に応じてオーバーライドしながら処理を記述する。
Serviceクラスの主なメソッド
メソッド | 解説 |
void onCreate | サービスが最初に生成されたときに呼ばれる |
int onStartCommand | startServiceメソッドによるサービス開始要求を受けたときに呼ばれる |
IBinder onBind | bindServiceメソッドによるサービス開始要求を受けたときに呼ばれる |
void onRebind | すべての接続が解除された後に、新しいクライアントからサービス開始要求を受けたときに呼ばれる |
boolean onUnbind | すべてのクライアントがサービスから接続を解除したときに呼ばれる |
void onDestroy | サービスが破棄されるときに呼ばれる |
◎ IntentServiceクラスによるサービスの作成方法
IntentServiceクラス(android.app.IntentSefrvice)は、煩雑な別スレッド作成処理を行ってくれるサービス用のクラス。
IntentServiceクラスには、void onCreate, int onStartCommand, IBind onBind, void onDestrohy, void onHandleIntent メソッド等がある。
複雑なスレッドを生成する場合、またサービスとの双方向通信を必要としない場合には、このクラスを継承してサービスを作ればよい。
◎ サービスの開始方法
⇒ startServiceを使ったサービス
アクティビティによって開始されるサービス。サービスが開始されると、stopSelfメソッドで自信を停止するか、アクティビティのstopServiceメソッドが実行されるまで停止しない。
⇒ bindServiceを使ったサービス
アクティビティによってバインドされたサービス。
2.startServiceを使ったサービス
◎ サンプル作成
アクティビティからインテントで渡された秒数だけ処理を停止するだけの単純なサービス。
プロジェクト設定
・新規Androidアプリケーション
アプリケーション名 | ServiceExample |
プロジェクト名 | ServiceExample |
パッケージ名 | jp.andsys.android.serviceexample |
最小必須 SDK | API 8: Android 2.2 (Froyo) |
ターゲット SDK | API 18 |
次でコンパイル | API 10: Android 2.3.3 (Gingerbread) |
テーマ | None |
・プロジェクトの構成
ディフォルトのまま
・アイコンの属性
ディフォルトのまま
・アクティビティーの作成
Blank Activity
・Blank Activity
アクティビティ名 | ServiceExampleActivity |
レイアウト名 | main |
ナビゲーション・タイプ | None |
⇒ サービスクラスの作成
IntentServiceクラスを継承したクラスを作成します。
設定項目 | 入力値 / 選択項目 |
パッケージ | jp.andsys.android.serviceexample |
名前 | SampleService |
スーパークラス | android.app.IntentService |
インターフェイス | (なし) |
SampleService.java の編集
”ServiceExample/src/jp/andsys/android/serviceexample/SampleService.java”
⇒ マニフェストファイルの修正
AndroidManifest.xml の編集
”ServiceExample/AndroidManifest.xml”
⇒ レイアウトとアクティビティの作成
main.xml の編集
”ServiceExample/res/layout/main.xml”
ServiceExampleActivity.java の編集
”ServiceExample/src/jp/andsys/android/serviceexample/ServiceExampleActivity.java”
⇒ 実行
「インテントでサービスを開始」ボタンを押します。
サービスが開始されました。
5秒後にサービスが終了しました。
3.bindServiceを使ったサービス
後からサービスに対する操作を行うことが容易で、アクティビティをサービスを紐付け(バインド)することで、データのやり取りが可能となる。
◎ HandlerとMessenger
サービスとの通信を行うために、MessengerクラスとHandlerクラスを使う。
⇒ Handlerクラス
メッセージの遅延処理をしたり、別スレッドへ処理を依頼したりします。
⇒ Messengerクラス
メッセージを送信するために使用するHandlerへの参照です。
⇒ Messageクラス
Handlerに送信することのできる任意のデータと、その伝達事項を含んだメッセージを定義する。
◎ サービスへのバインド
サービスに接続して通信を行う場合は、サービスの状態を監視するためのServiceConnectionインターフェースを利用する。
◎ サンプル作成
アクティビティからサービスへバインドするサンプルです。
プロジェクト設定
・新規Androidアプリケーション
アプリケーション名 | BindServiceExample |
プロジェクト名 | BindServiceExample |
パッケージ名 | jp.andsys.android.bindserviceexample |
最小必須 SDK | API 8: Android 2.2 (Froyo) |
ターゲット SDK | API 18 |
次でコンパイル | API 10: Android 2.3.3 (Gingerbread) |
テーマ | None |
・プロジェクトの構成
ディフォルトのまま
・アイコンの属性
ディフォルトのまま
・アクティビティーの作成
Blank Activity
・Blank Activity
アクティビティ名 | BindServiceExampleActivity |
レイアウト名 | main |
ナビゲーション・タイプ | None |
⇒ サービスクラスの作成
Serviceクラスを継承したクラスを作成します。
設定項目 | 入力値 / 選択項目 |
パッケージ | jp.andsys.android.bindserviceexample |
名前 | BindService |
スーパークラス | android.app.Service |
インターフェイス | (なし) |
BindService.java の編集
”ServiceExample/src/jp/andsys/android/bindserviceexample/BindService.java”
⇒ マニフェストファイルの修正
AndroidManifest.xml の編集
”BindServiceExample/AndroidManifest.xml”
⇒ レイアウトとアクティビティの作成
main.xml の編集
”BindServiceExample/res/layout/main.xml”
BindServiceExampleActivity.java の編集
”BindServiceExample/src/jp/andsys/android/bindserviceexample/BindServiceExampleActivity.java”
⇒ ServiceConnectionの実装
onServiceConnected メソッド
機能 | サービスとの接続が完了したときに呼ばれるコールバックメソッド |
書式 | void onServiceConnected(ComponentName name, IBinder service) |
引数 | name : サービスクラスの識別子が渡される service : サービスから受け取ったIBinderオブジェクトが渡される |
onServiceDisconnected メソッド
機能 | サービスとの接続が予期せず切断されたときに呼ばれるコールバックメソッド |
書式 | void onServiceDisconnected(ComponentName name) |
引数 | name : 切断されたサービスクラスの識別子が渡される |
⇒ サービスへのバインド
サービスを起動するには、ServiceConnectionの実装を引数にしてbindServiceを呼び出す。
bindService メソッド
機能 | サービスを開始する |
書式 | boolean bindService(Intent service, ServiceConnection conn, int flags) |
引数 | service : 開始するサービスのインテント conn : 接続に使用するServiceConnectionオブジェクト flags : バインドのオプション |
◎ サービスへメッセージを送信する
メッセージオブジェクトを作成する場合には、コンストラクタからではなくobtainめどっどを使う。
obtain メソッド
機能 | Messageオブジェクトを作成する |
書式 | Message obtain(Handler h, int what, int arg1, int arg2, Object obj) |
引数 | h : Messageオブジェクトを送信するHandlerオブジェクト what : 受信側がメッセージを識別するためのユーザー定義のコードを指定 arg1, arg2 : 追加のメッセージ obj : サービスへ渡す任意のオブジェクト |
メッセージの送信はMessangerのsendメソッドを使用する。
send メソッド
機能 | このMessangerが指すHandlerへメッセージを送信する |
書式 | void send(Message message) |
引数 | message : 送信するメッセージ |
⇒ サービスからのアンバインド
サービスからアンバインドするにはunbindServiceメソッドを呼びます。
unbindService メソッド
機能 | サービスをアンバインドする |
書式 | void unbindService(ServiceConnection conn) |
引数 | conn : 切り離すサービスのServiceConnectionオブジェクト |
⇒ 実行
起動画面から「サービスにバインドする」ボタンを押すとバインドされました。
「サービスにメッセージを渡す(Android)」ボタンを押すと、メッセージが送信され「Hello Android!」と表示されます。
「サービスにメッセージを渡す(アンドロイド)」ボタンを押すと、「Hello! アンドロイド!」と表示されます。
「サービスからアンバインドする」ボタンを押してからはメッセージは表示されなくなります。
4.双方向メッセージに対応する
アクティビティからサービスにメッセージを送った後に応答を返すようにする。
◎ サンプル作成
BindServiceExampleをサービスとアクティビティの双方向通信に対応させる。
BindServiceExampleActivity.java の編集
”BindServiceExample/src/jp/andsys/android/bindserviceexample/BindServiceExampleActivity.java”
⇒ サービスクラスの変更
BindService.java の編集
”BindServiceExample/src/jp/andsys/android/bindserviceexample/BindService.java”
⇒ 実行
実装方法が変わっただけで、アプリケーションの動作は見た目かわりなく動作します。
5.サービスとライフサイクル
サービスのライフサイクルコールバックメソッド
メソッド | 解説 |
void onCreate | サービス生成時 |
int onStartCommand | startServiceメソッドによるサービス開始時 |
IBinder onBind | bindServiceメソッドによるサービス開始時 |
void on Rebind | 再バインド時 |
boolean onUnbind | バインド解除時 |
void onDestroy | サービス破棄時 |
以上で「サービス」を終了します。
本記事は以下の参考書を元にしています。
WordPress Plugin [TinyMCE Advanced] [WordPress]
投稿画面のビジュアルエディターを強化するプラグイン
インストール
WordPress管理画面のプラグインから検索すると見つかります。
実行
投稿画面で利用できる”HTMLタグ”ボタンが増えました。
インストール前
インストール後
使えるタグが増えました。
ここに表示させるタグは「設定」、「TynyMCE Advanced」から編集できます。
参考資料
参考サイト