Android实现简单的闹钟
16lz
2021-12-04
Android实现简单闹钟
-
- Android实现简单闹钟
- 简单的时间格式转化
- 日期选择
- 时间选择
- 确定时间后开启服务
- 在服务里使用AlarmManager定时在AlarmManager里设置到点发送一条广播
- 实现一个BroadcastReceiver接收到定点的广播后发送一条通知
- Android实现简单闹钟
简单的时间格式转化
private static String midStr1 = ""; private static String midStr2 = ""; public static String getStrDate(Calendar calendar){ int year; int month; int day; int hour; int minute; year = calendar.get(Calendar.YEAR); month = calendar.get(Calendar.MONTH); day = calendar.get(Calendar.DAY_OF_MONTH); hour = calendar.get(Calendar.HOUR_OF_DAY); minute = calendar.get(Calendar.MINUTE); if (minute<10){ midStr2 = "0"; } if (hour<10){ midStr1 = "0"; } return year + "年" + month + "月" + day + "日 " +midStr1 + hour + ":"+ midStr2 + minute; }
日期选择
Calendar calendar = Calendar.getInstance(); year = calendar.get(Calendar.YEAR); month = calendar.get(Calendar.MONTH); day = calendar.get(Calendar.DAY_OF_MONTH); hour = calendar.get(Calendar.HOUR_OF_DAY); minute = calendar.get(Calendar.MINUTE); DatePickerDialog datePickerDialog = new DatePickerDialog(getActivity(), new DatePickerDialog.OnDateSetListener() { @Override public void onDateSet(DatePicker datePicker, int chooseY, int chooseM, int chooseD) { //设置储存数据的年月日 CalendarLab.get(getActivity()).setCalendarYMD(chooseY,chooseM,chooseD); mYMDText.setText(chooseY + "年"+chooseM + "月" +chooseD); } },year,month,day); datePickerDialog.show();
时间选择
TimePickerDialog timePickerDialog = new TimePickerDialog(getActivity(), new TimePickerDialog.OnTimeSetListener() { @Override public void onTimeSet(TimePicker timePicker, int chooseH, int chooseM) { //这里的chooseH和chooseM就是选中的小时和分钟 CalendarLab.get(getActivity()).setCalendarHM(chooseH,chooseM); String s1 = ""; String s2 = ""; if (chooseH<10){ s1 = "0"; } if (chooseM<10){ s2 = "0"; } mHMText.setText(s1 + chooseH + ":" + s2 + chooseM); } },hour,minute,true); //最后一个参数表示是否使用24小时制 timePickerDialog.show();
确定时间后开启服务
Intent intent = new Intent(getActivity(), AlarmService.class);intent.putExtra("calendar", CalendarLab.get(getActivity()).getCalendar());intent.putExtra("noteId", noteId);intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);getActivity().startService(intent);//发送一条启动闹铃图标的广播Intent intentIcon = new Intent("com.gaozhidong.android.Color");intentIcon.putExtra("noteId", noteId);getActivity().sendBroadcast(intentIcon);
在服务里使用AlarmManager定时,在AlarmManager里设置到点发送一条广播:
public class AlarmService extends Service { private static final String TAG = "test"; private Calendar mCalendar; private AlarmManager mAlarmManager; public AlarmService() { } @Override public int onStartCommand(Intent intent, int flags, int startId) { mAlarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); mCalendar = (Calendar) intent.getSerializableExtra("calendar"); int noteId = intent.getIntExtra("noteId", 0); //设置广播 Intent intent2 = new Intent(); intent2.setAction("com.g.android.RING"); intent2.putExtra("noteId", noteId); PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent2, 0); //根据不同的版本使用不同的设置方法 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { mAlarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, mCalendar.getTimeInMillis(), pendingIntent); } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { mAlarmManager.setExact(AlarmManager.RTC_WAKEUP, mCalendar.getTimeInMillis(), pendingIntent); } else { mAlarmManager.set(AlarmManager.RTC_WAKEUP, mCalendar.getTimeInMillis(), pendingIntent); } return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy() { super.onDestroy(); Log.e(TAG, "onDestroy: 服务被杀死"); } @Override public IBinder onBind(Intent intent) { // TODO: Return the communication channel to the service. throw new UnsupportedOperationException("Not yet implemented"); }}
实现一个BroadcastReceiver,接收到定点的广播后发送一条通知
public class AlarmReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals("com.g.android.RING")){ Intent intent2 = new Intent(context,ContentActivity.class); int noteId = intent.getIntExtra("noteId",1); NoteBody noteBody = NotesLab.get(context).queryNote(noteId); //发送通知 PendingIntent pi = PendingIntent.getActivity(context,0,intent2,0); NotificationManager manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); NotificationCompat.Builder builder = new NotificationCompat.Builder(context) .setContentTitle(noteBody.getTime()) .setContentText(noteBody.getText()) .setSmallIcon(R.mipmap.ic_launcher) .setLargeIcon(BitmapFactory.decodeResource(context.getResources(),R.mipmap.ic_launcher)) .setDefaults(NotificationCompat.DEFAULT_ALL) .setPriority(NotificationCompat.PRIORITY_MAX) .setAutoCancel(true) .setContentIntent(pi); Notification notification = builder.build(); manager.notify(1,notification); //发送一条清空闹铃图标的广播 NotesLab.get(context).updateFlag(noteId,0); Intent intent1 = new Intent("com.g.android.NoColor"); intent1.putExtra("noteId",noteId); context.sendBroadcast(intent1); } }}
整个流程:
选择时间 -> 确定后启动服务 -> 服务开启后设置AlarmManager -> AlarmManager设置到点发送一条广播 -> 广播接收器接收到广播后发送一条通知 -> 通知发出铃声、震动、文字或图片通知
更多相关文章
- Android调用平台功能具体技巧分享
- Android中的时间自动更新
- Android这四个你不可不知的知识点,你都了解多少?
- android 笔记 --- 流量统计
- 怎么让android定时关机
- Android总结篇系列:Android广播机制
- android 线程中的ui问题 Handler的基本使用 关于获取动态时间在u
- android UI线程向子线程发送Message
- Android(安卓)下使用 JSON 实现 HTTP 请求,外加几个示例!