简单实现Android闹钟功能

2020-11-01 15:19:47 浏览数 (1)

闹钟的简单实现,只有显示时间和设置闹钟。

AlarmView

代码语言:javascript复制
package com.example.lenovo.clock2; 
import android.app.AlarmManager; 
import android.app.PendingIntent; 
import android.app.TimePickerDialog; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.icu.util.Calendar; 
import android.os.Build; 
import android.support.annotation.Nullable; 
import android.support.annotation.RequiresApi; 
import android.support.v7.app.AlertDialog; 
import android.util.AttributeSet; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.LinearLayout; 
import android.widget.ListView; 
import android.widget.TimePicker; 
import java.util.Date; 
/** 
* Created by lenovo on 2017/11/20. 
*/ 
//闹钟 
public class AlarmView extends LinearLayout { 
// public AlarmView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { 
//  super(context, attrs, defStyleAttr); 
// } 
public AlarmView(Context context, @Nullable AttributeSet attrs) { 
super(context, attrs); 
init(); 
} 
public AlarmView(Context context) { 
super(context); 
init(); 
} 
private void init(){ 
alarmManager= (AlarmManager) getContext().getSystemService(Context.ALARM_SERVICE); 
} 
@RequiresApi(api = Build.VERSION_CODES.N) 
@Override 
protected void onFinishInflate() { 
super.onFinishInflate(); 
btnAddAlarm=findViewById(R.id.btnAddAlarm); 
lvAlarmList=findViewById(R.id.lvAlarmList); 
adapter=new ArrayAdapter<AlarmView.AlarmData (getContext(),R.layout.support_simple_spinner_dropdown_item); 
lvAlarmList.setAdapter(adapter); 
readSavedAlarmList(); 
//adapter.add(new AlarmData(System.currentTimeMillis())); 
btnAddAlarm.setOnClickListener(new OnClickListener() { 
@RequiresApi(api = Build.VERSION_CODES.N) 
@Override 
public void onClick(View view) { 
addAlarm(); 
} 
}); 
lvAlarmList.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener(){ 
@Override 
public boolean onItemLongClick(AdapterView<?  adapterView, View view, final int position, long id) { 
new AlertDialog.Builder(getContext()).setTitle("操作选项").setItems(new CharSequence[]{"删除"}, new DialogInterface.OnClickListener() { 
@Override 
public void onClick(DialogInterface dialogInterface, int which) { 
switch (which){ 
case 0: 
deleteAlarm(position); 
break; 
default: 
break; 
} 
} 
}).setNegativeButton("取消",null).show(); 
return true; 
} 
}); 
} 
private void deleteAlarm(int position){ 
AlarmData ad=adapter.getItem(position); 
adapter.remove(ad); 
saveAlarmList();//重新保存 
alarmManager.cancel(PendingIntent.getBroadcast(getContext(),ad.getId(),new Intent(getContext(),AlarmReceiver.class),0)); 
} 
@RequiresApi(api = Build.VERSION_CODES.N) 
private void addAlarm(){ 
//获取当前时间 
Calendar c=Calendar.getInstance(); 
//时间选择框 
new TimePickerDialog(getContext(), new TimePickerDialog.OnTimeSetListener() { 
@Override 
public void onTimeSet(TimePicker view, int hourOfDay, int minute) { 
Calendar calendar =Calendar.getInstance(); 
calendar.set(Calendar.HOUR_OF_DAY,hourOfDay); 
calendar.set(Calendar.MINUTE,minute); 
calendar.set(Calendar.SECOND,0); 
calendar.set(Calendar.MILLISECOND,0); 
//写出当前时间 
Calendar currentTime=Calendar.getInstance(); 
//设置时间小于当前时间,往后推一天 
if(calendar.getTimeInMillis()<=currentTime.getTimeInMillis()){ 
calendar.setTimeInMillis(calendar.getTimeInMillis() 24*60*60*1000); 
} 
AlarmData ad=new AlarmData(calendar.getTimeInMillis()); 
adapter.add(ad); 
/* 
第一个参数 RTC操作系统时间为启动时间点,WAKEUP系统休眠时同样执行 
第二个参数 什么时候启动 
第三个参数 启动之后什么时间再次启动 
第四个参数 Pendingintent挂起的Intent,不立即执行 
*/ 
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, 
ad.getTime(),//当前时间当做请求码 
5*60*1000, 
//执行广播 
PendingIntent.getBroadcast(getContext(), 
ad.getId(), 
new Intent(getContext(), 
AlarmReceiver.class), 
0)); 
//每一个闹钟对应一个请求码,根据请求码移除特定的闹钟,那么把时间当做请求码 
saveAlarmList(); 
} 
},c.get(Calendar.HOUR_OF_DAY),c.get(Calendar.MINUTE),true).show(); 
} 
//保存闹钟数据 
private void saveAlarmList(){ 
SharedPreferences.Editor editor=getContext().getSharedPreferences(AlarmView.class.getName(),Context.MODE_PRIVATE).edit(); 
StringBuffer sb=new StringBuffer(); 
for(int i=0;i<adapter.getCount();i  ){ 
sb.append(adapter.getItem(i).getTime()).append(","); 
} 
if(sb.length() 1){ 
String content=sb.toString().substring(0,sb.length()-1);//去掉最后一个逗号 
editor.putString(KEY_ALARM_LIST,content); 
}else{ 
editor.putString(KEY_ALARM_LIST,null); 
} 
editor.commit(); 
} 
//读取已存数据 
@RequiresApi(api = Build.VERSION_CODES.N) 
private void readSavedAlarmList(){ 
SharedPreferences sp=getContext().getSharedPreferences((AlarmView.class.getName()), Context.MODE_PRIVATE); 
String content=sp.getString(KEY_ALARM_LIST,null); 
if(content!=null){ 
String[] timeStrings=content.split(","); 
for(String string:timeStrings){ 
adapter.add(new AlarmData(Long.parseLong(string))); 
} 
} 
} 
private static final String KEY_ALARM_LIST="alarmList"; 
private Button btnAddAlarm; 
private ListView lvAlarmList; 
private ArrayAdapter<AlarmData  adapter; 
private AlarmManager alarmManager;//系统的闹钟服务 
private static class AlarmData{ 
//闹钟所要响起的时间 
@RequiresApi(api = Build.VERSION_CODES.N) 
public AlarmData(long time){ 
this.time=time; 
date= Calendar.getInstance(); 
date.setTimeInMillis(time); 
timeLable=String.format("%d月%d日 %d:%d", 
date.get(Calendar.MONTH) 1,//getMonth的返回值是从0开始的 
date.get(Calendar.DAY_OF_MONTH), 
date.get(Calendar.HOUR_OF_DAY), 
date.get(Calendar.MINUTE)); 
} 
public long getTime(){ 
return time; 
} 
public String getTimeLable(){ 
return timeLable; 
} 
@Override 
public String toString() { 
return getTimeLable(); 
} 
public int getId(){ 
return (int)(getTime()/1000/60);//精确到分钟,getTime为毫秒 
} 
//获取时间的标签 
private String timeLable=""; 
private long time=0; 
private Calendar date; 
} 
} 

