ServiceへのBindについて

1,016 views
Skip to first unread message

レイ

unread,
Oct 29, 2009, 7:47:38 AM10/29/09
to 日本Androidの会
みなさんこんばんは、レイです。

ServiceへのActivityからのbindについてお尋ねします。

現在 ActivityからSerivceを起動する音楽プレイヤーを作成しております。

ActivityからServiceを起動し音楽を再生させ、その音楽にあった画像を画面に表示するようにしています。

そこで、問題があります。
音楽をSeriviceで再生中に、Actiivtyが一旦終了し、その後再度Activityを起動させた時に
ActivityのonCreateでbindserviceを行い、現在再生中の音楽にあった画像を表示させたいのですが
onCreateの中でbindServiceし、その後Serviceに実装している音楽ファイル名取得メソッドから
再生中の音楽ファイル名を取得したいのですがnullPointerExceptionで落ちてしまいます。

Activity起動後のボタン押下などではServiceから音楽ファイル名が取得できるのですが、
onCreateで行なわないと、あまり意味がありません。

onCreateでbindserviceし、bindしたサービスのメソッドをonCreateでコールすることは出来ないのでしょうか?
どなたかご存知の方いらっしゃいましたら、ご教授をお願いいたします。

egg

unread,
Oct 29, 2009, 9:57:09 AM10/29/09
to android-g...@googlegroups.com
レイさん

江川です。
当て推量ですが
bindService(・・・);
foo();
bar();
・・・
のように記述されていませんか。もしそうだと仮定した場合ですが、
bindServiceメソッドは、バインドされるまで待つわけではなく、すぐに制御が戻りますので
上のように書いていると、バインドされる前にfooやbarは実行されてしまいます。
バインドされた後にやりたい処理は、bindServiceメソッドの引数に渡すServiceConnectionの
onServiceConnectedメソッドの中に書きます。
onServiceConnectedメソッドは、バインドが完了した時にコールバックされるメソッドです。

------------------------------------------
EGAWA Takashi



2009年10月29日20:47 レイ <beginner...@gmail.com>:

Katsuhiko Sato

unread,
Oct 29, 2009, 10:12:41 AM10/29/09
to android-g...@googlegroups.com
レイさん

ユビラボ佐藤です

onCreate内でbindserviceを行って、どのぐらいでbindが完了すると
想定されていますか?onCreate内ですぐにメソッドを呼ぶのは無理ではないでしょうか。


基本的にserviceにbindするのはある程度遅延が発生するために、
Handler等でサービスのServiceConnectionが取得完了するまで待機する
必要があると思います。

画像の表示も、基本的にはHandler等でServiceConnectionの
インスタンスが取得できた後に呼ぶようにしたらいかがでしょうか。

private boolean mIsBound = false;
private IHogeService mService;

private ServiceConnection mConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName name, IBinder service) {
mService = IHogeService.Stub.asInterface(service);
}
public void onServiceDisconnected(ComponentName name) {
mService = null;
}
};

private Runnable run = new Runnable(){
public void run() {
if(mService == null){
mHandler.postDelayed(run, 100);
return;
}
// ここに、画像取得のコードを書く
};

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if(!mIsBound){
mIsBound = bindService(new Intent(this, HogeService.class),
mConnection, Context.BIND_AUTO_CREATE);
}
// ここにonCreateの処理をかく
mHandler.post(run);

Katsuhiko Sato

unread,
Oct 29, 2009, 10:18:16 AM10/29/09
to android-g...@googlegroups.com
ユビラボ佐藤です
自己レスです

Handlerで待機するより、
onServiceConnected内で行うほうがきっと早いですね。
下のコードは動作確認済みです~。
onServiceConnectedでも試してみてください。

レイ

unread,
Oct 29, 2009, 9:05:46 PM10/29/09
to 日本Androidの会
江川様
こんにちは、レイです。

早速の回答ありがとうございました。

bindServiceの戻りがbindの成功かと思っておりました。
ご教授いただいた様に、
onServiceConnected内で処理メソッドをコールするようにすることにより
実現可能となりました。

ありがとうございました。
しかし、Serviceは難しいです。

これからもよろしくお願いいたします。

On 10月29日, 午後10:57, egg <t.eg...@gmail.com> wrote:
> レイさん
>
> 江川です。
> 当て推量ですが
> bindService(・・・);
> foo();
> bar();
> ・・・
> のように記述されていませんか。もしそうだと仮定した場合ですが、
> bindServiceメソッドは、バインドされるまで待つわけではなく、すぐに制御が戻りますので
> 上のように書いていると、バインドされる前にfooやbarは実行されてしまいます。
> バインドされた後にやりたい処理は、bindServiceメソッドの引数に渡すServiceConnectionの
> onServiceConnectedメソッドの中に書きます。
> onServiceConnectedメソッドは、バインドが完了した時にコールバックされるメソッドです。
>
> ------------------------------------------
> EGAWA Takashi
>
> 2009年10月29日20:47 レイ <beginner.engi...@gmail.com>:
>
>
>
>
>
> > みなさんこんばんは、レイです。
>
> > ServiceへのActivityからのbindについてお尋ねします。
>
> > 現在 ActivityからSerivceを起動する音楽プレイヤーを作成しております。
>
> > ActivityからServiceを起動し音楽を再生させ、その音楽にあった画像を画面に表示するようにしています。
>
> > そこで、問題があります。
> > 音楽をSeriviceで再生中に、Actiivtyが一旦終了し、その後再度Activityを起動させた時に
> > ActivityのonCreateでbindserviceを行い、現在再生中の音楽にあった画像を表示させたいのですが
> > onCreateの中でbindServiceし、その後Serviceに実装している音楽ファイル名取得メソッドから
> > 再生中の音楽ファイル名を取得したいのですがnullPointerExceptionで落ちてしまいます。
>
> > Activity起動後のボタン押下などではServiceから音楽ファイル名が取得できるのですが、
> > onCreateで行なわないと、あまり意味がありません。
>
> > onCreateでbindserviceし、bindしたサービスのメソッドをonCreateでコールすることは出来ないのでしょうか?
> > どなたかご存知の方いらっしゃいましたら、ご教授をお願いいたします。- 引用テキストを表示しない -
>
> - 引用テキストを表示 -

レイ

unread,
Oct 29, 2009, 9:10:55 PM10/29/09
to 日本Androidの会
ユビラボ佐藤様
こんにちは、レイです。

ソースまで書いて頂きありがとうございます。

江川様のやり方とは別で、Handler等で接続完了まで待つというやり方もあるんですね。
このやり方の場合、binderの処理を共通クラスで行い
呼び出しクラスで待つ様にする事により、binderのお約束の処理を全てのクラスで記述する必要がありませんね。

勉強になります。

2日ぐらいはまっていた処理を即効で回答頂き、大変助かりました。

佐藤様ありがとうございました。
Reply all
Reply to author
Forward
0 new messages