問題タブ [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.
android - Android:バインドされたサービスがいつ破棄されたかを知る方法は?
それぞれがServiceConnection
.
各アクティビティは、サービスを呼び出す前に、サービスが既に使用されているかどうかを確認する必要があります。getCurrentId()
したがって、サービスには、サービスが現在行っていることの詳細を返す関数 (としましょう) があります。次に、クライアント アクティビティで、サービス接続が設定されます。
ボタンは、サービスへのバインドを切り替えます。
およびバインド解除:
全然呼んstartService()
でません。
サービスにバインドする前に、サービスが既にアクティブになっているかどうかと、サービスが何をしているかを確認します。
問題は、アクティビティがサービスにバインドされてからアンバインドされた場合、サービスonDestroy()
メソッドが呼び出されることです (これを確認するためにログインしました)。これは問題ありません。
しかし、これはトリガーしませんonServiceDisconnected()
。
そのため、mService が null に設定されることはありません。その if ステートメントに到達すると、喜んで続行して を呼び出しgetCurrentId()
、以前の詳細が何であれ返されます。
サービスが実行されているスレッドが予期せず強制終了された場合にのみ呼び出さonServiceDisconnected()
れると想定されているため、バインドを解除する最後のアクティビティが原因でサービスが破棄されたときに呼び出されないのは正しいことです。
私が知る限り、サービスは再インスタンス化されておらず、全体にログが記録されています。
これにより、2つの質問が得られます。
代替のコールバック関数や、バインド解除によってサービスが破棄されたことを ServiceConnection に通知する方法はありますか?
サービスが破棄された場合、どうすればその関数を呼び出すことができますか? または、何か他のことが起こっていますか?ServiceConnection
または がBinder
実際にサービスを呼び出さずに値を返すのでしょうか?
android - Service バインドごとに 1 つの ServiceConnection が必要ですか?
Service
にバインドしたいAndroid がいくつかActivity
あるので、ユーザーからのいくつかのアクションを監視できます。
ServiceConnection
すべての Service をバインドできるようにするには、次のようにアクティビティにいくつかの private が必要ですか?
それとも、アクティビティとサービスの間に、制限されたサービスの使用と理解を向上させるマネージャー クラスが必要ですか?
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 では、そのような初期化はありません (少なくともコードの私の部分では)。
android - アクティビティが Android で ServiceConnection エラーをリークしました
私のアプリケーションは、Phone-Gap を通じて開発されています。しかし、アクセシビリティから TALK_BACK オプションをオンにすると、以下のようなエラー メッセージが表示され、アプリケーションがしばらくクラッシュします (常にではありません)。どうすれば解決できますか?
android - Service の「クライアント」は誰ですか? Context、または ServiceConnection は?
SO に関するさまざまな投稿を見つけて読みましたが、 (in an ) または(in a ) の代わりに - にgetApplicationContext()
バインドするときに使用する必要があると述べています。Service
this
Activity
getActivity()
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回目だといいのですが…)