AlarmManager (perkhidmatan jam penggera)


Pengenalan kepada bahagian ini:

Bahagian ini memperkenalkan AlarmManager (perkhidmatan jam penggera) dalam Android, kami tahu bahawa kami boleh menggunakannya untuk membangunkan APP jam penggera mudah alih . Penjelasan dalam dokumen itu ialah: menyiarkan Niat tertentu untuk kita pada masa tertentu Secara ringkasnya, kita sendiri yang menetapkan masa. Kemudian apabila masa tamat, AlarmManager akan menyiarkan Niat yang kita tetapkan untuk kita Contohnya, apabila masa tamat, ia boleh menunjuk kepada yang tertentu Aktiviti atau Perkhidmatan! Selain itu, terdapat beberapa perkara yang perlu diberi perhatian dalam dokumen rasmi:

1.png
Perkara lain yang perlu diberi perhatian ialah AlarmManager digunakan terutamanya untuk menjalankan kod anda pada masa tertentu, walaupun anda APP adalah khusus Masa tidak berjalan! Juga, bermula dari API 19, mekanisme Penggera tidak diluluskan dengan tepat, dan sistem pengendalian akan menukar jam penggera , untuk meminimumkan bangun tidur dan penggunaan bateri! Sesetengah API baharu akan menyokong penghantaran yang sangat tepat, lihat setWindow(int, long, long, PendingIntent) dan setExact(int, long, PendingIntent). Aplikasi TargetSdkVersion sebelum API 19 akan terus menggunakan gelagat sebelumnya dan semua penggera akan dihantar dengan tepat apabila diperlukan Ia akan dihantar dengan tepat pada masa akan datang. Butiran lanjut boleh didapati dalam dokumen API rasmi: AlarmManager

1 Perbezaan antara kelas Pemasa dan kelas AlarmManager:

Jika anda telah belajar J2SE, maka anda pasti akan biasa dengan Pemasa biasanya digunakan semasa menulis tugasan yang dijadualkan. Ia sememangnya tidak dapat dipisahkan daripadanya, tetapi dalam Android, dia mempunyai kekurangan dan tidak sesuai untuk mereka yang perlu berjalan di latar belakang untuk masa yang lama. Tugas berjadual, kerana peranti Android mempunyai dasar tidurnya sendiri Apabila tiada operasi untuk masa yang lama, peranti akan membenarkan CPU masuk secara automatik Keadaan tidur, yang boleh menyebabkan tugas yang dijadualkan dalam Pemasa tidak berjalan dengan betul! Dan AlarmManager tidak wujud Dalam kes ini, kerana ia mempunyai fungsi untuk membangunkan CPU, ia boleh memastikan bahawa CPU boleh berfungsi seperti biasa setiap kali ia perlu melaksanakan tugas tertentu. Dalam erti kata lain, jam penggera yang didaftarkan semasa CPU sedang tidur akan dikekalkan (boleh membangunkan CPU), tetapi jika peranti dimatikan atau dimulakan semula, Jika diaktifkan, penggera akan dikosongkan! (Jam penggera tidak berbunyi apabila telefon Android dimatikan...)


2. Dapatkan objek instance AlarmManager:

AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);

3.

