Информация о проекте: Мета-информация о проекте. Версия платформы: Android API Level 10.
IDE: Eclipse Helios Service Release 2
Эмулятор: Android 4.1
Обязательное условие: предварительные знания инфраструктуры приложений Android и приемника Intent Broadcast.
AlarmManager:
AlarmManager имеет доступ к системным службам сигнализации. С помощью AlarmManager вы можете запланировать выполнение кода в будущем. Объект AlarmManager не может быть создан напрямую, однако его можно получить, вызвав Context.getSystemService (Context.ALARM_SERVICE) . AlarmManager всегда регистрируется с намерением. Когда срабатывает сигнал тревоги, намерение, зарегистрированное в AlarmManager, транслируется системой автоматически. Это намерение запускает целевое приложение, если оно не запущено. Рекомендуется использовать AlarmManager, когда вы хотите, чтобы код вашего приложения запускался в определенное время, даже если ваше приложение в данный момент не запущено. Для других операций синхронизации следует использовать обработчик, потому что он прост в использовании. Обработчик рассматривается в другом уроке.
| метод | Описание |
|---|---|
| поставил() | Расписание будильника на один раз. |
| setInexactRepeating () | Графики тревоги с неточным повторением. Время запуска не следует строгим ограничениям. |
| setRepeating () | Расписание будильника с точным повторением времени. |
| установить время() | Устанавливает время настенных часов системы. |
| setTimeZone () | Устанавливает часовой пояс системы по умолчанию. |
Проверьте документацию AlarmManager для получения дополнительной информации.
В этом уроке мы научимся создавать одноразовый таймер и повторяющийся таймер, а также отменять повторяющийся таймер. Здесь таймер и будильник были использованы взаимозаменяемо, но в этом учебном контексте оба они имеют одинаковое значение.
Пример кода:
Давайте создадим три кнопки запуска повторяющегося таймера, отмены повторяющегося таймера и одноразового таймера в файле макета. Эти кнопки прикреплены с методы, т.е. startRepeatingTimer, cancelRepeatingTimer и onetimeTimer соответственно. Эти методы будут определены в классе Activity. Файл макета показан ниже (activity_alarm_manager.xml).
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
|
<linearlayout android:layout_height='match_parent' android:layout_width='match_parent' android:orientation='vertical' <button android:id='@+id/btStart' android:layout_height='wrap_content' android:layout_width='match_parent' android:onclick='startRepeatingTimer' android:padding='@dimen/padding_medium' android:text='@string/btStart' tools:context='.WidgetAlarmManagerActivity'/> <button android:id='@+id/btCancel' android:layout_height='wrap_content' android:layout_width='match_parent' android:onclick='cancelRepeatingTimer' android:padding='@dimen/padding_medium' android:text='@string/btCancel' tools:context='.WidgetAlarmManagerActivity'/> <button android:id='@+id/btOneTime' android:layout_height='wrap_content' android:layout_width='match_parent' android:onclick='onetimeTimer' android:padding='@dimen/padding_medium' android:text='@string/btOneTime' tools:context='.WidgetAlarmManagerActivity'/> </linearlayout> |
Мы собираемся определить BroadcastReciever, который обрабатывает намерение, зарегистрированное в AlarmManager. В данном классе был определен метод onReceive (). Этот метод вызывается, как только намерение получено. Как только мы получаем намерение, мы пытаемся получить дополнительный параметр, связанный с этим намерением. Этот дополнительный параметр определяется пользователем, т.е. ONE_TIME, в основном указывает, было ли это намерение связано с одноразовым таймером или повторяющимся. Как только значение параметра ONE_TIME было извлечено, отображается соответствующее сообщение. Также были определены вспомогательные методы, которые можно использовать из других мест с помощью объектов, например, методов setAlarm (), cancelAlarm () и onetimeTimer () . Эти методы также могут быть определены где-то еще для выполнения операций с таймером, т. Е. Установки, отмены и т. Д. Чтобы этот учебник был простым, мы определили его в BroadcastReceiver.
setAlarm (): этот метод устанавливает повторяющуюся тревогу с помощью метода setRepeating (). Метод setRepeating () нуждается в четырех аргументах:
- тип тревоги,
- время запуска: установите текущее время
- интервал в миллисекундах: в этом примере мы проходим 5 секунд (1000 * 5 миллисекунд)
- в ожидании намерения: он будет зарегистрирован с этим сигналом тревоги. Когда сработает сигнализация, будет передано ожидающее намерение.
cancelAlarm () : Этот метод отменяет ранее зарегистрированный сигнал тревоги, вызывая метод cancel (). Метод cancel () принимает pendingIntent в качестве аргумента. Значение pendingIntent должно соответствовать одному, только тогда метод cancel () может удалить тревогу из системы.
onetimeTimer (): этот метод создает одноразовый сигнал тревоги. Это может быть достигнуто путем вызова метода set (). Метод set () принимает три аргумента:
- тип тревоги
- время срабатывания
- намерение в ожидании
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
package com.rakesh.alarmmanagerexample;import java.text.Format;import java.text.SimpleDateFormat;import java.util.Date;import android.app.AlarmManager;import android.app.PendingIntent;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.os.Bundle;import android.os.PowerManager;import android.widget.Toast;public class AlarmManagerBroadcastReceiver extends BroadcastReceiver { final public static String ONE_TIME = 'onetime'; @Override public void onReceive(Context context, Intent intent) { PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, 'YOUR TAG'); //Acquire the lock wl.acquire(); //You can do the processing here. Bundle extras = intent.getExtras(); StringBuilder msgStr = new StringBuilder(); if(extras != null && extras.getBoolean(ONE_TIME, Boolean.FALSE)){ //Make sure this intent has been sent by the one-time timer button. msgStr.append('One time Timer : '); } Format formatter = new SimpleDateFormat('hh:mm:ss a'); msgStr.append(formatter.format(new Date())); Toast.makeText(context, msgStr, Toast.LENGTH_LONG).show(); //Release the lock wl.release(); } public void SetAlarm(Context context) { AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE); Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class); intent.putExtra(ONE_TIME, Boolean.FALSE); PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0); //After after 5 seconds am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000 * 5 , pi); } public void CancelAlarm(Context context) { Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class); PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, 0); AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); alarmManager.cancel(sender); } public void setOnetimeTimer(Context context){ AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE); Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class); intent.putExtra(ONE_TIME, Boolean.TRUE); PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0); am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), pi); }} |
Ниже приведен файл манифеста. Здесь требуется разрешение WAKE_LOCK, поскольку активная блокировка используется при обработке в методе onReceive (), представленном в классе AlarmManagerBroadcastReceiver. AlarmManagerBroadcastReceiver был зарегистрирован как широковещательный приемник.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
|
<manifest android:versioncode='1' android:versionname='1.0' package='com.rakesh.alarmmanagerexample' <uses-sdk android:minsdkversion='10' android:targetsdkversion='15'/> <uses-permission android:name='android.permission.WAKE_LOCK'/> <application android:icon='@drawable/ic_launcher' android:label='@string/app_name' android:theme='@style/AppTheme'> <activity android:label='@string/title_activity_alarm_manager' android:name='com.rakesh.alarmmanagerexample.AlarmManagerActivity'> <intent-filter> <action android:name='android.intent.action.MAIN'/> <category android:name='android.intent.category.LAUNCHER' /> </intent-filter> </activity> <receiver android:name='com.rakesh.alarmmanagerexample.AlarmManagerBroadcastReceiver'> </receiver> </application></manifest> |
Теперь давайте определим класс деятельности, который определяет некоторые методы. Эти методы будут обрабатывать нажатия кнопок. Здесь, в этом классе, мы создаем экземпляр AlarmManagerBroadcastReciever, который поможет нам получить доступ к setAlarm (), cancelAlarm () и setOnetime (). Остальная часть кода легко понять.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
package com.rakesh.alarmmanagerexample;import com.rakesh.alarmmanagerexample.R;import android.os.Bundle;import android.app.Activity;import android.content.Context;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.widget.Toast;import android.support.v4.app.NavUtils;public class AlarmManagerActivity extends Activity { private AlarmManagerBroadcastReceiver alarm; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_alarm_manager); alarm = new AlarmManagerBroadcastReceiver(); } @Override protected void onStart() { super.onStart(); } public void startRepeatingTimer(View view) { Context context = this.getApplicationContext(); if(alarm != null){ alarm.SetAlarm(context); }else{ Toast.makeText(context, 'Alarm is null', Toast.LENGTH_SHORT).show(); } } public void cancelRepeatingTimer(View view){ Context context = this.getApplicationContext(); if(alarm != null){ alarm.CancelAlarm(context); }else{ Toast.makeText(context, 'Alarm is null', Toast.LENGTH_SHORT).show(); } } public void onetimeTimer(View view){ Context context = this.getApplicationContext(); if(alarm != null){ alarm.setOnetimeTimer(context); }else{ Toast.makeText(context, 'Alarm is null', Toast.LENGTH_SHORT).show(); } } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_widget_alarm_manager, menu); return true; }} |
Как только вы закончите с кодированием, просто запустите проект, и вы найдете приложение аналогичного типа, запущенное в вашем эмуляторе.
Пожалуйста, загрузите код AlarmManagerExample , если вам нужен код ссылки.
Приятного кодирования и не забудьте поделиться!
Ссылка: учебник по Android AlarmManager от нашего партнера по JCG Ракеша Кусата в блоге Code4Reference .