ActivityからServiceへのBindについて

1,796 views
Skip to first unread message

レイ

unread,
Nov 3, 2009, 6:03:07 AM11/3/09
to 日本Androidの会
みなさんこんばんは、レイです。

Serviceへのbindの方法と、bindが遅延することは前回解決したのですが、
ちょっと気になることがありますので、お尋ねします。

AというActivityからServiceへBindし処理を行ないます。
その後、AからBというActivityへ画面遷移を行なう場合、
BでもServiceの機能を使用したいのですが
この時、AでunBindしBで再度 Bindしなければならないのでしょうか?

Bindは前回教えていただいたとおり遅延する為、画面遷移をする毎にbindしていては
アプリケーションとして、動作が遅くなってしまいます。

何か良い方法をご存知の方はご教授をお願いいたします。

Katsuhiko Sato

unread,
Nov 3, 2009, 5:40:37 PM11/3/09
to android-g...@googlegroups.com
レイさん

ユビラボ佐藤です

ActivityAもBも同じパッケージ内のものなんですよね?
であれば、同一プロセスで動作するものなので、Bindしなおす必要は
なく、スタブのインスタンスを共有していればよいです。

共有する方法はいろいろあると思いますが、
Applicationクラスをextendsして、独自のApplicationクラスを作り、そのonCreateにて
サービスをBindしておく、またはシングルトンにしておき初回取得時にBind要求が飛ぶ

仕組みにしておく、という方法はどうでしょうか?
それぞれのActivityからは、getApplicationでApplicationクラスのインスタンスは
取得可能ですので共有するオブジェクトを保持させておくことが出来ると思います。

詳しくはApplicationクラスのReferenceを見てみてください。



Applicationクラスを独自に起こした場合は、
AndroidManifest.xmlのapplicationタグの android:name="Applicationクラス名"の要素を
指定してあげる必要があります。

レイ

unread,
Nov 3, 2009, 7:30:08 PM11/3/09
to 日本Androidの会
TO) ユビラボ佐藤様
こんにちは レイです。

AもBも同パッケージ内のものです。
Bindしなおす必要は何ですね^^

Applicationクラスを使ったことが無いので
リファレンスとAPIDemoのサンプルコードを見ながら、やってみます。

実装結果はまた、連絡させていただきます。

情報ありがとうございました。
> > 何か良い方法をご存知の方はご教授をお願いいたします。- 引用テキストを表示しない -
>
> - 引用テキストを表示 -

Katsuhiko Sato

unread,
Nov 3, 2009, 7:36:56 PM11/3/09
to android-g...@googlegroups.com
レイさん

ユビラボ佐藤です

他のアプリケーションでどのぐらい利用されているのかわかりませんが、
Androidのオープンソースレポジトリが参照可能であれば、
BrowserやEMailアプリが同じようにApplicationを拡張して使っていると思います。

mydroid/packages/apps/Browser
mydroid/packages/apps/Email

このあたりを参考にするとよいかと。

----- Original Message -----
From: "レイ" <beginner...@gmail.com>
To: "日本Androidの会" <android-g...@googlegroups.com>

レイ

unread,
Nov 5, 2009, 1:52:34 AM11/5/09
to 日本Androidの会
TO)佐藤様
こんにちは レイです。

ご教授頂いたApplicationクラスを使用してみたのですが
ApplicationクラスのonCreateでStartBindを行なうのですが
onConnectedが来る前に、Activityに処理が行ってしまい、
Activityでサービスのインスタンスを取得してもnullとなってしまっております。

ApplicationクラスでonConnectedが来るまで待つ方法はないのでしょうか?


On 11月4日, 午前9:36, "Katsuhiko Sato" <stk...@ubilabo.net> wrote:
> レイさん
>
> ユビラボ佐藤です
>
> >> - 引用テキストを表示 -- 引用テキストを表示しない -
>
> - 引用テキストを表示 -

Katsuhiko Sato

unread,
Nov 5, 2009, 7:38:43 PM11/5/09
to android-g...@googlegroups.com
レイさん

ユビラボ佐藤です

基本的にonConnectedが来るまでサービスのインスタンスは取れないので、
起動時にサービスのインスタンスが存在しなかった場合、
ProgressDialogを表示して、onConnectedが来るまで
実際の処理は待たせる、というのはいかがでしょうか。
既存のActivityに上記コードを追加しても、待たせる用のActivityを追加しても
どちらでもよいと思います。


----- Original Message -----
From: "レイ" <beginner...@gmail.com>
To: "日本Androidの会" <android-g...@googlegroups.com>

Keiji Ariyama

unread,
Nov 5, 2009, 8:10:04 PM11/5/09
to android-g...@googlegroups.com
有山@大阪です。

 僕の場合はActivity毎にonResumeでバインド、onPauseでunbindしていますね。

 根拠というのは「これ」と言うものがないのですが、スタブを各アクティビ
ティで共有する形では、サービス側からのコールバックをうまく処理できない可
能性があるんじゃないかと考えて、いつの間にかそうするようになりました。

 複数のアクティビティが一つのサービスにバインドする場合は、それらのアク
ティビティの共通クラスとして、abstractのクラスを一つ用意しています。

 該クラスには、onResumeでサービスへ接続、onPauseでunbindする処理を書い
ているので、サブクラスで同じ処理を書く必要がないので便利です。

 ちなみに、サービス接続後の処理が出来ない件ですが、共通クラスに

abstract Runnable getServiceConnectedEvent();

 を定義しています。これをonConnectedの中で必ず呼び、その結果がnullでな
ければrunするようにします。
 サービス接続後の処理が必要な場合、これをサブクラスで実装する事で、サー
ビス接続後の処理を各クラス側で行えるようにしています。
 サービスに登録するコールバックについても同じようにしています。

 何かの参考になれば幸いです。

/*********************************************
有限会社シーリス
代表 有山 圭二
@Address
〒530-0044
大阪市北区東天満二丁目2番5号
第2新興ビル 601
@Web http://www.c-lis.co.jp
*********************************************/
Reply all
Reply to author
Forward
0 new messages