atwiki-logo
  • 新規作成
    • 新規ページ作成
    • 新規ページ作成(その他)
      • このページをコピーして新規ページ作成
      • このウィキ内の別ページをコピーして新規ページ作成
      • このページの子ページを作成
    • 新規ウィキ作成
  • 編集
    • ページ編集
    • ページ編集(簡易版)
    • ページ名変更
    • メニュー非表示でページ編集
    • ページの閲覧/編集権限変更
    • ページの編集モード変更
    • このページにファイルをアップロード
    • メニューを編集
    • 右メニューを編集
  • バージョン管理
    • 最新版変更点(差分)
    • 編集履歴(バックアップ)
    • アップロードファイル履歴
    • ページ操作履歴
  • ページ一覧
    • ページ一覧
    • このウィキのタグ一覧
    • このウィキのタグ(更新順)
    • おまかせページ移動
  • RSS
    • このウィキの更新情報RSS
    • このウィキ新着ページRSS
  • ヘルプ
    • ご利用ガイド
    • Wiki初心者向けガイド(基本操作)
    • このウィキの管理者に連絡
    • 運営会社に連絡(不具合、障害など)
ページ検索 メニュー
Androidアプリ開発ノート
  • ウィキ募集バナー
  • 目安箱バナー
  • 操作ガイド
  • 新規作成
  • 編集する
  • 全ページ一覧
  • 登録/ログイン
ページ一覧
Androidアプリ開発ノート
  • ウィキ募集バナー
  • 目安箱バナー
  • 操作ガイド
  • 新規作成
  • 編集する
  • 全ページ一覧
  • 登録/ログイン
ページ一覧
Androidアプリ開発ノート
ページ検索 メニュー
  • 新規作成
  • 編集する
  • 登録/ログイン
  • 管理メニュー
管理メニュー
  • 新規作成
    • 新規ページ作成
    • 新規ページ作成(その他)
      • このページをコピーして新規ページ作成
      • このウィキ内の別ページをコピーして新規ページ作成
      • このページの子ページを作成
    • 新規ウィキ作成
  • 編集
    • ページ編集
    • ページ編集(簡易版)
    • ページ名変更
    • メニュー非表示でページ編集
    • ページの閲覧/編集権限変更
    • ページの編集モード変更
    • このページにファイルをアップロード
    • メニューを編集
    • 右メニューを編集
  • バージョン管理
    • 最新版変更点(差分)
    • 編集履歴(バックアップ)
    • アップロードファイル履歴
    • ページ操作履歴
  • ページ一覧
    • このウィキの全ページ一覧
    • このウィキのタグ一覧
    • このウィキのタグ一覧(更新順)
    • このページの全コメント一覧
    • このウィキの全コメント一覧
    • おまかせページ移動
  • RSS
    • このwikiの更新情報RSS
    • このwikiの新着ページRSS
  • ヘルプ
    • ご利用ガイド
    • Wiki初心者向けガイド(基本操作)
    • このウィキの管理者に連絡
    • 運営会社に連絡する(不具合、障害など)
  • atwiki
  • Androidアプリ開発ノート
  • ServiceのBind

Androidアプリ開発ノート

ServiceのBind

最終更新:2012年10月13日 09:08

匿名ユーザー

- view
だれでも歓迎! 編集

ServiceのBind

ServiceはBindすることで、特定のActivityやサービスに依存させることが出来る。
BindしたサービスはUnbindすると、自動的に破棄される。

ActivityとServiceの間でやりとりするにはBindする必要があるが、
Unbindすると自動で破棄されてしまうため、BackボタンでHomeに戻るとServiceが意図せず終了してしまい困った。
(HomeボタンならOKなのだが、BackボタンではNGというのはいただけない)

Serviceのライフサイクル

Serviceには2つの異なるライフサイクルがある。

1つは、Startに始まり、Stopに終わるパターン。Stopは外からIntentによりStopする場合と、Service自身がStopSelfする場合と、2つの方法がある。
もう1つは、Bindに始まり、Unbindに終わるパターン。

説明すると長くなるので、詳しくは本家をどうぞ
http://developer.android.com/guide/components/services.html


ServiceのStartとBindの合せ技

Serviceのライフサイクルが複雑になるので推奨はしない。

