問題タブ [serviceconnection]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
1049 参照

android - Android:バインドされたサービスがいつ破棄されたかを知る方法は?

それぞれがServiceConnection.

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

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

およびバインド解除:

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

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

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

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

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

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

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

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

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

0 投票する
2 に答える
3119 参照

android - Service バインドごとに 1 つの ServiceConnection が必要ですか?

ServiceにバインドしたいAndroid がいくつかActivityあるので、ユーザーからのいくつかのアクションを監視できます。

ServiceConnectionすべての Service をバインドできるようにするには、次のようにアクティビティにいくつかの private が必要ですか?

それとも、アクティビティとサービスの間に、制限されたサービスの使用と理解を向上させるマネージャー クラスが必要ですか?

0 投票する
3 に答える
10234 参照

android - ListView: アクティビティが ServiceConnection をリークしましたもともとここにバインドされていた

アップデート:

別のデバイスでアプリをテストしたところ、Android 4.4.2 を実行している Nexus 4 ではエラーが発生することがわかりましたが、Android 4.0.4 を実行している Desire Sでは発生しません。両方とも、API を使用するために必要な現在の YouTube アプリ (5.3.32) がインストールされています。

質問: ServiceConnectionLeaked メッセージが表示されるのはなぜですか? (以下の Logcat を参照)

説明:

YouTube Android Player API 1.0.0 ( https://developers.google.com/youtube/android/player/ ) を使用して、次のアダプター コードを使用して ListView にビデオ サムネイルを読み込みます。

この listView を保持する Fragment には、次のコードがあります。

何が起こるかは次のとおりです。

  • フラグメントが作成され、YouTube サムネイルが読み込まれ、正しく表示されます。

ここで、初めてデバイスを回転させます(横向きにしましょう)。

  • Fragment が作成され、既存のアダプターが listView に接続されますが、現在表示されているすべてのリスト項目のサムネイルは読み込まれません。
  • 下にスクロールすると、新しいリスト項目が画面に入ります。
    • このような新しいリスト項目が新しい ViewHolder を使用する場合、そのサムネイルは正しく読み込まれます。
    • そのような新しいリスト アイテムが最初に表示されるリスト アイテムの ViewHolder を使用する場合、そのサムネイルはまったく読み込まれません。

したがって、これにより、正しくロードされているサムネイルとまったくロードされていないサムネイルのリストが交互に表示されます。次に、デバイスをもう一度回転させます(縦向きに戻します)。

  • フラグメントが作成され、既存のアダプターが listView に接続され、すべてのサムネイルが正しく読み込まれます。

ここで、デバイスを3回回転させます(以前は間違っていた横向きに戻りました)。

  • フラグメントが作成され、既存のアダプターが listView に接続され、すべてのサムネイルが正しく読み込まれます。

そのため、デバイスが最初に回転した後にのみ何かが発生するため、表示されているサムネイルはリスト項目に読み込まれません。

logcat は、最初のローテーションの後、サムネイル リクエストごとに次のメッセージを表示します。

これらの ServiceConnectionLeaked メッセージが表示されるのはなぜですか?

私はすでに周りを検索しましたが、ほとんどの場合、アクティビティ コンテキストの代わりにアプリケーション コンテキストを提供する必要がある場合、ある種の API 初期化が必要です。しかし、YouTubePlayer Android API では、そのような初期化はありません (少なくともコードの私の部分では)。

0 投票する
0 に答える
1432 参照

android - アクティビティが Android で ServiceConnection エラーをリークしました

私のアプリケーションは、Phone-Gap を通じて開発されています。しかし、アクセシビリティから TALK_BACK オプションをオンにすると、以下のようなエラー メッセージが表示され、アプリケーションがしばらくクラッシュします (常にではありません)。どうすれば解決できますか?

0 投票する
1 に答える
224 参照

android - Service の「クライアント」は誰ですか? Context、または ServiceConnection は?

SO に関するさまざまな投稿を見つけて読みましたが、 (in an ) または(in a ) の代わりに - にgetApplicationContext()バインドするときに使用する必要があると述べています。ServicethisActivitygetActivity()Fragment

ただし、これにより次の質問が発生しました。ドキュメントでは、の「クライアント」について繰り返し説明していServiceます。/guide/components/bound-services.html )。

このコンテキストでのクライアントの意味:

  • Context呼び出しに使用されたbindService()
  • またはServiceConnectionに供給されたbindService()

Fragments同じものにバインドする2 つがあるとしましょうService- Application Context を使用し、それぞれに独自のServiceConnection.

サービスはいつ破棄されますか?

私の 2 番目の解釈が true のService場合、すべての接続が閉じられたとき、つまり各 Fragment が呼び出されたときに が破棄されgetActivity().getApplicationContext().unbindService(mConnection)ます。最初のフラグメントが真の場合、最初のフラグメントがその呼び出しを行うとすぐに閉じられる必要があります。これは、「アプリケーションコンテキストのバインドを解除する」ためです...

では、どの解釈が正しいのでしょうか。(2回目だといいのですが…)