TimeView

代码语言:javascript复制
package com.example.lenovo.clock2; 
import android.content.Context; 
import android.icu.util.Calendar; 
import android.os.Build; 
import android.os.Handler; 
import android.os.Message; 
import android.support.annotation.IntDef; 
import android.support.annotation.NonNull; 
import android.support.annotation.Nullable; 
import android.support.annotation.RequiresApi; 
import android.util.AttributeSet; 
import android.view.View; 
import android.widget.LinearLayout; 
import android.widget.TextView; 
/** 
* Created by lenovo on 2017/11/20. 
*/ 
//时钟 显示目前的时间 
public class TimeView extends LinearLayout { 
public TimeView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { 
super(context, attrs, defStyleAttr); 
} 
public TimeView(Context context, @Nullable AttributeSet attrs) { 
super(context, attrs); 
} 
public TimeView(Context context) { 
super(context); 
} 
@Override 
protected void onFinishInflate() { 
super.onFinishInflate(); 
tvTime=findViewById(R.id.tvTime); 
tvTime.setText("这里显示时间"); 
timerHander.sendEmptyMessage(0); 
} 
//判断可见属性是否发生改变 
@Override 
protected void onVisibilityChanged(View changedView, int visibility) { 
super.onVisibilityChanged(changedView, visibility); 
if(getVisibility()== View.VISIBLE){ 
timerHander.sendEmptyMessage(0);//可见,则呈现 
}else{ 
timerHander.removeMessages(0);//否则移除所有消息 
} 
} 
//刷新时间 
@RequiresApi(api = Build.VERSION_CODES.N) 
private void refreshTime(){ 
Calendar c=Calendar.getInstance(); 
tvTime.setText(String.format("%d:%d:%d",c.get(Calendar.HOUR_OF_DAY),c.get(Calendar.MINUTE),c.get(Calendar.SECOND))); 
} 
//Hander每隔一秒执行一次 
private Handler timerHander=new Handler(){ 
@RequiresApi(api = Build.VERSION_CODES.N) 
@Override 
public void handleMessage(Message msg) { 
refreshTime(); 
//若为当前页面,则刷新;否则,没有必要刷新 
if (getVisibility()== View.VISIBLE) { 
timerHander.sendEmptyMessageDelayed(0, 1000);//1000毫秒后再执行handleMessage方法 
} 
}; 
}; 
private TextView tvTime; 
} 

