3

ジンジャーブレッド2.3.4apilvl10を使用します。

起動が完了してからサービスを開始しています。そのために、サービスを開始する放送受信機を追加しました。ランチャーで同じサービスを使用しています。インテントにパラメータを追加してサービスにバインドしようとしています。ブロードキャスト応答によるサービスからの結果の取得。

問題は、最初にバインドするときに、サービスのonBind()がトリガーされることです。それ以降のバインディングは、サービスでonBind()を呼び出しません。問題は、サービスがboot_bootの直後に開始されることだと思います。起動時にサービスを開始せず、アクティビティにContext.BIND_AUTO_CREATEを使用してサービスを開始させると、期待どおりに動作します。

私が思いついた唯一の解決策は、サービスのonUnbind()を変更し、サービスのonRebind()呼び出しでonBind()を発行することです。このソリューションは、onBind()メソッドが2回呼び出される原因となる、後のAndroidバージョンで機能しなくなる可能性があるため、私は好きではありません。

それでは、起動が完了した後に起動するサービスで後続のバインドがトリガーされないのはなぜですか。他のエレガントなソリューションは大歓迎です。

PS:私はすでにaidlに実装しましたが、サービスがデータを返すために非同期処理を実行し、両方のアプリにaidlファイルを追加する必要があるため、コードが肥大化するハンドラーが追加されるため、気に入らないです。

前もって感謝します。私のコードの抜粋:

サービスのマニフェスト:

        <intent-filter>
            <action android:name="com.organization.android.ACTION_BOOT_COMPLETED" />
        </intent-filter>

         <intent-filter>
            <action android:name="com.organization.android.WORK_INTENT" />
        </intent-filter>
    </service>

    <receiver android:name=".CoreServiceReceiver" >
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" >
            </action>

            <category android:name="android.intent.category.HOME" >
            </category>
        </intent-filter>
    </receiver>

サービスにバインドするとき:

インテントインテント=newIntent(WORK_INTENT); intent.putExtra( "param"、param);

context.registerReceiver (broadcastReceiver, new IntentFilter("com.organization.android.WORK_RESULT"));
context.bindService(intent,mConnection, Context.BIND_AUTO_CREATE);        

}

結果が出たら:

context.unbindService(mConnection);
context.unregisterReceiver (broadcastReceiver);
4

1 に答える 1

7

サービスへのバインドに関するドキュメントから:

複数のクライアントが一度にサービスに接続できます。ただし、システムはサービスのonBind()メソッドを呼び出して、最初のクライアントがバインドしたときにのみIBinderを取得します。次に、システムは、onBind()を再度呼び出すことなく、バインドする追加のクライアントに同じIBinderを配信します。

この動作は変更されないため、onUnbindをオーバーライドしてtrueを返し、onRebind中にonBindを呼び出す方法は完全に問題ありませんが、元のバインディングは引き続きクライアントに送信され、新しい呼び出しで生成される可能性のある新しいバインディングは送信されません。 onBindに。(つまり、実際にはonBindを呼び出すべきではなく、onRebindを別のケースとして処理するだけです)

于 2012-07-02T04:50:16.170 に答える