SSブログ

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”

image

⇒ マニフェストファイルの修正

AndroidManifest.xml の編集

”ServiceExample/AndroidManifest.xml”

image

⇒ レイアウトとアクティビティの作成

main.xml の編集

”ServiceExample/res/layout/main.xml”

image

ServiceExampleActivity.java の編集

”ServiceExample/src/jp/andsys/android/serviceexample/ServiceExampleActivity.java”

image

⇒ 実行

「インテントでサービスを開始」ボタンを押します。

image

サービスが開始されました。

image

5秒後にサービスが終了しました。

image

 

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”

image

⇒ マニフェストファイルの修正

AndroidManifest.xml の編集

”BindServiceExample/AndroidManifest.xml”

image

⇒ レイアウトとアクティビティの作成

main.xml の編集

”BindServiceExample/res/layout/main.xml”

image

BindServiceExampleActivity.java の編集

”BindServiceExample/src/jp/andsys/android/bindserviceexample/BindServiceExampleActivity.java”

image

image

⇒ 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オブジェクト

⇒ 実行

起動画面から「サービスにバインドする」ボタンを押すとバインドされました。

image

「サービスにメッセージを渡す(Android)」ボタンを押すと、メッセージが送信され「Hello Android!」と表示されます。

image

「サービスにメッセージを渡す(アンドロイド)」ボタンを押すと、「Hello! アンドロイド!」と表示されます。

image

「サービスからアンバインドする」ボタンを押してからはメッセージは表示されなくなります。

 

4.双方向メッセージに対応する

アクティビティからサービスにメッセージを送った後に応答を返すようにする。

◎ サンプル作成

BindServiceExampleをサービスとアクティビティの双方向通信に対応させる。

BindServiceExampleActivity.java の編集

”BindServiceExample/src/jp/andsys/android/bindserviceexample/BindServiceExampleActivity.java”

image

image

image

⇒ サービスクラスの変更

BindService.java の編集

”BindServiceExample/src/jp/andsys/android/bindserviceexample/BindService.java”

image

⇒ 実行

実装方法が変わっただけで、アプリケーションの動作は見た目かわりなく動作します。

 

5.サービスとライフサイクル

サービスのライフサイクルコールバックメソッド

メソッド 解説
void onCreate サービス生成時
int onStartCommand startServiceメソッドによるサービス開始時
IBinder onBind bindServiceメソッドによるサービス開始時
void on Rebind 再バインド時
boolean onUnbind バインド解除時
void onDestroy サービス破棄時

以上で「サービス」を終了します。

 

本記事は以下の参考書を元にしています。


WordPress Plugin [TinyMCE Advanced] [WordPress]

投稿画面のビジュアルエディターを強化するプラグイン

 

インストール

WordPress管理画面のプラグインから検索すると見つかります。

image

 

実行

投稿画面で利用できる”HTMLタグ”ボタンが増えました。

インストール前

image

インストール後

image

使えるタグが増えました。

ここに表示させるタグは「設定」、「TynyMCE Advanced」から編集できます。

image

 

参考資料

参考サイト


この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。