AlarmReceiver

代码语言:javascript复制
package com.example.lenovo.clock2; 
import android.app.AlarmManager; 
import android.app.PendingIntent; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
/** 
* Created by lenovo on 2017/11/23. 
*/ 
public class AlarmReceiver extends BroadcastReceiver { 
@Override 
public void onReceive(Context context, Intent intent) { 
AlarmManager am= (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
am.cancel(PendingIntent.getBroadcast(context,getResultCode(),new Intent(context,AlarmReceiver.class),0)); 
Intent i=new Intent(context,PlayAlarmAty.class); 
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
context.startActivity(i); 
} 
} 

MainActivity

代码语言:javascript复制
package com.example.lenovo.clock2; 
import android.app.Activity; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.widget.TabHost; 
public class MainActivity extends Activity { 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.activity_main); 
tabHost= (TabHost) findViewById(R.id.tabhost); 
tabHost.setup(); 
//setContent()为声明内容 
tabHost.addTab(tabHost.newTabSpec("tabTime").setIndicator("时钟").setContent(R.id.tabTime)); 
tabHost.addTab(tabHost.newTabSpec("tabAlarm").setIndicator("闹钟").setContent(R.id.tabAlarm)); 
tabHost.addTab(tabHost.newTabSpec("tabTimer").setIndicator("计时器").setContent(R.id.tabTimer)); 
tabHost.addTab(tabHost.newTabSpec("tabStopWatch").setIndicator("秒表").setContent(R.id.tabStopWatch)); 
} 
private TabHost tabHost; 
} 

PlayAlarmAty

代码语言:javascript复制
package com.example.lenovo.clock2; 
import android.app.Activity; 
import android.media.MediaPlayer; 
import android.os.Bundle; 
import android.support.annotation.Nullable; 
/** 
* Created by lenovo on 2017/11/25. 
*/ 
public class PlayAlarmAty extends Activity { 
@Override 
protected void onCreate(@Nullable Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.alarm_player_aty); 
mp=MediaPlayer.create(this,R.raw.mine); 
mp.start(); 
} 
@Override 
protected void onPause() { 
super.onPause(); 
finish(); 
} 
@Override 
protected void onDestroy() { 
super.onDestroy(); 
mp.stop(); 
mp.release(); 
} 
private MediaPlayer mp; 
//音乐播放器 
} 

运行效果图

以上就是本文的全部内容,希望对大家的学习有所帮助。

0 人点赞