(jenis int, Masa mula yang panjang, pi PendingIntent): Penggera sekali
  • setRepeating(jenis int, Masa mula yang panjang, selang Masa yang panjang, pi PendingIntent): Mengulang jam penggera, yang berbeza daripada 3, 3 selang jam penggera tidak tetap
  • setInexactRepeating (jenis int, masa mula panjang, selang waktu panjang, PendingIntent pi): Jam penggera berulang, masa tidak tetap
  • batal(PendingIntent pi): Batalkan perkhidmatan berjadual AlarmManager
  • getNextAlarmClock(): Dapatkan jam penggera seterusnya , nilai pulangan AlarmManager.AlarmClockInfo
  • setAndAllowWhileIdle(jenis int, pencetus panjangAtMillis, operasi PendingIntent) Sama seperti kaedah yang ditetapkan, jam penggera ini sah apabila sistem berada dalam mod kuasa rendah
  • setExact(jenis int, pencetus panjangAtMillis, operasi PendingIntent): Laksanakan jam penggera dengan tepat pada masa yang ditentukan, yang lebih tepat daripada kaedah yang ditetapkan
  • setTime(millis panjang): Tetapkan masa pada dinding sistem
  • .
  • setTimeZone(String timeZone): Tetapkan zon waktu lalai berterusan sistem
  • setWindow(int type, long windowStartMillis, long windowLengthMillis, PendingIntent operation): Tetapkan penggera untuk menyala dalam tetingkap masa tertentu. Sama seperti set, kaedah ini membolehkan aplikasi mengawal pelarasan sistem pengendalian dengan tepat. Tahap keseluruhan masa pencetus penggera.
  • Penjelasan parameter utama
  • :
  • Jenis(jenis jam penggera): Terdapat lima nilai pilihan: AlarmManager.ELAPSED_REALTIME: Jam penggera tidak tersedia apabila telefon dalam keadaan tidur Dalam keadaan ini, jam penggera menggunakan masa relatif (berbanding dengan permulaan permulaan sistem), dan nilai keadaan ialah 3; AlarmManager.ELAPSED_REALTIME_WAKEUPJam penggera akan membangunkan sistem dan melaksanakan fungsi segera dalam keadaan tidur Dalam keadaan ini, jam penggera juga menggunakan masa relatif, dan nilai status ialah 2; AlarmManager.RTCJam penggera tidak tersedia dalam keadaan tidur Dalam keadaan ini, jam penggera menggunakan masa mutlak, iaitu masa sistem semasa dan nilai status ialah 1; AlarmManager.RTC_WAKEUP menunjukkan bahawa jam penggera akan membangunkan sistem dan melaksanakan fungsi segera dalam keadaan tidur Dalam keadaan ini, jam penggera menggunakan masa mutlak dan nilai status ialah 0; AlarmManager.POWER_OFF_WAKEUP bermakna jam penggera juga boleh melaksanakan fungsi gesaan seperti biasa apabila telefon dimatikan, jadi ia adalah salah satu keadaan yang paling biasa digunakan antara 5 keadaan dalam keadaan ini, jam penggera juga menggunakan masa mutlak, dan nilai keadaan ialah 4 ; Walau bagaimanapun, status ini nampaknya dipengaruhi oleh versi SDK, dan beberapa versi tidak menyokongnya; masa jam penggera, dalam milisaat, masa boleh disesuaikan, tetapi Secara umumnya menggunakan masa semasa. Perlu diingatkan bahawa atribut ini berkait rapat dengan atribut pertama (jenis Jika jam penggera yang sepadan dengan parameter pertama menggunakan masa relatif). (ELAPSED_REALTIME dan ELAPSED_REALTIME_WAKEUP), maka atribut ini mesti menggunakan masa relatif (berbanding dengan masa permulaan sistem), contohnya, masa semasa dinyatakan sebagai: SystemClock.elapsedRealtime(); Jika jam penggera yang sepadan dengan parameter pertama menggunakan masa mutlak (RTC, RTC_WAKEUP, POWER_OFF_WAKEUP), Kemudian atribut ini mesti menggunakan masa mutlak Contohnya, masa semasa dinyatakan sebagai: System.currentTimeMillis().
  • intervalTime: Menunjukkan selang antara pelaksanaan dua jam penggera, juga dalam milisaat
  • PendingIntent: Mengikat tindakan pelaksanaan penggera. jam , seperti menghantar siaran, memberi gesaan, dsb. PendingIntent ialah kelas Enkapsulasi Niat. Perlu diingatkan bahawa jika gesaan penggera dilaksanakan dengan memulakan perkhidmatan, objek PendingIntent harus diperoleh menggunakan Pending.getService (Konteks c, int i, Intent intent, int j) kaedah jika jam penggera dilaksanakan melalui penyiaran Sebagai peringatan, PendingIntent.getBroadcast harus digunakan untuk mendapatkan objek PendingIntent. (Konteks c, int i, Intent intent, int j) kaedah jika ia dilaksanakan menggunakan Aktiviti Jika jam penggera menggesa, objek PendingIntent harus diperoleh menggunakan Kaedah PendingIntent.getActivity(Context c,int i,Intent,int j). Jika ketiga-tiga kaedah ini digunakan secara tidak betul, walaupun tiada ralat akan dilaporkan, kesan gesaan penggera tidak akan kelihatan.

