58

2 つの矛盾する点に気付いたとき、Android でサービスのドキュメントを調べていました。

サービスドキュメントでは、サービスのライフサイクルの管理で指定されています

これら 2 つのパスは完全に分離されているわけではありません。つまり、startService() で既に開始されているサービスにバインドできます。たとえば、バックグラウンド ミュージック サービスは、再生する音楽を識別するインテントで startService() を呼び出すことによって開始できます。後で、ユーザーがプレーヤーを制御したり、現在の曲に関する情報を取得したりする場合は、bindService() を呼び出してアクティビティをサービスにバインドできます。このような場合、stopService() または stopSelf() は、すべてのクライアントがバインドを解除するまで、実際にはサービスを停止しません。

ただし、バインドされたサービスのライフサイクルの管理のバインドされたサービスに関するドキュメントでは

ただし、onStartCommand() コールバック メソッドを実装することを選択した場合は、サービスが開始されたと見なされるため、サービスを明示的に停止する必要があります。この場合、サービスは、クライアントにバインドされているかどうかに関係なく、サービスが stopSelf() で停止するか、別のコンポーネントが stopService() を呼び出すまで実行されます。

それは私かもしれませんが、ステートメントは矛盾していると思います。誰か明確にしてください...

4

3 に答える 3

61

実際、両方の段落は互いに補完し合い (言葉遣いは誤解を招く可能性がありますが)、両方の段落はドキュメントのイメージと一致しています。みてみましょう:

これら 2 つのパスは完全に分離されているわけではありません。つまり、startService() で既に開始されているサービスにバインドできます。たとえば、バックグラウンド ミュージック サービスは、再生する音楽を識別するインテントで startService() を呼び出すことによって開始できます。後で、ユーザーがプレーヤーを制御したり、現在の曲に関する情報を取得したりする場合は、bindService() を呼び出してアクティビティをサービスにバインドできます。このような場合、stopService() または stopSelf() は、すべてのクライアントがバインドを解除するまで、実際にはサービスを停止しません。

本質は次のとおりです。サービスを開始し、クライアントをバインドしてから停止しようとすると、すべてのクライアントがバインド解除されるまでサービスは停止 (破棄) されません。2 番目の段落は矛盾しておらず、このステートメントを洗練しています。

ただし、onStartCommand() コールバック メソッドを実装することを選択した場合は、サービスが開始されたと見なされるため、サービスを明示的に停止する必要があります。この場合、サービスは、クライアントにバインドされているかどうかに関係なく、サービスが stopSelf() で停止するか、別のコンポーネントが stopService() を呼び出すまで実行されます。

これは、明示的に停止されるまで、クライアントがバインドされていなくても、開始およびバインドされたサービスが実行されることを意味します。確かに、文言はおそらくこれについてもう少し明確かもしれません。ただし、ドキュメントに記載されているライフサイクル図はこれを示しています(現在、頭の上に直接的な例はありませんが、これを「実際の生活」ですでに観察したと確信しています):

開始およびバインドされたサービスのライフサイクル

于 2013-06-18T20:19:24.603 に答える