問題タブ [android-service-binding]
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アプリケーションを開発しています。記録は、サービス クラスを実行しているバックグラウンドで行われます。サービス クラスからメイン アクティビティ クラスへの呼び出し情報を受信して UI に表示するにはどうすればよいでしょうか。
android - Android java.lang.IllegalArgumentException: サービスが登録されていません
次のようなセットアップがあります。
ただし、タイトルに時々エラーが表示されます:が呼び出されjava.lang.IllegalArgumentException: Service not registered
たときに生成されます。unbindService()
私はばかげたことを見逃していますか、それとももっと起こっていますか? この同じフラグメントが複数存在する可能性があることに注意してください。
編集
誰も実際にコードを読んでいないように見えるので、説明させてください。 は、サービスがバインド ( )されていて、コールバックが への以前の呼び出しの可能性からヒットする前に呼び出されていない限り、unbindService()
呼び出されません。 Context.unbindService(ServiceConnection)
mBound
onServiceDisconnected(...)
unbindService()
そのことを念頭に置いて、サービスがアンバインドされるように Android がサービスのバインドを解除するが、onServiceDisconnected が呼び出されないため、古い状態のままになる場合はありますか?
また、アプリケーション コンテキストを使用して初期バインディングを行っています。次のようなものと仮定します。
android - Android:バインドされたサービスがいつ破棄されたかを知る方法は?
それぞれがServiceConnection
.
各アクティビティは、サービスを呼び出す前に、サービスが既に使用されているかどうかを確認する必要があります。getCurrentId()
したがって、サービスには、サービスが現在行っていることの詳細を返す関数 (としましょう) があります。次に、クライアント アクティビティで、サービス接続が設定されます。
ボタンは、サービスへのバインドを切り替えます。
およびバインド解除:
全然呼んstartService()
でません。
サービスにバインドする前に、サービスが既にアクティブになっているかどうかと、サービスが何をしているかを確認します。
問題は、アクティビティがサービスにバインドされてからアンバインドされた場合、サービスonDestroy()
メソッドが呼び出されることです (これを確認するためにログインしました)。これは問題ありません。
しかし、これはトリガーしませんonServiceDisconnected()
。
そのため、mService が null に設定されることはありません。その if ステートメントに到達すると、喜んで続行して を呼び出しgetCurrentId()
、以前の詳細が何であれ返されます。
サービスが実行されているスレッドが予期せず強制終了された場合にのみ呼び出さonServiceDisconnected()
れると想定されているため、バインドを解除する最後のアクティビティが原因でサービスが破棄されたときに呼び出されないのは正しいことです。
私が知る限り、サービスは再インスタンス化されておらず、全体にログが記録されています。
これにより、2つの質問が得られます。
代替のコールバック関数や、バインド解除によってサービスが破棄されたことを ServiceConnection に通知する方法はありますか?
サービスが破棄された場合、どうすればその関数を呼び出すことができますか? または、何か他のことが起こっていますか?ServiceConnection
または がBinder
実際にサービスを呼び出さずに値を返すのでしょうか?
android - アンドリッドで強制終了されたプロセスを考えてサービスを動作させるにはどうすればよいですか?
アクティビティの呼び出しからサービスを開始および停止していますstartSertice()/stopService()
(ユーザーがチェック ボックスを選択/選択解除し、サービスが制限されていない場合)。サービスを開始するアクティビティが閉じられていても、すべてが正常に機能しています。「実行中のアプリ」では、1 つのプロセス、1 つのサービスが実行されていることがわかります。しかし、Task manager
ある種のアプリケーションを使用してアプリケーションを強制終了すると、プロセスが強制終了され、実行中のアプリが表示されてもサービスが機能しません0 processes, 1 service
。このような状況でサービスを機能させるにはどうすればよいですか? 0 processes, 1 service
サービスが正常に動作している間、Avast with のような他のいくつかのセキュリティ アプリケーションでも同じことが観察されました。これについて私を助けてください。
以下は、クリック時のアクティビティです。
サービスクラスは次のとおりです。
理想的なケースでは、すべてが正常に機能しています。サービスを開始するアクティビティが閉じられている場合でも、SCREEN ON アクションはブロードキャスト レシーバによって適切にリッスンされています。設定で実行中のアプリを確認できます。しかし、タスク マネージャーの種類のアプリケーションを使用してプロセスを強制終了すると、プロセスが強制終了され、実行中のアプリで 0 プロセス、1 サービスが実行されていることがわかります。タスクマネージャーからアプリを強制終了した後にサービスが実行されていますが、ブロードキャストレシーバーは SCREEN ON アクションをリッスンしていません。これについて私を助けてください。
ありがとう、JK
android - バインドされたサービスのandroid onServiceConnectedが呼び出されることはありません
サービスをアクティビティにバインドし、そこから位置の値を取得しようとしています。
次のサービスがあります。
GPSService.java
これは、GPSService が拡張する抽象クラスです。これの目標は、センサー、GPS センサー、加速度計センサーなど、あらゆるセンサーを一般化するものを用意することです。
SensorElement.java
これで、GPSService にバインドしようとしているアクティビティができました。InSituApp.java
public class InSituApp extends Activity{
// buttonGPS = (ボタン) findViewById(R.id.button1); }
}
このコードは、onServiceConnected
内のメソッドを呼び出すことはありませんmConnection
。ここで何が問題なのですか?onStart の bindService 呼び出しは false を返します。何故ですか?
編集:
マニフェスト.xml
android - Service バインドごとに 1 つの ServiceConnection が必要ですか?
Service
にバインドしたいAndroid がいくつかActivity
あるので、ユーザーからのいくつかのアクションを監視できます。
ServiceConnection
すべての Service をバインドできるようにするには、次のようにアクティビティにいくつかの private が必要ですか?
それとも、アクティビティとサービスの間に、制限されたサービスの使用と理解を向上させるマネージャー クラスが必要ですか?
android - REST サービスをポーリングしてデータをアクティビティに送信する Android サービスを構築する
私は、最初の Android アプリに取り組んでいる .Net 開発者です。私は学習曲線に苦しんでおり、誰かが私を正しい方向に押し上げてくれることを望んでいました。やりたいことと完全に一致しないチュートリアルがたくさんあり、何かをつなぎ合わせるのに苦労しています。
私は概念的に RSS リーダーに非常によく似たアプリに取り組んでいます。アイテムのリストが表示され、1 つのアイテムをクリックするとアイテムの詳細が表示されます。私はこれを機能させ、ダミーデータを使用しています。
実際のデータは REST サービスから取得されます。RSS リーダーのように、アプリを定期的にポーリングし、最新のデータで更新する必要があります。また、ユーザーがポーリング サイクル間で必要に応じて更新できるように、[更新] ボタンも用意されています。
ユーザーが手動でアプリを起動していなくてもポーリングしたい。Twitter や Facebook アプリによく似ています。この場合、新しいデータが見つかると通知が表示され、通知をクリックするとアプリが起動し、ユーザーは新しく見つかったデータが表示されるのを待っています。
デバイスの起動時に実行されるサービスが必要だと思います。サービスは REST サービスを定期的にポーリングします。新しいデータが見つかると、アプリを起動するように構成された通知をスローします。
アプリはサービスと通信して、新しいデータのチャンクを受け取ると思います。アプリはサービスと通信して、オンデマンドでポーリングするように指示することもできると思います(ユーザーが更新したい場合)。
これは、経験の浅い人にとってはありふれたものだと思いますが、私にとっては、この時点ではかなり困難です. これをまとめるために必要なピースの概要が必要なだけです。私がやろうとしていることと密接に一致するチュートリアルへのポインタはプラスになります。ありがとう!
java - Android Binder クラスを使用するポイントは何ですか?
ドキュメントには次のように記載されています。
サービスがローカル アプリケーションによってのみ使用され、プロセス間で動作する必要がない場合は、クライアントがサービス内のパブリック メソッドに直接アクセスできるようにする独自の Binder クラスを実装できます。
ただし、サービスがクライアントと同じプロセスで実行されている場合は、ConcurrentLinkedQueue などのスレッドセーフな構造を使用してデータを交換できます。
android - バインドせずにメッセージをサービスに送信する
Androidで拡張して1つのサービスを作成し、 と を使用してサービスService
に送信しています。Message
Messenger
Handler
しかし、問題 (これは一般的な動作ですが) は、サービスにメッセージを送信する必要があるときはいつでも送信する必要がbind
あり、活動をunbind
停止すると、最終的にサービス自体を破壊する必要があります。
フリンジ メソッドを使用してバックグラウンドでサービスを実行し続けることができますが、活動を停止したときにサービスを破棄したくないため、startService
使用せずにメッセージをサービスに送信する方法はありますか。bind