Статьи

Руководство по Android AlarmManager

При написании приложения возникает необходимость запланировать выполнение кода в будущем. Вам может потребоваться AlarmManager для планирования вашей работы в указанное время. AlarmManager получает доступ к системной сигнализации и планирует выполнение кода, даже когда приложение не запущено.

Информация о проекте: Мета-информация о проекте. Версия платформы: 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 () нуждается в четырех аргументах:

  1. тип тревоги,
  2. время запуска: установите текущее время
  3. интервал в миллисекундах: в этом примере мы проходим 5 секунд (1000 * 5 миллисекунд)
  4. в ожидании намерения: он будет зарегистрирован с этим сигналом тревоги. Когда сработает сигнализация, будет передано ожидающее намерение.

cancelAlarm () : Этот метод отменяет ранее зарегистрированный сигнал тревоги, вызывая метод cancel (). Метод cancel () принимает pendingIntent в качестве аргумента. Значение pendingIntent должно соответствовать одному, только тогда метод cancel () может удалить тревогу из системы.

onetimeTimer (): этот метод создает одноразовый сигнал тревоги. Это может быть достигнуто путем вызова метода set (). Метод set () принимает три аргумента:

  1. тип тревоги
  2. время срабатывания
  3. намерение в ожидании
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'
       xmlns:android='http://schemas.android.com/apk/res/android'>
 
   <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 .