1

サービスに関しては疑問があります。

サービスがバックグラウンドで実行されていることは知っていますが、サービス内にスレッドを作成する必要があると思いました。そうしないと、メイン スレッドがブロックされ、ANR エラーが発生します。

私はそれを手に入れたと思いました!しかし、その後、Android 開発者ガイドでこれを読みました。

…ユーザーが同じアプリケーションからアクティビティを操作しているときに、サービスが集中的な操作またはブロック操作を実行すると、サービスはアクティビティのパフォーマンスを低下させます。アプリケーションのパフォーマンスに影響を与えないようにするには、サービス内で新しいスレッドを開始する必要があります。>

この段落では、「集中操作またはブロック操作」について言及されていますが、ANR エラーについては言及されておらず、パフォーマンスについて言及されています。では、サービスはどのように機能するのでしょうか。

アクティビティがサービスを開始するとします。サービスはデフォルトでメイン スレッドのバックグラウンドで実行されますか? つまり、サービスの実行中にアクティビティを引き続き使用できますが、アクティビティとサービスがメイン スレッドのリソースを共有しているため、アクティビティのパフォーマンスが低下し、サービスが CPU を集中的に使用する作業を行っている場合、サービスが終了する可能性があります。アクティビティが使用するリソースがなく、最終的に ANR エラーが発生します。

ベスト プラクティス (ただし、サービスが軽い作業を行っている場合は必ずしもそうとは限りません) は、サービス内で新しいスレッドを開始することです。これで、アクティビティとサービスは独自のスレッドのリソースを使用します。その後、アクティビティを閉じることができますが、Android はサービス スレッドを維持します。

あれですか?ありがとう =)

4

1 に答える 1

1

サービス内に必ずスレッドを作成する必要があると思いました。そうしないと、メイン スレッドがブロックされ、ANR エラーが発生します。

正しい。

この段落では、「集中操作またはブロック操作」について言及されていますが、ANR エラーについては言及されておらず、パフォーマンスについて言及されています。

ドキュメントのこの部分を改善するために、 http://b.android.comでバグ レポートを提出してください。:-)

サービスはデフォルトでメイン スレッドのバックグラウンドで実行されますか?

Serviceなどの のライフサイクル メソッドは、メイン アプリケーション スレッドで呼び出されます。のような一部のサービスは、バックグラウンド スレッド (たとえば、 用) を提供しますが、これは の特定のサブクラスに固有のものです。onCreate()onStartCommand()IntentServiceonHandleIntent()Service

最終的に ANR エラーが発生します。

はい。

ベスト プラクティス (ただし、サービスが軽い作業を行っている場合は必ずしもそうとは限りません) は、サービス内で新しいスレッドを開始することです。これで、アクティビティとサービスは独自のスレッドのリソースを使用します。その後、アクティビティを閉じることができますが、Android はサービス スレッドを維持します。

基本的に、はい。ここで、「軽作業」とはミリ秒程度以下のはずです。また、あなたが行うかもしれないいくつかのことは自然に非同期である (例えば、 を介して曲を再生するMediaPlayer) ため、Serviceそれ自体はそれ自身のスレッドを必要としないかもしれません。

于 2013-09-21T01:28:48.597 に答える