0

だから、これが私のシナリオです:私は2つのアクティビティと1つのサービスを持っています-> 3つすべて(クラス)は別のサービスからの戻り型の値を必要とします(したがって、合計2つのアクティビティ、アプリケーションで2つのサービス)。

すなわち:アクティビティA、開始->アクティビティBとサービスI。

アクティビティB、開始->サービスII。

その後、アクティビティA、B、およびサービスIIはサービスIと通信する必要があります。サービスIは常に遅れて実行されており、一度開始すると停止することはありません。

それを行う私のアプローチは次のとおりでした:

  1. 4つの通信クラス間のインターフェースを宣言する3つの.aidlファイルを記述します。

  2. アクティビティAを作成してから、サービスI、アクティビティBを作成し、アクティビティBからサービスIIを作成します。

  3. サービスとして、いつでも3つのクラスと通信するためのonBind()メソッドを1つだけ持つことができます。私が行っているのは、setType()プロパティを使用して異なる値を割り当てることにより、3つのクラスからのすべてのインテントを区別することです。

  4. initService()を使用して通信を行う必要がある場合、2つのクラスの間に接続が構築され、その後すぐにreleaseService()を使用して解放されます。

  5. サービスIでは、onBind()メソッドは、最初にgetType()プロパティを使用して、インテントが3つのクラスのどれから来ているかを確認し、それぞれのIBinderタイプを返す必要があります。

ここで、私の問題はステップ5にあります。この場合、onBind()メソッドは、すべてのインテントのgetType()をチェックして、それぞれの戻り型を指定する操作を実行できません。サービスIのonBinder()メソッドのコードは次のとおりです。

@Override
public IBinder onBind(final Intent intent){
    Log.d(Main_Service.TAG,"it got connected");
    if(intent.getType=="Activity_A")
    {
        return new Activity_A_aidl.Stub() {
            public void function1(int u1,String p1,String p2) throws RemoteException{
                //do something
            }
        };}

    if(intent.getType=="Activity_B"){
        return new Activity_B_aidl.Stub() {
            public int function2() throws RemoteException{//do something
                return some_integer_values;
            }
        };} 
    if(intent.getType()="Service_II"){
        return new Service_II_aidl.Stub(){
            public boolean function3(String u,String p) throws RemoteException{
                //do something

            return boolean_type_variable;
            }
        };}
}

エラー:LogCatに表示されているように:java.lang.NullPointerException

3つのクラスすべて(アクティビティA、B、サービスII)から-try-catchブロック内の関数の1つを呼び出しているときはいつでも。

誰かが私がどこで間違っているのか教えてもらえますか?

-Kishore Debnath、(3年生、CSE学生)。

4

2 に答える 2

1

全体的な設計についてコメントすることなく、サービスが呼び出し元を区別する方法は、「action」プロパティを使用することであると付け加えます。initService()が何であるかはわかりませんが、リモートサービスにバインドするときは、単にbindService()を使用します。したがって、あなたの活動には次のようなものがあります。

bindService(new Intent("com.mypackage.myService.ACTION_1"), this,
                Context.BIND_AUTO_CREATE);

または.ACTION_2または.ACTION_3。

次に、サービスマニフェストにインテントフィルターがあります。

<intent-filter>
   <action  android:name="com.mypackage.myService.ACTION_1" />
   <action  android:name="com.mypackage.myService.ACTION_2" />
   <action  android:name="com.mypackage.myService.ACTION_3" />
</intent-filter>

次に、サービスのonBind()で、intentを使用します。getAction()は、呼び出し元を識別する文字列を返します。(適切な.equals()メソッドを使用して文字列と一致させます!)そして適切なIBinderを返します

インテントのエクストラがサービスに渡されるとは思いません。私は他のサービスからのサービスにバインドしたことはありませんが、それはうまくいくかもしれないと思います。

最後のポイントとして、私はAIDLとリモートサービスのみを使用します。これは、商業上の理由から、機能を2つの別々の.apkに分割する必要があるためです。私がそれを使用するのに技術的な理由はありません。実際、まったく逆です。

于 2011-03-27T20:09:58.440 に答える
0

どこが間違っているのか誰か教えてもらえますか

さて、あなたは尋ねました...

  • 2つのサービスが必要になる可能性は非常に低く、1つのサービスが別のサービスと通信する必要がある可能性はさらに低く、1つのサービスが別のサービスにバインドする必要がある可能性はさらに低くなります。

  • AIDLが必要になる可能性はほとんどありません。

  • 「常に遅れをとっており、一度開始すると停止しない」サービスが本当に必要になる可能性はほとんどありません。

  • typeのプロパティは Intent、MIMEタイプ以外には使用しないでください。Intentに添付する他のデータにはエクストラを使用しますIntent

  • =上記の3番目のif() ステートメントのように、文字列を。と比較しないでください。

  • 上記のような明らかなタイプミスのあるStackOverflowの質問にコードを貼り付けたり、最初の2つのステートメントのようにin呼び出しを=見逃したりしないでください。コンパイルされない場合は、状況を理解していることを示す良いサンプルではありません。()getType()if()

実際の問題は、ここに示されていないコードが原因である可能性があります。Binder接続がバインドされる前に(たとえば、beforeonServiceConnected()が呼び出される前に)オブジェクトのメソッドを呼び出そうとしている可能性があります。または、メソッドの実装にバグがあるだけで、Binderここにも表示されていない可能性があります。

于 2011-03-27T17:49:46.157 に答える