So now we have a simple service.
Wasn't that easy?
But it still doesn't wake itself up.
Fortunately, there's a system service for that.
This is a good opportunity to introduce the alarm manager.
The alarm manager allows you to tell the system that you want it to
wake a component of your application up after a period of time and
do some processing in the background.
You can even have it wake up your application periodically, but
what do we wake up in the background?
That would be an Android component we haven't seen before,
called a broadcast receiver.
A broadcast receiver is a special class that is used to receive
intent broadcasts, often from other applications.
Typically, a broadcast receiver will register an intent filter for
these broadcasts.
It's also one way the application will listen in on alarms.
Alarms take advantage of a new kind of intent, called a PendingIntent.
A PendingIntent is a special kind of intent
that is handed from one application to another.
The big difference between a PendingIntent and a regular intent
is that a PendingIntent gives permission for the app using it to send data with
the same permissions and application identity as the app that created it.
In Android this allows the system process to call your application back
in a specific asynchronous way without compromising the Android security model.
In alarms a pending intent is used by the alarm manager
to talk to the broadcast receiver we create.
Let's add some alarm stuff.
First, I'm going to add a BroadcastReceiver as a static inner
class of SunshineService.
Since this is an Android component,
I'll register this broadcast receiver in the manifest.
Note the way a static inner class is notated.
Okay.
I've given you the bones of a broadcast receiver that can handle an alarm.
But now it's your turn.
You can create a PendingIntent from an explicit intent
to have the alarm manager activate your broadcast receiver.
I recommend setting the alarm to something absurdly short,
like five seconds, so you can easily test that it's working.
.لدينا الآن خدمة بسيطة
ألم يكن الأمر سهلاً؟
.ولكنها لا توقظ نفسها بعد
لحسن الحظ، يوجد .خدمة نظام لذلك
وهذه فرصة جيدة .لتقديم مدير التنبيهات
يتيح لكم مدير التنبيهات إمكانية إخبار النظام برغبتكم في
أن يوقظ مكونًا في التطبيق ،بعد فترة زمنية
.والقيام ببعض المعالجات في الخلفية
يمكنكم حتى جعله يوقظ التطبيق بصفة دورية، ولكن
ما الذي نوقظه في الخلفية؟
سيكون ذلك مكونًا ،لـ Android لم نرَه من قبل
.ويسمى مستقبل البث
مستقبل البث عبارة عن فئة خاصة تُستخدم لاستقبال
عمليات البث الهدف .من التطبيقات الأخرى في الغالب
عادةً، يسجل مستقبل البث عاملاً لتصفية الأهداف
.لعمليات البث هذه
وتلك طريقة أيضًا لكي .يستمع التطبيق إلى التنبيهات
تستفيد التنبيهات بنوع جديد .من الأهداف يسمى PendingIntent
PendingIntent عبارة عن نوع خاص من الهدف
يتم تسليمه من .تطبيق إلى آخر
يتمثل الاختلاف الكبير بين PendingIntentوالهدف العادي
في أن PendingIntent يمنح إذنًا للتطبيق الذي يستخدمه بأن يرسل البيانات
بنفس الأذونات وهوية التطبيق .مثل التطبيق الذي أنشأه
في Android، يسمح هذا الأمر لعملية النظام باستدعاء التطبيق
بطريقة معينة غير متزامنة دون .اختراق نموذج الأمان في Android
في التنبيهات، يُستخدم الهدف المعلق بواسطة مدير التنبيهات
للتحدث إلى مستقبل .البث الذي أنشأناه
.لنضِف بعض المحتوى الخاص بالتنبيه
بدايةً، سأضيف BroadcastReceiverكفئة داخلية ثابتة
.لـ SunshineService
،بما أن هذا مكون Android
سأسجل مستقبل البث هذا .(في manifest (البيان
لاحظوا طريقة تعليم .الفئة الداخلية الثابتة
.حسنًا
لقد أعطيتكم أساسيات مستقبل .البث التي يمكنها معالجة تنبيه
.لكن حان دوركم الآن
يمكنكم إنشاء PendingIntent من هدف صريح
لكي تسمح لمدير التنبيهات .بتنشيط مستقبل البث
من المستحسن إعداد التنبيه ،لفترة قصيرة غير معقولة
على سبيل المثال خمس ثوانٍ، بحيث .يمكنكم اختبار عمله بسهولة
これで単純なServiceができました 簡単でしたね
しかしまだ自分で起動できません
幸運にもそのためのシステムがあります
AlarmManagerを導入するよい機会です
AlarmManagerは一定時間経過後に
起動したいアプリケーションコンポーネントを システムに告げて
バックグラウンドでいくつかの処理を させることができます
アプリを定期的に起動することもできますが
バックグラウンドでは 何を起動させればいいでしょうか？
それはBroadcastReceiverと呼ばれる
まだ紹介していないAndroidコンポーネントです
BroadcastReceiverは特別なクラスで
他のアプリからIntentBroadcastを 頻繁に受信するために使用します
通常BroadcastReceiverはこれらの ブロードキャストのために
IntentFilterを登録します
またアプリがアラームをlistenする 1つの方法でもあります
アラームはPendingIntentという 新しいインテントを活用します
PendingIntentとは あるアプリから別のアプリに渡される
特別な種類のインテントです
通常のインテントとの大きな違いは 作成したインテントを他のアプリに渡すことで
他のアプリに対して 同じpermissionとIDを送信して
指定した操作を実行する権限を付与する 機能を持つことです
これによってAndroidのセキュリティモデルに 不正アクセスすることなく
特定の非同期的方法によるアプリのコールバックを システムプロセスに許可します
AlarmManagerはPendingIntentを使って
私たちが作成した BroadcastReceiverと話します
では アラームを追加しましょう
最初にBroadcastReceiverを
SunshineServiceの 静的な内部クラスとして加えます
これはAndroidコンポーネントなので
マニフェストにBroadcastReceiverを登録します
静的な内部クラスの書き方に 注意してください
アラームを扱えるBroadcastReceiverの 骨格を与えたので
今度は皆さんの出番です
AlarmManagerにBroadcastReceiverを アクティベートさせる明示的インテントから
PendingIntentを作成できます
アラームは極端に短く 5秒くらいに設定することをお勧めします
そうすると機能している様子を 簡単にテストできます
Agora nós temos um serviço simples.
Este não foi fácil?
Mas agora é a sua vez.
Então agora temos um serviço simples.
Não foi fácil?
Mas ele ainda não desperta sozinho.
Felizmente, há um serviço do sistema para isso.
Esta é uma boa oportunidade para eu apresentar o gerenciador de alarme.
O gerenciador de alarme permite que você diga ao sistema que deseja que ele
desperte um componente de seu aplicativo depois de um período de tempo e
faça algum processamento em segundo plano.
Você pode até mesmo fazer com que ele desperte seu aplicativo periodicamente, mas
o que então despertamos em segundo plano?
É um componente do Android que não vimos anteriormente.
Ele se chama broadcast receiver.
Um broadcast receiver é uma classe especial usada para receber
transmissões pretendidas, frequentemente de outros aplicativos.
Um broadcast receiver tipicamente registra um filtro de intenção
dessas transmissões.
Ele é também uma forma de o aplicativo escutar alarmes.
Os alarmes se valem de um novo tipo de intenção chamado PendingIntent.
Um PendingIntent é um tipo especial de intenção
que é passado de um aplicativo para outro.
A grande diferença entre um PendingIntent e uma intenção normal
é que um PendingIntent permite que o aplicativo que o utiliza envie dados com
permissões e identidade de aplicativo iguais às do aplicativo que o criou.
No Android, isso permite que o processo do sistema chame de volta seu aplicativo
de uma forma assíncrona específica, sem comprometer o modelo de segurança do Android.
Nos alarmes, uma intenção pendente é usada pelo gerenciador de alarme
para falar com o broadcast receiver que o criou.
Vamos adicionar algum alarme.
Em primeiro lugar, vou adicionar um BroadcastReceiver na forma de classe interna
estática do SunshineService.
Como ele é um componente do Android,
vou registrar esse broadcast receiver no arquivo manifest.
Observe a forma em que a classe interna estática é representada.
Certo.
Vou dar a você a estrutura de um broadcast receiver que pode tratar um alarme.
Mas agora é sua vez.
Você pode criar um PendingIntent a partir de uma intenção explícita,
para que o gerenciador de alarme ative seu broadcast receiver.
Eu recomendo que você configure o alarme para tocar depois de um tempo bastante curto,
como cinco segundos, de modo que você possa testar com facilidade se ele está funcionando.
Giờ ta đã có một service đơn giản.
Nó có dễ không?
Nhưng nó vẫn chưa tự đánh thức được nó.
May mắn là, có một system service để làm điều này.
Đây là cơ hội tốt để giới thiệu Alarm manager.
Alarm manager cho phép bạn nói với system là bạn muốn nó
đánh thức một phần của app bạn sau một khoảng thời gian
và làm vài thứ linh tinh trong background.
Bạn có thể dùng nó để đánh thức app của bạn một cách định kỳ,
nhưng điều gì đánh thức chúng ta ở trong background?
Đó là một Android component mà ta chưa từng thấy trước đây,
gọi là một broadcast receiver.
Một broadcast receiver là một class đặc biệt dùng để
nhận intent broadcasts, thường xuyên từ apps khác.
Thông thường, một broadcast receiver sẽ đăng ký một intent filter
cho những broadcasts này.
Nó cũng là một cách để app sẽ lắng nghe báo thức.
Alarms sẽ lợi dụng một loại mới của intent, gọi là PendingIntent.
Một PendingIntent là một loại đặc biệt của intent
mà nó được giao từ ứng dụng này tới ứng dụng khác.
Sự khác biệt lớn nhất giữa một PendingIntent và một intent bình thường
là PendingIntent trao quyền cho app dùng nó để gửi data
với cùng permission và app identify như ứng dụng mà tạo ra nó.
Trong Android điều này cho phép hệ system process gọi app của bạn quay lại
theo một cách không đồng bộ mà không ảnh hưởng tới mô hành bảo mật của Android.
Trong alarms một pendingIntent được dùng bởi Alarm manager
để nói với broadcast recẻiver mà ta tạo.
Hãy thêm vài cái alarm.
Đầu tiên, ta sẽ thêm một BroadcastReceiver như một static inner class
của SunshineService.
Vì đây là một Android component,
Tôi sẽ đăng ký broadcast receiver này trong manifest.
Chú ý cách một static inner class được ký hiệu.
Okay.
Tôi đã đưa bạn bộ xương của một broadcast receiver mà có thể xử lý một alarm.
Và giờ là lượt của bạn.
Bạn có thể tạo một PendingIntent từ một explixit intent
để có alarm manager khởi động broadcast receiver của bạn.
Tôi khuyên bạn nên đặt alram báo động trong khoảng thời gian ngắn
như 5 giây, để bạn có thể dễ dàng test nó có hoạt động không.
现在我们拥有了简单的服务。
很容易吧？
但它仍无法自行唤醒。
幸运的是， 有相应的系统服务。
借此机会向大家 介绍警报管理器。
利用警报管理器， 可以告知系统您想它
在一段时间后唤醒 应用程序的组件，
并在后台进行一些处理。
甚至可以让系统 定期唤醒应用程序，
但在后台要唤醒什么？
那是我们之前 未见过的 Android 组件，
它叫做广播接收器。
广播接收器是特殊的类， 用于接收
通常来自其他 应用程序的意图广播。
通常，广播接收器 会为这些广播注册
意图筛选器。
它也是应用程序侦听 警报的一个途径。
警报利用一种称为 PendingIntent 的新意图。
PendingIntent 是 一种特殊的意图，
它在应用程序 之间传递。
PendingIntent 和常规意图 最大的区别在于
PendingIntent 为使用它的 应用程序提供权限，以发送
具有相同权限的数据，并将 应用程序标识指定为创建它的应用。
在 Android 中，这允许系统 进程在不破坏 Android 安全模型
的情况下通过特定的异步 方式回调应用程序。
在警报中，警报管理器 使用待定的意图
与我们创建的广播 接收器通信。
让我们添加一些警报内容。
首先，我将 BroadcastReceiver 添加为
SunshineService 的静态内部类。
由于其为 Android 组件，
因此我将在清单中 注册该广播接收器。
请注意如何用符号 来表示静态内部类。
好了。
我已经提供了可以处理 警报的广播接收器的框架。
现在轮到您发挥了。
您可以从显式意图 创建 PendingIntent，
以让警报管理器 激活您的广播接收器。
建议您将警报 设置为特别短，
例如五秒钟，以便 测试警报是否有效。