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();
}
}
唤醒屏幕的方法
//唤醒屏幕
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);
}
}