3

I'm facing a strange problem with my app. I have a LocationService that runs in the background. The way I manage its lifecycle is:

  1. In onResume, every activity uses bindService(intent,serviceConnection, BIND_AUTO_CREATE) like that the service is automatically created when needed.
  2. In onStop, every activity uses unbindService(serviceConnection)
  3. This works because when switching activities, the new Activity onResume is called before the old Activity onStop method

The problem I have is, lets say I start from the home screen and I launch the app with an Activity that has a fragment in it. The order of the function call is as follows

  1. Activity onCreate --> setContentView is called here
  2. Activity onResume --> here bindService is called and should create the Service
  3. Fragment onResume
  4. Service onBind method is called

My question is why is there a something else between my bindServiceand onBind calls?? I have a feeling this has something to do with threading issues.

4

2 に答える 2

3

これはあまり良い答えではありませんが、あなたbindService()onBind()呼び出しの間に何か他のものがないのはなぜでしょうか? bind を呼び出すと、システムはすぐにサービスを作成して開始すると想定しているようですが、そのような保証は提供されません。

あなたIntentServiceのサービスが .

また、サービスが返さServiceConnectionれた後、予想どおり、オブジェクトが呼び出されると想定しています。onBind()

ServiceConnectionこれは、決定的なものを読んだことに基づいているのではなく、同様の経験があったためです。サービスの onBind から非常に迅速に戻ったにもかかわらず、サービスが作成されて呼び出されるまでにどれだけの時間がかかったかに驚き、イライラしました。(私のフラグメントは、初期 UI を作成するためにサービスからのデータを必要としたため、サービスの作成が遅れると、ユーザーへの初期 UI の表示が遅れることになります。)

最終的に、バインドではなくインテントを使用してサービスを起動することにしました。

Intent si = new Intent( this, com.company.MyService.class );
si.setAction( MyService.SVC_BIND );
startService( si );

次に、MyService.SVC_UNBINDunbind を呼び出す代わりに送信しました。サービスで UNBIND インテントを受け取ったら、クリーンアップしてから を呼び出しますstopSelf()。これらはユーザー アクションです。使用方法に合わせて名前を付けただけです。

これはより高速だったと思いますが、そのコードからのコメントを振り返ってみると、詳細はわかりません。これは no を意味することに注意してください。ただしServiceConnection、アクティビティからサービスへの直接呼び出しを行っておりLocalBroadcastManager、かなりの量を使用しています。

考慮すべきもう 1 つのオプション (サービスをより迅速に開始するために、それがここでの目標である場合は??) をAppliction.onCreate()待つのではなく、 で起動することですActivity.onResume()。これらのオプションはすべて、サービスをいつ停止するかを決定するために、いくつかの追加作業を行う必要があります。

于 2013-04-08T03:01:50.027 に答える
0

私の場合、私の問題は、パフォーマンスを向上させるはずのAndroidマニフェスト内の要素にandroid:process属性を使用し<service>ていましたが、実際には、サービスが実行されるとおそらくそうですが、到達するのに非常に長い時間がかかりますonCreate()(到達するのにも非常に時間がかかります) onBind())。私にとっては数分かかりました。アプリとサービスがスムーズに動作し、期待どおりに動作するようになりました。

詳細: https://developer.android.com/guide/topics/manifest/service-element

于 2022-02-24T11:09:34.717 に答える