35

特定の状況があります。ブロードキャスト レシーバーによって開始されたサービスがアクティビティを開始します。このアクティビティがサービスと通信できるようにしたいと考えています。それを可能にするために AIDL を使用することにしました。アクティビティでbindService()呼び出されたメソッドを除いて、すべてがうまく機能しているようです。onCreate()実際、 bindService()は、サービスのメソッドがonServiceConnected()呼び出されている間は呼び出されないため、null ポインター例外をスローします。onBind()とにかくbindService()trueを返します。アクティビティを開始するため、サービスは明らかにアクティブです。サービスからアクティビティを呼び出すのは奇妙に聞こえるかもしれませんが、残念ながら、これがサービスで音声認識を行う唯一の方法です。

前もって感謝します

4

12 に答える 12

53

これを理解しようと何時間も試みた後、問題は、サービスの作成を示す例にonBindメソッドが含まれていないか、次のサンプルコードがあるか、これが生成されることです。

public IBinder onBind(Intent intent) {
    // TODO Auto-generated method stub
    return null;
}

これにより、onServiceConnectedメソッドが失敗するか、実際に実行されることはありません。修正は非常に簡単で、次のとおりです。

public IBinder onBind(Intent intent) {
    return mBinder;
}

次のような単純なバインダーを作成して返すことができる場所:

private final IBinder mBinder = new LocalBinder();
public class LocalBinder extends Binder {
    public ConferenceService getService() {
    return ConferenceService.this;
  }
}
于 2010-05-20T06:55:15.327 に答える
52

呼び出されないという同じ症状で、この問題の別のバージョンを経験しましたonServiceConnected(...)。私の場合は原因が違いました。

アプリケーションタグ内の AndroidManifest.xml にサービス宣言があることを確認する必要があります-これが私にとっての問題の根本でした。

<application android:name=".YourAppTitle" android:icon="@drawable/icon" android:label="@string/app_name">
    <activity android:name=".Main" android:label="@string/app_name">
    </activity>
    <service android:name="YourService" />
</application>

Eclipse 内で別の Android ライブラリを使用している場合は、さらに複雑になります。この Service タグを追加しても、参照されているサービスがマニフェストと同じパッケージにある場合にのみ問題が解決するようです。<service..>つまり、アプリがパッケージ abc にあり、ここに AndroidManifest.xml が存在する場合、「YourService」もパッケージ abc に含まれている必要があります (必要に応じて別のライブラリから手動でコピーします) onServiceConnected(...)。呼ばれません。

コードでサービスに適切なインポートステートメントを使用したにもかかわらず、これは私のプロジェクトに当てはまりました。Eclipse はエラーを示さなかったため、インポートは Eclipse ワークスペース内の別のライブラリからクラスを正しく識別していました。

HTH

于 2011-05-06T01:49:03.183 に答える
26

アプリケーションでonServiceConnectedイベントが呼び出されることはありませんでした。

問題は、アプリケーション マニフェストでサービス名を次のように定義していたことです。

<service android:name="MyService" android:enabled="true"></service>

完全なクラス名に変更すると、機能しました:

<service android:name="com.example.MyService" android:enabled="true"></service>

更新:相対クラス名を使用することもできます:

<service android:name=".MyService" android:enabled="true"></service>

MyServiceClassだけでなく、完全なcom.example.MyServiceClassを使用してクラス名を指定します。

于 2013-01-28T12:58:40.523 に答える
14

あなたの説明から正確な問題を構成することはできないので、ここで推測します!

どのようbindService()に投げることができNullPointerExceptionますか?Serviceこれが発生する可能性がある (/発生するはずの) 唯一の方法は、またはServiceConnectionリスナーを指定しない場合です。

bindService()NullPointerException が呼び出されていないため 、 a をスローできませんonServiceConnected()。への呼び出しonServiceConnected()は の製品ですbindService()

実際に結合AIDLする前に、メソッドを呼び出していると思いますか?Service

于 2010-03-21T13:07:44.183 に答える
10

もう 1 つのことは、bindserviceメソッド内でoncreateメソッドを呼び出している場合onserviceconnected、メソッドが終了した後に が呼び出されるoncreateことです。

oncreateそのため、終了前 (または呼び出される前)のインターフェイス関数への参照は、onserviceconnectednull ポインター例外を示します。

于 2012-05-10T05:28:25.290 に答える
5

Yet another cause to the original question might be that the service isn't already running and you are passing 0 as flag to bindService. Like so:

bindService(intent, serviceConnection, 0);

When what you are looking for would be:

bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);
于 2013-02-22T08:19:41.743 に答える
1

あまり頻繁に発生する状況ではありませんが、別の説明がある可能性がありますが、なんとかそれに入り込み、解決するのに2時間を失いました.

そこで、onBind メソッドが受け取ったインテントからバンドルを再利用したいと考えました。しかし、私は怠惰なバージョンに行き、インテントのクラスを変更しました。どうやら、これにより onServiceConnected が呼び出されなくなります。おそらく、システムがインテントへの参照を保持し、onServiceConnected を呼び出すときにそれを使用するためです。

結論として、onBind で受け取ったインテントを変更しないでください。

于 2013-08-22T11:25:26.030 に答える
0

空の Intent - で bind を呼び出していましたgetContext().bindService(new Intent(), mConnection, Context.BIND_AUTO_CREATE)。バインドするサービスを示すために、インテントをより具体的にする必要があります。これは明らかにコード エラーですが、残念ながら Logcat の出力は十分に明確ではありませんでした。

于 2014-02-17T13:07:41.080 に答える
0

onCreate() メソッドが完了するまで待つ必要があります。例: ボタンで購入サービスを設定:

Button button_useservice=findViewById(R.id.button_useservice);
            button_useservice.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    UsinService();
                }
            });
于 2019-01-26T05:35:23.157 に答える