AlarmManager(알람시계 서비스)


이 섹션 소개:

이 섹션에서는 Android의 AlarmManager(알람 시계 서비스)를 소개합니다. 이름에서 알 수 있듯이 이를 통해 모바일 알람 시계 앱을 개발할 수 있습니다. 문서의 설명은 다음과 같습니다. 특정 순간에 지정된 Intent를 방송합니다. 간단히 말해서 시간을 직접 설정합니다. 그런 다음 시간이 다 되면 AlarmManager는 우리가 설정한 인텐트를 브로드캐스트합니다. 예를 들어 시간이 다 되면 특정 항목을 가리킬 수 있습니다. 활동 또는 서비스! 또한 공식 문서에는 주의해야 할 사항이 있습니다.

1.png
                또 다른 주의할 점은 앱이 특정 위치에 있더라도 AlarmManager가 특정 순간에 코드를 실행하는 데 주로 사용된다는 것입니다. 시간이 흐르고 있지 않습니다! 또한 API 19부터 알람 메커니즘이 정확하게 전달되지 않고 운영 체제가 알람 시계를 변환합니다. , 깨우기 및 배터리 사용량을 최소화합니다! 일부 새로운 API는 엄격하게 정확한 전달을 지원합니다. setWindow(int, long, long, PendingIntent) 및 setExact(int, long, PendingIntent). API 19 이전의 TargetSdkVersion 애플리케이션은 이전 동작을 계속 사용하며 필요할 때 모든 경보가 정확하게 전달됩니다. 다음번에는 정확하게 배송해드리겠습니다. 자세한 내용은 공식 API 문서에서 확인할 수 있습니다: AlarmManager

1. Timer 클래스와 AlarmManager 클래스의 차이점:

J2SE를 공부했다면 확실히 Timer에 익숙할 것입니다. 타이머는 일반적으로 예약된 작업을 작성할 때 사용됩니다. 확실히 그와 뗄래야 뗄 수 없는 존재이지만, 안드로이드에서는 단점이 있어 장시간 백그라운드에서 실행해야 하는 분들에게는 적합하지 않습니다. 예약된 작업. Android 장치에는 자체 절전 정책이 있기 때문에 오랫동안 작업이 없으면 장치에서 자동으로 CPU가 진입하도록 합니다. 타이머의 예약된 작업이 제대로 실행되지 않을 수 있는 절전 상태입니다! 그리고 AlarmManager가 존재하지 않습니다. 이 경우 CPU를 깨우는 기능이 있기 때문에 특정 작업을 수행해야 할 때마다 CPU가 정상적으로 작동할 수 있도록 보장할 수 있습니다. 즉, CPU가 Sleep 상태일 때 등록된 알람시계는 유지되지만(CPU를 깨울 수 있음), 장치를 끄거나 다시 시작하면 활성화하면 알람이 삭제됩니다! (안드로이드폰이 꺼져 있으면 알람시계가 울리지 않습니다...)


2. AlarmManager 인스턴스 객체 획득:

AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);

3. 관련 메서드 설명:

  • set(int 유형, 긴 startTime, PendingIntent pi): 일회성 알람 시계
  • setRepeating(int 유형, 긴 startTime, 긴 간격 시간, PendingIntent pi): 반복되는 알람 시계는 3개와 다릅니다. 3개의 알람 시계의 간격 시간은 고정되어 있지 않습니다
  • setInexactRepeating(int 유형, 긴 startTime, 긴 간격 시간, PendingIntent pi): 반복되는 알람 시계, 시간이 고정되지 않음
  • cancel(PendingIntent pi): AlarmManager
  • getNextAlarmClock()의 예정된 서비스 취소: 다음 알람 시계 가져오기, 반환 값 AlarmManager.AlarmClockInfo
  • setAndAllowWhileIdle(int 유형, 긴 TriggerAtMillis, PendingIntent 작업) set 방법과 유사하게 이 알람 시계는 시스템이 저전력 모드
  • setExact(int 유형, 긴 TriggerAtMillis, PendingIntent 작업)에 있을 때 유효합니다. 설정된 방법보다 더 정확한 지정된 시간에 알람 시계를 실행합니다.
  • setTime(long millis): 시스템 벽에 시간을 설정합니다.
  • setTimeZone(String timeZone): 시스템의 연속 시간을 설정합니다. 기본 시간대
  • setWindow(int 유형, 긴 windowStartMillis, 긴 windowLengthMillis, PendingIntent 작업): 지정된 시간 내에 알람이 실행되도록 설정합니다. set과 유사하게 이 방법을 사용하면 애플리케이션이 운영 체제 조정을 정밀하게 제어할 수 있습니다. 전체 알람 발생 시간의 범위입니다.

