Android实现简单的闹钟

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设置到点发送一条广播 -> 广播接收器接收到广播后发送一条通知 -> 通知发出铃声、震动、文字或图片通知

  • 10
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 22
    评论
实现简单闹钟的方法有很多种,以下是一种比较简单实现方式: 1. 创建一个新的Android项目,并新建一个名为AlarmClock的Java类作为主活动(MainActivity)。 2. 在活动的布局文件中添加一个TextView用于显示当前时间,并在活动类中获取该TextView的实例。 3. 在活动的生命周期方法中,使用一个Handler和Runnable对象来更新TextView的时间显示,可以通过System.currentTimeMillis()方法获取当前的毫秒数,并根据需要转换成适当的时间格式进行显示。 4. 在活动的生命周期方法中,使用一个定时器(Timer)来让时间每秒更新一次,这可以通过创建一个TimerTask对象,并使用Timer的schedule()方法来安排任务的执行。 5. 在布局文件中添加一个Button用于设置闹钟,并在活动类中获取该Button的实例。 6. 在Button的点击事件监听器中实现设置闹钟的逻辑,可以通过创建一个DatePickerDialog和TimePickerDialog来让用户选择闹钟的日期和时间,并将选择的时间保存到SharedPreferences中。 7. 在活动的生命周期方法中,使用SharedPreferences获取保存的闹钟时间,并与当前时间进行比较,如果两者相同,则触发闹钟,可以通过显示一个Toast或者弹出一个对话框来提醒用户。 8. 可以使用MediaPlayer类来播放闹钟的声音,例如选择一首铃声作为闹钟的提示音。 以上是一个简单Android闹钟实现方式,可以根据需要进行修改和拓展。此外,还可以考虑增加一些其他功能,如闹钟的重复设置、多个闹钟的管理、自定义铃声等,以提供更好的用户体验。
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值