前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >简单实现Android闹钟功能

简单实现Android闹钟功能

作者头像
砸漏
发布2020-11-01 15:19:47
3.8K0
发布2020-11-01 15:19:47
举报
文章被收录于专栏:恩蓝脚本恩蓝脚本

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

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; 
//音乐播放器 
} 

运行效果图

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-09-11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档