您的位置:首页 > 移动开发 > Android开发

androidTV定时播放(闹钟)的使用--AlarmManager

2017-05-11 09:46 471 查看
最近电视端新增需求:要求在特定时间打开指定界面,于是我就想到了手机上的闹钟的使用,没想到在电视端同样适用!参考了一个很有用的第三人称写的blog

地址如下:http://www.jianshu.com/p/4bbfad2381c6

先讲最基本的--步骤:

1.main控制闹钟代码书写
//设置闹钟方法
private void setAlarm() {
//得到日历实例,主要是为了下面的获取时间
mCalendar = Calendar.getInstance();
mCalendar.setTimeInMillis(System.currentTimeMillis());

//获取当前毫秒值
long systemTime = System.currentTimeMillis();

//是设置日历的时间,主要是让日历的年月日和当前同步
mCalendar.setTimeInMillis(System.currentTimeMillis());
// 这里时区需要设置一下,不然可能个别手机会有8个小时的时间差
mCalendar.setTimeZone(TimeZone.getTimeZone("GMT+8"));
//设置在几点提醒  设置的为()点
mCalendar.set(Calendar.HOUR_OF_DAY, hour);
//设置在几分提醒  设置的为()分
mCalendar.set(Calendar.MINUTE, min);
//下面这两个看字面意思也知道
mCalendar.set(Calendar.SECOND, 0);
mCalendar.set(Calendar.MILLISECOND, 0);
//获取上面设置的13点25分的毫秒值
long selectTime = mCalendar.getTimeInMillis();
// 如果当前时间大于设置的时间,那么就从第二天的设定时间开始
if(systemTime > selectTime) {
//            mCalendar.add(Calendar.DAY_OF_MONTH, 1);
}

//AlarmReceiver.class为广播接受者
Intent i = new Intent(NotiActivity.this, AlarmReceiver.class);
if(type.equals("1")){
i.putExtra("msg",extra);
i.putExtra("type","1");
}else if(type.equals("2")){
i.putExtra("msg",extra);
i.putExtra("type","2");
}else if(type.equals("3")){
i.putExtra("msg",extra);
i.putExtra("type","3");
}else if(type.equals("4")){
i.putExtra("msg",extra);
i.putExtra("type","4");
Log.e("图片","图片");
}

//从sharedpreference中提取pendingTimes
SharedPreferences s=getSharedPreferences("user",MODE_PRIVATE);
pendingTimes=s.getInt("pendingTimes",0);
Log.e("pendingTimes",pendingTimes+"");

PendingIntent pi = PendingIntent.getBroadcast(NotiActivity.this, pendingTimes, i, 0);
pendingTimes++;
//存储pendingTimes++
SharedPreferences.Editor editor=s.edit();
editor.putInt("pendingTimes",pendingTimes);
editor.commit();

//得到AlarmManager实例
AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);

//**********注意!!下面的两个根据实际需求任选其一即可*********

/**
* 单次提醒(根据不同版本使用不同方法)
* mCalendar.getTimeInMillis() 上面设置的13点25分的时间点毫秒值
*/
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
am.setExact(AlarmManager.RTC_WAKEUP, mCalendar.getTimeInMillis(), pi);
Log.e("setExact","setExact");
}else{
am.set(AlarmManager.RTC_WAKEUP, mCalendar.getTimeInMillis(), pi);
Log.e("set<19","set<19");
}

//        Toast.makeText(this, "闹钟设置成功", Toast.LENGTH_SHORT).show();

}

2.reciever代码书写

public class AlarmReceiver extends BroadcastReceiver {
private String extra,type;

@Override
public void onReceive(Context context, Intent intent) {
Log.e("AlarmReceiver","AlarmReceiver");
//获取extra,type(播放类型)
extra=intent.getStringExtra("msg");
Log.e("alarmreceiver_extra",extra);
type=intent.getStringExtra("type");
if (type.equals("1")) {
Intent i = new Intent(context, VideoActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.putExtra("url", extra);
context.startActivity(i);
Log.e("startVideoActivity","startVideoActivtiy");
} else if (type.equals("2")) {
Intent i = new Intent(context, HTextViewActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.putExtra("url", extra);
context.startActivity(i);
Log.e("startWordsActivity","startWordsActivtiy");
}else if(type.equals("3")){
Intent i=new Intent(context,SoundActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.putExtra("url",extra);
context.startActivity(i);
Log.e("startSoundActivity","startSoundActivity");
}else if(type.equals("4")) {
Intent i = new Intent(context, PicActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.putExtra("url", extra);
context.startActivity(i);
Log.e("startPicActivity", "startPicActivity");
}
}
}


3.manifest代码书写

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

<receiver
android:name="receiver.AlarmReceiver"
android:enabled="true"
android:process=":remote" />


4.指定界面代码书写
//此处没有代码自己发挥,就是intent的跳转




我代码的整个流程是在main中设置闹钟,并执行设置闹钟的具体方法(setAlarm),代码中我写的是几时几分跳转到receiver中

在receiver中继续跳转到指定界面,receiver一定要有哦!
并且我代码中暂时没有第二天播放的需求,因此我暂时注销掉了。
就如我代码写的那样,我是想设置的是单次闹钟,当然你想设置重复闹钟也可以,就看我给你的网址,里面讲的很详细。



需要注意的是:

1.在最后设定的时候如果不区分版本,都使用am.set()的方法会导致闹钟时间不准确(几秒钟到几分钟的误差),这里是根据API>19区分的;

2.大家可能注意到了我使用了pendingTimes这个参数,使用这个参数是因为我每次打开指定界面需要展示的extra是不同的,如果

不使用pengdingTimes这个参数(或者把pendingTimes写死是0的话):
PendingIntent pi = PendingIntent.getBroadcast(NotiActivity.this, 0, i, 0);



那么每次闹钟启动展示的都是第一次的内容(不管你展示内容extra传的是什么),在这里我的理解是一个pendingTimes代表

一个特定的闹钟,如果你要传的东西是不同的话,建议像我一样pendingTimes每次+1;

并且这样写代码,在同时设定不同闹钟且有不同展示内容extra的时候,都能按时、内容准确的执行。

以上是我对我项目中使用的闹钟的一些理解。

3.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: