サービス:今日はAndroidの重要な部分の4つの主要コンポーネントを探ります。
どのようにサービスの重要な?
「ブルーウィロー学校」の記事では、このようなシーンを見て前に、非常に興味深い、私はのは、最終的に多くの問題があるだろう、サービスの無知を見てみましょう、あなたと共有したいです。
シーン:あなたが活動にプログレスバーをネットワーク上のアプリケーションからファイルをダウンロードし、表示された場合は、活動この要件は、画面を転送することができます。Actvitiyが時に転送画面を再起動しますので、どのようにそれを正しく表示するためにダウンロードプログレスバーの進捗状況を確実にするには?
サービスは、一般的に、このプログラムから出て来てほしい人ではありません。
-
- 前進はキャッシュに画面を表示し、その後、読み出した画面に変わります。
-
- 使用し
android:configChanges
た設定なので、スイッチにはない画面の活動破壊と再建います。
- 使用し
第一の態様について、実際には、抜け穴の完全な反映しています。まず、画面の転送のプロセス、私たちはこれに対処する方法を、比較的時間のかかるの活動を再構築し、数百ミリ秒があるかもしれない、あるいは長く、この時間は、ダウンロードスレッドはまだ仕事で一貫性のない進行で、進行し、確かに保存されたことを知っています問題は?
2番目のプログラムは、我々は彼らの実際のプロジェクトについての考え方を拡張することができ、水平および垂直方向のレイアウトContentViewの問題に対処するために何か余分な操作を行う必要があるかもしれません。
サービスの場合は、任意の良いアイデアを持っていますか?これは、コメント領域に与えられるかもしれません。
サービスは、それが起動するには、いくつかの方法があり、それを聞いている必要がありますか?
サービスはバックグラウンドで操作を実行するのに長い時間のために特化したクラスで、それはUIのユーザーとの対話を作成しません。これは、2つの開始を提供しています。
- 開始
、他のコンポーネントの呼び出しがstartService()
サービスを開始します。開始すると、サービスは、サービスのスタートアップのコンポーネントが破棄された場合であっても、バックグラウンドで実行されています。通常、サービスの開始は、バックグラウンドで別の操作を実行しますが、それは部品の結果を返します起動する必要はありません。自分自身を呼び出すためのサービス場合のみ、stopSelf()
コールのか、他のコンポーネントがstopService()
終了します。- バインド
他のコンポーネントを呼び出すことができるbindService()
サービスをバインドします。サービスは、サービスバインド解除操作が自動的に実行されるコンポーネントの破壊を始めたときに、この方法及びその構成要素は、バインドを開始します。サービスは、部品点数と結合することができるすべての操作がバインド解除が行われる場合にのみ、結合成分は、サービスが破壊されます。
もちろん、サービスは、上記の二つの方法で実行することができます。これは、2のコールバックメソッドサービスの実行が含ま:onStartCommand()
(。サービスは方法によって開始スタートコールバックメソッドを)、 onBind()
(スタートサービスバインドによるコールバックメソッド)。
かどうかは(起動、バインド、開始&そのようにサービスを開始するには 、バインド) コンポーネント(他のアプリケーションの偶数成分)のいずれかのサービスを使用することができます。そして、意図パラメータを渡します。もちろん、あなたはまた、サービスできるAndroidMenifest.xml
プライベートファイルに構成されたが、アクセスする他のアプリケーションを許可していません。
android:exported
プロパティは、明示的にもテントが(明示的な意図を使用していても)動作しません、他のアプリケーションは、本出願の組み立てを開始することはできませ意味、falseに設定されています 。これを防止する他のアプリケーションは、あなたのサービスコンポーネントを起動します。
サービスライフサイクル
我々は常にそのライフサイクルを勉強したい、アセンブリに付属していますが、ショーへのマップと、この時間は、間違いなく最高です。
这两条路径并不是毫不相干的。当调用 startService()
去 start 一个 Service 后,你仍然可以 bind 这个 Service。比如:当播放音乐的时候,需要调用 startService()
启动指定的音乐,当需要获取该音乐的播放进度的时候,又需要调用 bindService()
,在这种情况下,除非 Service 被 unbind,此前调用 stopService()
和 stopSelf()
都不能停止该 Service。
这些生命周期方法在使用的时候并不需要调用各自的父类方法。
两条生命周期路径都可以包含两个嵌套的生命周期:
-
完整生命周期(entire lifetime):从
onCreate()
被调用,到onDestroy()
返回。和 Activity 类似,一般在onCreate()
方法中做一些初始化的工作,在onDestroy()
中做一些资源释放的工作。如,若 Service 在后台播放一个音乐,就需要在onCreate()
方法中开启一个线程启动音乐,并在onDestroy()
中结束线程。 - 活动生命周期(activity lifetime):从
onStartCommand()
或onBind()
回调开始,由相应的startService()
或bindService()
调用。start 方式的活动生命周期结束就意味着完整证明周期的结束,而 bind 方式,当onUnbind()
返回后,Service 的活动生命周期结束。
值得注意的是,无论是
startService()
还是bindService()
启动 Service,onCreate()
和onDestroy()
均会被回调。
Service 的 onCreate() 可以执行耗时操作吗?
Service 运行在主线程中,它并不是一个新的线程,也不是新的进程,所以并不能执行耗时操作。
那如果要在 Service 中执行耗时操作,怎么做?
我想基本所有人都能想到使用 Thread,事实上我们也经常这么做。需要在主线程执行耗时操作,无非就是开一个线程,然后一阵混沌操作。当然,你还可以使用 AysncTask
或 HandlerThread
来替代 Thread 创建线程。
当然没有问题,那还有其它更有意思的方式吗?
有,当然有,IntentService 就是一个不错的选择。
纷繁复杂的 IntentService
IntentService
继承于Service
,若 Service 不需要同时处理多个请求,那么使用IntentService
将是最好选择。你只需要重写onHandleIntent()
方法,该方法接收一个回调的 Intent 参数,你可以在方法内进行耗时操作,因为它默认开启了一个子线程,操作执行完成后也无需手动调用stopSelf()
方法,onHandleIntent()
将会自动调用该方法。
使用 IntentService 的要点如下:
- 默认在子线程中处理回传到
onStartCommand()
方法中的 Intent; - 在重写的
onHandleIntent()
方法中处理按时间排序的 Intent 队列,所以不用担心多线程(multi-threading)带来的问题。 - 当所有请求处理完成后,自动停止 Service,无需手动调用
stopSelf()
方法; - 默认实现了
onBind()
方法,并返回 null; - 默认实现了
onStartCommand()
方法,并将回传的 Intent 以序列的形式发送给onHandleIntent()
,您只需重写该方法并处理 Intent 即可。
小结
私たちは、実際のシーンのために心に概念を関連するサービス、サービスの利用を知っているか、またはサービスを使用するかどうかを決定する前に、特定の分析を行うと。サービスはまだメインスレッドで呼び出され、または仕事の長い時間を処理するためのスレッドを開くようにするので、サービスおよびUIの対話も、このアプローチはあまり簡単になります。あなたが唯一の存在ではいくつかの時間のかかる操作のインタフェースを行うために必要がある場合は、インタフェースが終了するか、変更する場合、作業を中止しなければならない、そして、使用することは、直接スレッド(またはAsyncTask、ThreadHandler)あなたのためのより適切であろう。
最後に、学ぶためのプログラマー、コンテンツの知識のために、自分自身を向上させるだけ排除すべきでない、あまりにも多くの技術的、環境的順序があり、常に私たちは環境ではなく、私たちに適応する環境に適応するためには!
ここでのセットの数十に関連した上記技術的システム図添付の質問は、19年テンセント、見出し、アリ、米国のグループと他の企業が直面している技術は、終点のビデオとPDF(実際には、予想以上に多くの時間を費やす)となっており、含む知識のコンテキスト+多くの詳細ここではあなたにそれの一部を表示する絵の形で、紙面の都合で、。
私はそれがあなたの収穫の多くをもたらすと信じて:
[上記のHD脳図]、および私を追加することができ、[サポート] PDF技術アーキテクチャは、WX:X1524478394の無料アクセスを!
ときに簡単にプログラマ、優れたプログラマがシニアアーキテクトへのプライマリから上級プログラマー、建築家にジュニアプログラマから学ぶ必要があるとき、または技術的な管理から管理、テクニカルディレクターの各段階に私たちは、さまざまな機能を持っている必要があります。初期の研究では、キャパシティビルディングで仲間を投げるためには、自分のキャリアの方向性を決定します。