주요 매개변수 설명:

  • Type(알람시계 유형): 다음과 같은 5가지 선택적 값이 있습니다. AlarmManager.ELAPSED_REALTIME: 전화기가 절전 상태일 때는 알람 시계를 사용할 수 없습니다. 이 상태에서 알람 시계는 상대 시간(시스템 시작 시작 기준)을 사용하며 상태 값은 3입니다. AlarmManager.ELAPSED_REALTIME_WAKEUP 알람 시계는 절전 상태에서 시스템을 깨우고 프롬프트 기능을 수행합니다. 이 상태에서 알람 시계도 상대 시간을 사용하며 상태 값은 2입니다. AlarmManager.RTC슬립 상태에서는 알람 시계를 사용할 수 없습니다. 이 상태에서 알람 시계는 현재 시스템 시간인 절대 시간을 사용하며 상태 값은 1입니다. AlarmManager.RTC_WAKEUP은 알람 시계가 시스템을 깨우고 절전 상태에서 프롬프트 기능을 수행한다는 의미입니다. 이 상태에서 알람 시계는 절대 시간을 사용하며 상태 값은 0입니다. AlarmManager.POWER_OFF_WAKEUP은 전화기가 꺼져 있을 때 알람 시계도 정상적으로 프롬프트 기능을 수행할 수 있다는 의미이므로 5가지 상태 중 가장 일반적으로 사용되는 상태 중 하나이며 이 상태에서 알람 시계도 절대 시간을 사용합니다. , 상태 값은 4입니다. 그러나 이 상태는 SDK 버전의 영향을 받는 것으로 보이며 일부 버전에서는 이를 지원하지 않습니다.
  • startTime: 알람 시계의 첫 번째 실행 시간(밀리초)입니다. 사용자 정의할 수 있지만 일반적으로 현재 시간이 사용됩니다. 이 속성은 첫 번째 매개변수에 해당하는 알람시계가 상대 시간을 사용하는 경우 첫 번째 속성(유형)과 밀접한 관련이 있다는 점에 유의해야 합니다. (ELAPSED_REALTIME 및 ELAPSED_REALTIME_WAKEUP), 이 속성은 상대 시간을 사용해야 합니다. (시스템 시작 시간 기준) 예를 들어 현재 시간은 다음과 같이 표현됩니다. SystemClock.elapsedRealtime(); 첫 번째 파라미터에 해당하는 알람시계가 절대시간(RTC, RTC_WAKEUP, POWER_OFF_WAKEUP)을 사용하는 경우, 그런 다음 이 속성은 절대 시간을 사용해야 합니다. 예를 들어 현재 시간은 System.currentTimeMillis()로 표현됩니다.
  • intervalTime: 두 개의 알람 시계 실행 사이의 간격을 밀리초 단위로 나타냅니다.
  • PendingIntent: 브로드캐스트 보내기, 프롬프트 표시 등과 같은 알람 시계의 실행 작업을 바인딩합니다. PendingIntent는 Intent의 캡슐화 클래스입니다. 서비스를 시작하여 알람 프롬프트를 구현하는 경우 Pending.getService를 사용하여 PendingIntent 개체를 가져와야 합니다. (Context c, int i, Intentintent, int j) 알람시계가 브로드캐스팅을 통해 구현되는 경우 방법; 참고로, PendingIntent 객체를 얻으려면 PendingIntent.getBroadcast를 사용해야 합니다. (Context c, int i, Intentintent, int j) Activity를 사용하여 구현된 경우 메서드 알람 시계가 메시지를 표시하면 다음을 사용하여 PendingIntent 개체를 가져와야 합니다. PendingIntent.getActivity(Context c,int i,Intentintent,int j) 메소드. 이 세 가지 방법을 잘못 사용하면 오류는 보고되지 않지만 알람 프롬프트 효과는 표시되지 않습니다.

4. 사용 예: 간단한 예약 작업

제가 말하고 싶은 것은 이 예는 Android 4.4 이하의 시스템에서만 가능하지만 향후 5.0 이상이면 가능하지 않다는 것입니다. 위의 AlarmManager 솔루션은 조만간 추가될 예정입니다! 또한 여기서 set 메소드를 사용하는 것은 원하는 경우 약간 부정확할 수 있습니다. 더 정확하게 말하면 setExtra() 메소드를 사용하여 AlarmManager를 설정할 수 있습니다!

Running renders:

2.png3.png

구현 코드:

먼저 간단한 레이아웃 파일: activity_main.xml , 그리고 추가적으로 res는 raw 폴더를 생성하고 그 안에 오디오 파일을 넣습니다! 또한 알람 시계가 울릴 때 활동의 레이아웃으로 외부 레이아웃만 사용하여 activity_clock.xml을 생성하세요! 아무것도 없으면 게시하지 않겠습니다

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/LinearLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:id="@+id/btn_set"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="设置闹钟" />

    <Button
        android:id="@+id/btn_cancel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="关闭闹钟"
        android:visibility="gone" /></LinearLayout>