4 Contoh penggunaan: tugas berjadual ringkas

Apa yang saya ingin katakan ialah contoh ini hanya boleh dilaksanakan dalam sistem di bawah Android 4.4. . Di atas 5.0 tidak boleh dilaksanakan, jika terdapat 5.0 pada masa hadapan Penyelesaian AlarmManager di atas akan ditambah dalam masa terdekat! Selain itu, menggunakan kaedah yang ditetapkan di sini mungkin agak tidak tepat Jika anda mahu Untuk lebih tepat, anda boleh menggunakan kaedah setExtra() untuk menetapkan AlarmManager

Jalankan pemaparan :

2.png3.png

Kod pelaksanaan :

Pertama, fail susun atur mudah:

aktiviti_main.xml . ke dalamnya! Selain itu, cipta activity_clock.xml dengan hanya reka letak luar sebagai susun atur Aktiviti apabila jam penggera berbunyi! Jika tiada apa-apa, saya tidak akan menyiarkannya

<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>

diikuti dengan

MainActivity.java, yang juga sangat mudah:

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;
        }
    }
}

dan kemudian

ClockActivity. java< halaman penggera 🎜>:

/**
 * 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();
    }
}
Kod ini sangat mudah, proses terasnya adalah seperti berikut:

AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE );
    Dapatkan perkhidmatan AlarmManager yang disediakan oleh sistem Objek
  • Niat menetapkan komponen untuk dilancarkan
  • : Niat niat = Niat baharu(MainActivity.this, ClockActivity.class);
  • Objek PendingIntent menetapkan tindakan, sama ada untuk memulakan Aktiviti, Perkhidmatan atau siaran!
  • PendingIntent pi = PendingIntent.getActivity ( MainActivity.this, 0, intent, 0);
  • Panggil set() kaedah AlarmManager untuk menetapkan jenis penggera, masa permulaan dan objek PendingIntent bagi satu penggera!
  • alarmManager.set (AlarmManager .RTC_WAKEUP,c.getTimeInMillis(), pi);
Selain itu, jika penggera tidak sah, anda boleh bermula dari aspek ini:

    Versi sistem atau telefon bimbit, di atas 5.0 pada dasarnya tidak berguna, Xiaomi, pergi ke Baidu sendiri~ 2.Adakah ClockActivity telah didaftarkan? 3. Jika anda menggunakan alarmManager untuk menghantar siaran, dan kemudian mengaktifkan Aktiviti selepas penyiaran, anda perlu menetapkan bendera untuk Niat: i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  1. 4.
  2. 4.png

  3. Adakah tempat ini betul? Jangan tulis getActivity sebagai getService, dsb.~


Selain itu, berkenaan AlarmManager digabungkan dengan Perkhidmatan kemudian Untuk contoh pelaksanaan tugas latar belakang yang dijadualkan, lihat:
4.2.2 Perkhidmatan Lanjutan

5.


Ringkasan bahagian ini:

Baiklah, bahagian ini menerangkan kepada anda penggunaan AlarmManager (perkhidmatan jam penggera) dalam Android Selain dapat menyesuaikannya seperti contoh Jam penggera anda sendiri juga boleh digabungkan dengan Perkhidmatan dan Benang untuk melengkapkan pengundian, dsb. Terdapat banyak cara untuk menggunakannya, dan anda masih perlu menerokanya sendiri, eh Itu sahaja untuk bahagian ini, terima kasih~5.gif