Android学习——AlarmManager系统服务

AlarmManager系统服务

1.AlarmManager简介

现在普遍的手机都会有一个闹钟的功能,如果使用Android来实现一个闹钟可以使用AlarmManager来实现。AlarmManager提供予一种系统级的提示服务,允许你安排在将来的某个时间执行一个服务。

AlarmManager对象一般不直接实例化,而是通过Context.getSystemService(Context.ALARM_ SERVICE)方法获得。

2.AlarmManager常用属性和方法

AlarmManager中一共提供了四种闹钟类型,前两种对应的System.currentTimeMillis()(系统当前时间)时间,后两种对应SystemClock.elapsedRealtime()(系统运行时间)时间,以WAKEUP结尾的类型能够唤醒设备,其他的类型不能唤醒设备,直到设备被唤醒才能出发警报提醒。

  • AlarmManager.RTC,硬件闹钟,不唤醒手机(也可能是其他设备)休眠;当手机休眠时不发射闹钟。
  • AlarmManager.RTC_WAKEUP,硬件闹钟,当闹钟发射时唤醒手机休眠。
  • AlarmManager.ELAPSED_REALTIME,真实时间流逝闹钟,不唤醒手机休眠;当手机休眠时不发射闹钟。
  • AlarmManager.ELAPSED_REALTIME_WAKEUP,真实时间流逝闹钟,当闹钟发射时唤醒手机休眠。

RTC闹钟和ELAPSED_REALTIME最大的差别就是前者可以通过修改手机时间触发闹钟事件,后者要通过真实时间的流逝,即使在休眠状态,时间也被计算。

3.AlarmManager实现步骤

1.获得AlarmManager实例:AlarmManager am= (AlarmManager) getSystemService(Context.ALARM_SERVICE);
2.闹钟一般是通过发出一个广播来实现的,所以要定义一个PendingIntent发出广播
3.调用AlarmManager方法,设置定时或重复提醒

package com.example.alarmmanager;

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends AppCompatActivity {

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

    public void startAlarmClick(View v){
        //获取到了系统的闹钟服务
        AlarmManager am= (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        //触发闹钟的时间(毫秒)
        long triggerTime=System.currentTimeMillis()+3000;
        Intent intent=new Intent(this,MyAlarmReceiver.class);
        PendingIntent op=PendingIntent.getBroadcast(this,0,intent,PendingIntent.FLAG_UPDATE_CURRENT);
        //只会执行一次的闹钟
        am.set(AlarmManager.RTC_WAKEUP,triggerTime,op);
        //指定时间重复执行闹钟
//        am.setRepeating(AlarmManager.RTC_WAKEUP,triggerTime,2000,op);
    }
}

定义一个广播

package com.example.alarmmanager;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

public class MyAlarmReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "起床啦,起床啦!", Toast.LENGTH_SHORT).show();
    }
}

Android学习——AlarmManager系统服务
唤醒屏幕的方法

 //唤醒屏幕
        Window win=getWindow();
        win.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD|
                WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED|
                WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON|
                WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);

在清单文件中更改样式

android:theme="@android:style/Theme.DeviceDefault.Wallpaper.NoTitleBar"

4.AlarmManager服务闹钟实例

获得AlarmManager实例

package com.example.alarmmanager;

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends AppCompatActivity {

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

    public void setAlarmClick(View v){
        //获取到了系统的闹钟服务
        AlarmManager am= (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        //触发闹钟的时间(毫秒)
        long triggerTime=System.currentTimeMillis()+3000;
        Intent intent=new Intent(this,AlarmActivity.class);
        PendingIntent op=PendingIntent.getActivity(this,0,intent,PendingIntent.FLAG_UPDATE_CURRENT);
        //只会执行一次的闹钟
        am.set(AlarmManager.RTC_WAKEUP,triggerTime,op);
    }
}

闹钟启动界面

package com.example.alarmmanager;

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;

import java.io.IOException;

public class AlarmActivity extends AppCompatActivity {

    MediaPlayer mp;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //唤醒屏幕
        Window win=getWindow();
        win.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD|
                WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED|
                WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON|
                WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
        setContentView(R.layout.activity_alarm);

        mp=new MediaPlayer();
        try {
            mp.setDataSource(this, Uri.parse("/storage/emulate/0/Music/nl.mp3"));
            mp.prepare();
        } catch (IOException e) {
            e.printStackTrace();
        }
        mp.setLooping(true);
        mp.start();
        alarmDialog();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (mp!=null){
            if (mp.isPlaying()){
                mp.stop();
            }
            mp.release();
        }
    }

    public void alarmDialog(){
        AlertDialog.Builder builder=new AlertDialog.Builder(this);
        builder.setMessage("起床啦,起床啦!!!");
        builder.setPositiveButton("再来一次", new DialogInterface.OnClickListener(){
            @Override
            public void onClick(DialogInterface dialog, int which) {
                alarm();
                finish();
            }
        });
        builder.setNegativeButton("停止", new DialogInterface.OnClickListener(){
            @Override
            public void onClick(DialogInterface dialog, int which) {
                finish();
            }
        });
        builder.show();
    }
    private void alarm(){
        //获取到了系统的闹钟服务
        AlarmManager am= (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        //触发闹钟的时间(毫秒)
        long triggerTime=System.currentTimeMillis()+5000;
        Intent intent=new Intent(this,AlarmActivity.class);
        PendingIntent op=PendingIntent.getActivity(this,0,intent,PendingIntent.FLAG_UPDATE_CURRENT);
        //只会执行一次的闹钟
        am.set(AlarmManager.RTC_WAKEUP,triggerTime,op);
    }

}

Android学习——AlarmManager系统服务Android学习——AlarmManager系统服务

上一篇:(转)Android之发送短信的两种方式


下一篇:P5712 【深基3.例4】Apples(python3 C++ Scratch实现)