Android实现简单的闹钟

Android实现简单闹钟

    • Android实现简单闹钟
      • 简单的时间格式转化
      • 日期选择
      • 时间选择
      • 确定时间后开启服务
      • 在服务里使用AlarmManager定时在AlarmManager里设置到点发送一条广播
      • 实现一个BroadcastReceiver接收到定点的广播后发送一条通知

简单的时间格式转化

    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,自学后的总结)