그리고 아주 간단한 MainActivity.java도 있습니다:

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    private Button btn_set;
    private Button btn_cancel;
    private AlarmManager alarmManager;
    private PendingIntent pi;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        bindViews();
    }

    private void bindViews() {
        btn_set = (Button) findViewById(R.id.btn_set);
        btn_cancel = (Button) findViewById(R.id.btn_cancel);
        alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);

        Intent intent = new Intent(MainActivity.this, ClockActivity.class);
        pi = PendingIntent.getActivity(MainActivity.this, 0, intent, 0);

        btn_set.setOnClickListener(this);
        btn_cancel.setOnClickListener(this);

    }


    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.btn_set:
                Calendar currentTime = Calendar.getInstance();
                new TimePickerDialog(MainActivity.this, 0,
                        new TimePickerDialog.OnTimeSetListener() {
                            @Override
                            public void onTimeSet(TimePicker view,
                                                  int hourOfDay, int minute) {
                                //设置当前时间
                                Calendar c = Calendar.getInstance();
                                c.setTimeInMillis(System.currentTimeMillis());
                                // 根据用户选择的时间来设置Calendar对象
                                c.set(Calendar.HOUR, hourOfDay);
                                c.set(Calendar.MINUTE, minute);
                                // ②设置AlarmManager在Calendar对应的时间启动Activity
                                alarmManager.set(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), pi);
                                Log.e("HEHE",c.getTimeInMillis()+"");   //这里的时间是一个unix时间戳
                                // 提示闹钟设置完毕:
                                Toast.makeText(MainActivity.this, "闹钟设置完毕~"+ c.getTimeInMillis(),
                                        Toast.LENGTH_SHORT).show();
                            }
                        }, currentTime.get(Calendar.HOUR_OF_DAY), currentTime
                        .get(Calendar.MINUTE), false).show();
                btn_cancel.setVisibility(View.VISIBLE);
                break;
            case R.id.btn_cancel:
                alarmManager.cancel(pi);
                btn_cancel.setVisibility(View.GONE);
                Toast.makeText(MainActivity.this, "闹钟已取消", Toast.LENGTH_SHORT)
                        .show();
                break;
        }
    }
}

그리고 알람 페이지를 위한 ClockActivity.java도 있습니다:

/**
 * Created by Jay on 2015/10/25 0025.
 */
public class ClockActivity extends AppCompatActivity {

    private MediaPlayer mediaPlayer;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_clock);
        mediaPlayer = mediaPlayer.create(this,R.raw.pig);
        mediaPlayer.start();
        //创建一个闹钟提醒的对话框,点击确定关闭铃声与页面
        new AlertDialog.Builder(ClockActivity.this).setTitle("闹钟").setMessage("小猪小猪快起床~")
                .setPositiveButton("关闭闹铃", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        mediaPlayer.stop();
                        ClockActivity.this.finish();
                    }
                }).show();
    }
}

코드 매우 간단하며 핵심 프로세스는 다음과 같습니다.

  • AlarmManager AlarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);시스템에서 제공하는 AlarmManager 서비스의 개체를 가져옵니다.
  • Intent는 시작될 구성 요소를 설정합니다. : Intentintent = new Intent(MainActivity.this, ClockActivity.class);
  • PendingIntent 객체는 Activity, Service 또는 Broadcast인지 여부에 관계없이 작업을 설정합니다!PendingIntent pi = PendingIntent.getActivity(MainActivity.this, 0,intent, 0);
  • AlarmManager의 set() 메소드를 호출하여 단일 알람의 알람 유형, 시작 시간 및 PendingIntent 객체를 설정하세요!alarmManager.set(AlarmManager.RTC_WAKEUP,c.getTimeInMillis(), pi);

또한 알람이 작동하지 않으면 다음 측면에서 시작할 수 있습니다.

  1. 시스템 버전이나 휴대폰은 5.0 이상에서는 기본적으로 쓸모가 없습니다. 샤오미는 바이두로 직접 가세요~ 2.ClockActivity가 등록되었나요? 3. 알람 관리자를 사용하여 브로드캐스트를 보낸 다음 브로드캐스트 후 활동을 활성화하는 경우 인텐트에 대한 플래그를 설정해야 합니다. i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

  2. 4.

  3. 4.png

  4. 이 장소가 맞습니까? getActivity를 getService 등으로 쓰지 마세요~


역시 , 예약된 백그라운드 작업을 구현하기 위해 이후 서비스와 결합된 AlarmManager의 예는 다음을 참조하세요. 4.2.2 고급 서비스


5 코드 샘플 다운로드:

AlarmManagerDemo.zip


이 섹션 요약:

좋습니다. 이 섹션에서는 예제와 같이 사용자 정의할 수 있는 것 외에도 Android에서 AlarmManager(알람 시계 서비스)를 사용하는 방법을 설명합니다. 자신만의 알람 시계를 서비스 및 스레드와 결합하여 폴링 등을 완료할 수도 있습니다. 이를 사용하는 방법은 많지만 여전히 직접 탐색해야 합니다. 이번 섹션은 여기까지입니다. 감사합니다~5.gif