0

それぞれがServiceConnection.

各アクティビティは、サービスを呼び出す前に、サービスが既に使用されているかどうかを確認する必要があります。getCurrentId()したがって、サービスには、サービスが現在行っていることの詳細を返す関数 (としましょう) があります。次に、クライアント アクティビティで、サービス接続が設定されます。

private MyService mService = null;
private ServiceConnection mConnection = new ServiceConnection() {
    public void onServiceConnected(ComponentName className, IBinder binder) {
        MyService.MyBinder myBinder = (MyService.MyBinder) binder;
        mService = myBinder.getService();
        activeId = mService.getCurrentId();
        log.i(TAG, "Service bound" );
    }
    public void onServiceDisconnected(ComponentName className) {
        log.i(TAG, "Service has been killed");
        mService = null;
    }
};  

ボタンは、サービスへのバインドを切り替えます。

activity.bindService(intent, mConnection, Context.BIND_AUTO_CREATE);

およびバインド解除:

activity.unbindService(mConnection);

全然呼んstartService()でません。

サービスにバインドする前に、サービスが既にアクティブになっているかどうかと、サービスが何をしているかを確認します。

if (mService == null)
    activeId = -1;
else
    activeId = mService.getCurrentId();

問題は、アクティビティがサービスにバインドされてからアンバインドされた場合、サービスonDestroy()メソッドが呼び出されることです (これを確認するためにログインしました)。これは問題ありません。 しかし、これはトリガーしませんonServiceDisconnected()

そのため、mService が null に設定されることはありません。その if ステートメントに到達すると、喜んで続行して を呼び出しgetCurrentId()、以前の詳細が何であれ返されます。

サービスが実行されているスレッドが予期せず強制終了された場合にのみ呼び出さonServiceDisconnected()れると想定されているため、バインドを解除する最後のアクティビティが原因でサービスが破棄されたときに呼び出されないのは正しいことです。

私が知る限り、サービスは再インスタンス化されておらず、全体にログが記録されています。

これにより、2つの質問が得られます。

代替のコールバック関数や、バインド解除によってサービスが破棄されたことを ServiceConnection に通知する方法はありますか?

サービス破棄された場合、どうすればその関数を呼び出すことができますか? または、何か他のことが起こっていますか?ServiceConnectionまたは がBinder実際にサービスを呼び出さずに値を返すのでしょうか?

4

1 に答える 1

0

onServiceDisconnected()呼ばれるだけ

サービスへの接続が失われたとき。これは通常、サービスをホストしているプロセスがクラッシュまたは強制終了された場合に発生します。

Android docsから引用。これは非常にまれなケースのようで、通常どおりサービスからバインドを解除するだけでは呼び出されません。

onResumeサービスとの接続を正常に保つために、アクティビティメソッドでサービスにバインドし、メソッドでバインドを解除することをお勧めしますonPause

于 2014-08-19T08:43:04.893 に答える