ServiceをStartさせることで、BindしUnbindしてもServiceが破棄されないように小細工できる。
ただしStartさせたサービスは、外からStopするか、Service自身にStopSelfさせる必要がある。
そのためUnbindされると、StopSelfのフラグをONにし、Serviceが特定の状態になったらStopSelfが実行されるようにした。
さらにRebindされると、StopSelfのフラグをOFFにする。


実際にやってみたが、動作が不安定でリリースするアプリには載せられない。
その後、いろいろ試してみて、安定して使える動作になった。
ポイントは
  • ライフサイクルを出来る限り短く。
  • 変化する状態は少なく
  • bindはごく短時間で終わらせる。Connectedが呼ばれたら、その中でUnbindしてしまう作りにした。

サンプル


Activityの定義、抜粋。
public class MainActivity extends Activity
implements MyService.Listner {

onCreateでstartServiceとbindServiceをコール。startServiceを呼ばずにbindService単独でAUTO_CREATEを付けてServiceを起動させるとと、Unbindで死んでしまう。
public void onCreate(Bundle bundle) {
	super.onCreate(bundle);
	Intent intent = new Intent(this, MyService.class);
	intent.putExtra(MyService.KEY_COMMAND, MySerVice.COMMAND.HELLO);
	startService(intent);
    		bindService(intent, mMyServiceConnection , 0);
}

リスナーを渡したらすぐさまUnbind。
ServiceConnection mMyServiceConnection = new ServiceConnection() {
	public void onServiceConnected(ComponentName name, IBinder service) {
		Log.v(TAG, "Service connected");
		TimerService timerService = ((MyService.MyServiceBinder)service).getTimerService();
		timerService.setListner(MainActivity.this);
		unbindService(mTimerServiceConnection);
	}
	public void onServiceDisconnected(ComponentName name) {
		Log.v(TAG, "Service disconnected");
	}
};

stopServiceではなくstartServiceでServiceを終了させる。Serviceの状態によっては、すぐに終了せず、時間を置いてから自滅させたかったのでこうした。
public void onDestroy() {
	super.onDestroy();
	Intent intent = new Intent(this, TimerService.class);
	intent.putExtra(TimerService.KEY_COMMAND, TimerService.COMMANDS.BYE);
	startService(intent);
}


Serviceの定義、抜粋。
public interface TimerListner {
	void onServiceStarted(CharSequence message);
}
onStartCommandでExtraを取りだし、Activityでセットされた値に応じて処理を変える
@Override
public int onStartCommand(Intent intent, int flags, int id) {
	Log.v(TAG, "onStartCommand");
	COMMANDS command = (COMMANDS)intent.getSerializableExtra(KEY_COMMAND);
	switch(command) {
	case BYE:
		killTimer = new Timer();
		...
		...
			public void run() {
				stopSelf();
			}
		...
		...
		break;
	default:
		break;
	}
	if (mListner != null)
		mListner.onServiceStarted("hello");
	return START_STICKY;
}
public void onDestory() {
	if (killerTimer != null)
		killerTimer.cancel();
}
UnbindではTRUEを返す。そうしないと再Bind時に、RebindもBindも呼ばれないことがある。APIレベルに依るのか?
@Override
public IBinder onBind(Intent intent) {
	Log.v(TAG, "onBind");
	return mBinder;
}
@Override
public void onRebind(Intent intent) {
	Log.v(TAG, "onRebind");
	return;
}
@Override
public boolean onUnbind(Intent intent) {
	Log.v(TAG, "onUnbind");
	return true;
}
vs
「ServiceのBind」をウィキ内検索
LINE
シェア
Tweet
Androidアプリ開発ノート
記事メニュー

メニュー


各種手順
  • トップページ
  • 開発環境構築
    • PATH設定
    • ソースコード管理
  • 仮想端末でHello,world
  • 実機で動作確認
基礎知識
  • Androidアプリの基本構成
    • Androidプロジェクト
    • アクティビティのライフサイクル
  • ログ出力
  • 異なる環境への最適化

逆引き
  • リストから値を選択する
    • Spinnerの使用
    • ListViewの応用
  • タイマーを使う
  • 着信音を鳴らす
  • ステータスバーに通知を出す







更新履歴

取得中です。

ここを編集
記事メニュー2

wiki内検索

検索 :



管理人のオススメ


Javaの基本から学ぶならコレ。定番の一冊

独習Java 第4版



名著。オブジェクト指向を深く学ぶなら。

オブジェクト指向でなぜつくるのか 第2版 知っておきたいOOP、設計、関数型言語の基礎知識



作りながら体で覚えることが大事

作ればわかる!Androidプログラミング―10の実践サンプルで学ぶAndroidアプリ開発入門 (Smart Mobile Developer)



その他のアイテムを探す








ここを編集
人気記事ランキング
  1. ログ出力
  2. 着信音を鳴らす
もっと見る
最近更新されたページ
  • 4659日前

    トップページ
  • 4665日前

    ServiceのBind
  • 4666日前

    wiki初期画面のバックアップ
  • 4667日前

    ソースコード管理
  • 4667日前

    メニュー
  • 4667日前

    着信音を鳴らす
  • 4671日前

    ステータスバーに通知を出す
  • 4673日前

    タイマーを使う
  • 4674日前

    ListViewの応用
  • 4675日前

    TextViewの応用
もっと見る
人気記事ランキング
  1. ログ出力
  2. 着信音を鳴らす
もっと見る
最近更新されたページ
  • 4659日前

    トップページ
  • 4665日前

    ServiceのBind
  • 4666日前

    wiki初期画面のバックアップ
  • 4667日前

    ソースコード管理
  • 4667日前

    メニュー
  • 4667日前

    着信音を鳴らす
  • 4671日前

    ステータスバーに通知を出す
  • 4673日前

    タイマーを使う
  • 4674日前

    ListViewの応用
  • 4675日前

    TextViewの応用
もっと見る
ウィキ募集バナー
新規Wikiランキング

最近作成されたWikiのアクセスランキングです。見るだけでなく加筆してみよう!

  1. 鹿乃つの氏 周辺注意喚起@ウィキ
  2. 機動戦士ガンダム EXTREME VS.2 INFINITEBOOST wiki
  3. MadTown GTA (Beta) まとめウィキ
  4. R.E.P.O. 日本語解説Wiki
  5. シュガードール情報まとめウィキ
  6. AviUtl2のWiki
  7. ソードランページ @ 非公式wiki
  8. シミュグラ2Wiki(Simulation Of Grand2)GTARP
  9. Dark War Survival攻略
  10. ありふれた職業で世界最強 リベリオンソウル @ ウィキ
もっと見る
人気Wikiランキング

atwikiでよく見られているWikiのランキングです。新しい情報を発見してみよう!

  1. アニヲタWiki(仮)
  2. ストグラ まとめ @ウィキ
  3. ゲームカタログ@Wiki ~名作からクソゲーまで~
  4. 初音ミク Wiki
  5. 検索してはいけない言葉 @ ウィキ
  6. Grand Theft Auto V(グランドセフトオート5)GTA5 & GTAオンライン 情報・攻略wiki
  7. パタポン2 ドンチャカ♪@うぃき
  8. 発車メロディーwiki
  9. 機動戦士ガンダム バトルオペレーション2攻略Wiki 3rd Season
  10. オレカバトル アプリ版 @ ウィキ
もっと見る
全体ページランキング

最近アクセスの多かったページランキングです。話題のページを見に行こう!

  1. 参加者一覧 - ストグラ まとめ @ウィキ
  2. Trickster - ストグラ まとめ @ウィキ
  3. ガヴァイ アッカンマン - ストグラ まとめ @ウィキ
  4. 過去の行動&発言まとめ - 鹿乃つの氏 周辺注意喚起@ウィキ
  5. 魔獣トゲイラ - バトルロイヤルR+α ファンフィクション(二次創作など)総合wiki
  6. マイティーストライクフリーダムガンダム - 機動戦士ガンダム EXTREME VS.2 INFINITEBOOST wiki
  7. コメント/雑談・質問 - マージマンション@wiki
  8. 機体一覧 - 機動戦士ガンダム EXTREME VS.2 INFINITEBOOST wiki
  9. 猗窩座(鬼滅の刃) - アニヲタWiki(仮)
  10. MOZU - ストグラ まとめ @ウィキ
もっと見る

  • このWikiのTOPへ
  • 全ページ一覧
  • アットウィキTOP
  • 利用規約
  • プライバシーポリシー

2019 AtWiki, Inc.