最新2019年10月7日(趁着国庆有时间)更新了一波,界面好看了很多,但还是有很多地方不完善,以后抽时间再次更新
不完善的地方:
不能同时开多个闹钟,这个有点困难,有想法的同学可以告我怎么做
后台程序无法长期保存,这个应该没有办法解决,因为不是系统级别的应用
所以只是用来学习交流的,主要掌握定时器的用法就行了
效果图如图:
顺便说一下我用得编译器是Android Studio
下面讲解一下关键的几个步骤:(并非全部代码)
首先我用的是Litepal数据库
所以先新建了一个表
public class Clock extends DataSupport {
public static final int clock_open = 1;
public static final int clock_close = 0;
String hour;
String minute;
String content;
int ClockType;
public String getMinute() {
return minute;
}
public String getHour() {
return hour;
}
public void setHour(String hour) {
this.hour = hour;
}
public void setMinute(String minute) {
this.minute = minute;
}
public int getClockType() {
return ClockType;
}
public void setClockType(int clockType) {
ClockType = clockType;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
然后比较重要的代码修改,保存和删除(这里用了定时器服务,会在指定时间发出广播)
case R.id.set_time:
calendar.setTimeInMillis(System.currentTimeMillis());
int mhour = calendar.get(Calendar.HOUR_OF_DAY);
int mminute = calendar.get(Calendar.MINUTE);
new TimePickerDialog(ClockDetail.this, new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
//calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, hourOfDay);
calendar.set(Calendar.MINUTE, minute);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
hourformat = format(hourOfDay);
minuteformat = format(minute);
Toast.makeText(ClockDetail.this, "" + hourformat + ":" + minuteformat, Toast.LENGTH_SHORT).show();
show_hour.setText(hourformat);
show_minute.setText(minuteformat);
}
}, mhour, mminute, true).show();
break;
case R.id.save:
clock.setHour(hourformat);
clock.setMinute(minuteformat);
clock.setContent("" + content.getText().toString());
clock.setClockType(Clock.clock_open);
clock.save();
Intent intent = new Intent(ClockDetail.this, CallAlarm.class);
// intent.putExtra("content",clock.getContent());
//sendBroadcast(intent);
PendingIntent sender = PendingIntent.getBroadcast(
ClockDetail.this, 0, intent, 0);
AlarmManager am;
am = (AlarmManager) getSystemService(ALARM_SERVICE);
Log.e("gethour",clock.getHour());
Log.e("gethour",clock.getMinute());
calendar.set(Calendar.HOUR_OF_DAY, Integer.parseInt(clock.getHour()));
calendar.set(Calendar.MINUTE, Integer.parseInt(clock.getMinute()));
Log.e("TAG",calendar.getTimeInMillis()+"");
Log.e("TAG",System.currentTimeMillis()+"");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
if (System.currentTimeMillis()>calendar.getTimeInMillis()+60000){
//加24小时
am.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis()+86400000, sender);
}else {
am.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), sender);
}
}
timeAdapter.notifyDataSetChanged();
finish();
break;
case R.id.delete:
clock.delete();
timeAdapter.notifyDataSetChanged();
Intent intent1 = new Intent(context, CallAlarm.class);
PendingIntent sender1=PendingIntent.getBroadcast(
context,0, intent1, 0);
am =(AlarmManager)context.getSystemService(ALARM_SERVICE);
am.cancel(sender1);
finish();
break;
广播接受者(接收指定时间发过来的广播)
public class CallAlarm extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Intent intent1 = new Intent(context,AlarmAlert.class);
Bundle bundle = new Bundle();
bundle.putString("STR_CALLER","");
intent1.putExtras(bundle);
intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent1);
}
}
收到广播后会跳转到这里
public class AlarmAlert extends Activity {
private MediaPlayer mediaPlayer;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
int position = getIntent().getIntExtra("position",-1);
mediaPlayer = MediaPlayer.create(this,R.raw.clockmusic2);
mediaPlayer.start();
new AlertDialog.Builder(AlarmAlert.this)
.setIcon(R.drawable.clock)
.setTitle("闹钟响了")
.setCancelable(false)
.setMessage("时间到了!")
.setPositiveButton("关掉"
, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
AlarmAlert.this.finish();
mediaPlayer.stop();
}
}).show();
}
}
最后再贴一下Adapter里的代码吧,感觉这块的逻辑也挺重要的
package com.example.dell.alarmalert_csdn;
public class TimeAdapter extends RecyclerView.Adapter<TimeAdapter.ViewHolder> {
List<Clock> list;
LayoutInflater layoutInflater;
Context context;
Calendar calendar = Calendar.getInstance();
public static int pos;
public TimeAdapter(List<Clock> list, Context context) {
this.list = list;
this.context = context;
layoutInflater = LayoutInflater.from(context);
}
@Override
public TimeAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = layoutInflater.inflate(R.layout.clockitem, null);
ViewHolder viewHolder = new ViewHolder(view);
return viewHolder;
}
@SuppressLint({"ResourceAsColor", "SetTextI18n"})
@Override
public void onBindViewHolder(@NonNull final TimeAdapter.ViewHolder viewHolder, final int i) {
final Clock clock = list.get(i);
pos = i;
Log.e("i=======",i+" "+clock.getClockType());
if (clock.getClockType() == Clock.clock_open){
viewHolder.aSwitch.setChecked(true);
viewHolder.hour.setTextColor(context.getResources().getColor(R.color.colorBlack));
viewHolder.minute.setTextColor(context.getResources().getColor(R.color.colorBlack));
viewHolder.net.setTextColor(context.getResources().getColor(R.color.colorBlack));
viewHolder.content.setTextColor(context.getResources().getColor(R.color.colorBlack));
}else if (clock.getClockType() == Clock.clock_close){
viewHolder.aSwitch.setChecked(false);
viewHolder.hour.setTextColor(context.getResources().getColor(R.color.colorGray));
viewHolder.minute.setTextColor(context.getResources().getColor(R.color.colorGray));
viewHolder.net.setTextColor(context.getResources().getColor(R.color.colorGray));
viewHolder.content.setTextColor(context.getResources().getColor(R.color.colorGray));
}
viewHolder.hour.setText(clock.getHour()+"");
viewHolder.minute.setText(clock.getMinute()+"");
viewHolder.content.setText(clock.getContent());
viewHolder.todetail.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.e("TODETAIL",clock.getClockType()+"");
Intent intent = new Intent(context, ClockDetail.class);
intent.putExtra("position", i);
context.startActivity(intent);
}
});
viewHolder.aSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@SuppressLint("ResourceAsColor")
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
clock.setClockType(Clock.clock_open);
//clock.updateAll();
clock.save();
Toast.makeText(context, "开启闹钟", Toast.LENGTH_SHORT).show();
viewHolder.hour.setTextColor(context.getResources().getColor(R.color.colorBlack));
viewHolder.minute.setTextColor(context.getResources().getColor(R.color.colorBlack));
viewHolder.net.setTextColor(context.getResources().getColor(R.color.colorBlack));
viewHolder.content.setTextColor(context.getResources().getColor(R.color.colorBlack));
Intent intent = new Intent(context, CallAlarm.class);
PendingIntent sender = PendingIntent.getBroadcast(
context, 0, intent, 0);
AlarmManager am;
am = (AlarmManager) context.getSystemService(ALARM_SERVICE);
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, Integer.parseInt(clock.getHour()));
calendar.set(Calendar.MINUTE, Integer.parseInt(clock.getMinute()));
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
Log.e("TAG",calendar.getTimeInMillis()+"");
Log.e("TAG",System.currentTimeMillis()+"");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
if (System.currentTimeMillis()>calendar.getTimeInMillis()+40000){
//加24小时
am.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis()+86400000, sender);
}else {
am.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), sender);
}
}
} else if (!isChecked){
clock.setClockType(Clock.clock_close);
//clock.updateAll();
clock.save();
Log.e("status------",clock.getHour()+clock.getMinute()+clock.getMinute()+clock.getClockType()+"");
Log.e("关闭闹钟",clock.getClockType()+"");
Intent intent = new Intent(context, CallAlarm.class);
PendingIntent sender=PendingIntent.getBroadcast(
context,0, intent, 0);
AlarmManager am;
am =(AlarmManager)context.getSystemService(ALARM_SERVICE);
am.cancel(sender);
Toast.makeText(context, "关闭闹钟", Toast.LENGTH_SHORT).show();
viewHolder.hour.setTextColor(context.getResources().getColor(R.color.colorGray));
viewHolder.minute.setTextColor(context.getResources().getColor(R.color.colorGray));
viewHolder.net.setTextColor(context.getResources().getColor(R.color.colorGray));
viewHolder.content.setTextColor(context.getResources().getColor(R.color.colorGray));
}
}
});
}
@Override
public int getItemCount() {
return list.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
TextView hour;
TextView minute;
TextView content;
TextView net;
Switch aSwitch;
LinearLayout todetail;
public ViewHolder(@NonNull View itemView) {
super(itemView);
hour = itemView.findViewById(R.id.hour);
minute = itemView.findViewById(R.id.minute);
net = itemView.findViewById(R.id.net);
content = itemView.findViewById(R.id.content_item);
aSwitch = itemView.findViewById(R.id.switch_control);
todetail = itemView.findViewById(R.id.todetail);
}
}
}
源码下载地址
GitHub地址https://github.com/jh360twb/Alarmalert-csdn
CSDN积分下载Alarmalert-csdn_2.rar_android闹钟开发-Android代码类资源-CSDN下载