androidTV定时播放(闹钟)的使用--AlarmManager
2017-05-11 09:46
471 查看
最近电视端新增需求:要求在特定时间打开指定界面,于是我就想到了手机上的闹钟的使用,没想到在电视端同样适用!参考了一个很有用的第三人称写的blog
地址如下:http://www.jianshu.com/p/4bbfad2381c6
先讲最基本的--步骤:
1.main控制闹钟代码书写
4.指定界面代码书写
在receiver中继续跳转到指定界面,receiver一定要有哦!
并且我代码中暂时没有第二天播放的需求,因此我暂时注销掉了。
就如我代码写的那样,我是想设置的是单次闹钟,当然你想设置重复闹钟也可以,就看我给你的网址,里面讲的很详细。
地址如下: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.
相关文章推荐
- Android 定时执行任务 AlarmManager的使用(可用于闹钟开发)
- android 使用AlarmManager定时启动service
- 我的Android进阶之旅------>Android使用AlarmManager全局定时器实现定时更换壁纸
- Android闹钟 AlarmManager的使用【转】
- Android编程使用AlarmManager设置闹钟的方法
- Android闹钟 AlarmManager的使用
- 使用AlarmManager实现Android应用每天定时执行任务
- Android闹钟 AlarmManager的使用
- Android闹钟 AlarmManager的使用
- android开发步步为营之18:闹钟AlarmManager的使用
- Android闹钟 AlarmManager的使用
- (4.1.32.1)Android闹钟 AlarmManager的使用
- Android闹钟 AlarmManager的使用和通知的使用
- android闹钟AlarmManager的使用
- Android闹钟 AlarmManager的使用
- android 后台定时提醒(Service,AlarmManager的使用)
- Android使用AlarmManager全局定时器实现定时更换壁纸
- android使用AlarmManager实现应用每天定时执行任务
- Android 使用AlarmManager和NotificationManager来实现闹钟和通知栏
- Android 设置定时提醒,AlarmManager简单使用