3

に問題がありbindService()ます。コンストラクターでバインディングを実行しようとしており、2 つのパークリア可能なエクストラを含むインテントを提供しています。コンストラクターが呼び出されonResume()、サービスはそのonBind()メソッドで 2 つのエクストラを解析し、解析nullの結果として返される場合があります。

最初にアプリを実行すると (Run in Eclipse を介して)、バインディングは (予想どおり) サービスによって拒否されます。サービスのonBind()メソッドが呼び出されて が返されますnull。ただし、bindService()アプリケーション側のメソッドは戻りますtrue(バインディングが通過しなかったため、そうすべきではありません!)。

次のことを試すと、これはさらに問題になります。HOME ボタンを押して、アプリを再起動します (アプリが再度onResume()実行され、アプリがサービスへのバインドを再試行します)。今回はサービスonBind()も実行されていないようです!しかし、アプリはbindService()まだ戻ってきますtrue

以下は、私の問題を理解するのに役立つサンプル コードです。

アプリケーション側:

// activity's onResume()
@Override
public void onResume() {
    super.onResume();
    var = new Constructor(this);
}

// the constructor
public Constructor(Context context) {
    final Intent bindIntent = new Intent("test");

    bindIntent.putExtra("extra1",extra_A);
    bindIntent.putExtra("extra2",extra_B);

    isBound = context.bindService(bindIntent, connection, Context.BIND_ADJUST_WITH_ACTIVITY);

    log("tried to bind... isBound="+isBound);
}

サービス側:

private MyAIDLService service = null;   

@Override
public void onCreate() {
    service = new MyAIDLService(getContentResolver());
}

@Override
public IBinder onBind(final Intent intent) {
    log("onBind() called");     

    if (intent.getAction().equals("test") {
        ExtraObj extra_A = intent.getParcelableExtra("extra1");
        ExtraObj extra_B = intent.getParcelableExtra("extra2");

        if (parse(extra_A,extra_B))
            return service;
        else {
            log("rejected binding");
            return null;
        }

     }
}

ServiceConnection私が使用している は、次のメソッドを保持していますonServiceConnected()

@Override
public void onServiceConnected(final ComponentName name, final IBinder service) {
    log("onServiceConnected(): successfully connected to the service!");

    this.service = MyAIDLService.asInterface(service);
}

そのため、「サービスに正常に接続されました!」というメッセージが表示されることはありません。ログ。(Eclipse を使用して) アプリを初めて実行すると、「拒否されたバインディング」ログと「isBound=true」が表示されますが、それ以降は「isBound=true」のみが取得され、「拒否されたバインディング」は取得されません。二度と来ないで。

これは、強制的に拒否した場合でも、バインドが成功したことを Android が認識する可能性に関係していると思われます。理想的には、「アンバインド」も強制できますが、それは不可能です。これは、アプリを強制終了するonUnbind()と、サービスのメソッドにあるログを取得しているためだと思われます (そもそも拘束力なし!)。

4

1 に答える 1

5

同じ問題がありましたが、私のサービスが実際には開始されていないことに気付きました。おそらく、「Context.BIND_AUTO_CREATE」をフラグに追加してみてください。これにより、サービスが作成および開始されます。Context.BIND_ADJUST_WITH_ACTIVITY がそれを開始するとは思わないので、onServiceConnected が呼び出されない可能性があります (bindService() 呼び出しが true を返していても、それは私にとってはそうではありませんでした):

    isBound = context.bindService(bindIntent, connection,
          Context.BIND_ADJUST_WITH_ACTIVITY | Context.BIND_AUTO_CREATE);
于 2013-03-19T20:48:22.980 に答える