




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】Android中怎么实现一个闹钟功能
本篇文章为大家展示了Android中怎么实现一个闹钟功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。AlarmViewpackage
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);
}
mit();
}
//读取已存数据
@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;
}
}TimeViewpackage
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;
}AlarmReceiverpackage
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);
}
}MainActivitypackage
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
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 公路项目人员聘请合同范本
- 农村房屋安装维修合同范本
- 公司员工劳动合同范本
- 北京企业住房合同范本
- 产品交付标准合同范本
- 公司担保合同范本6
- 综合实践项目《制作细胞模型》教学设计-2024-2025学年鲁科版生物六年级上册
- 2人合伙合同范本
- 修路混凝土合同范本
- 产品加工定制合同范本
- 2025年黑龙江交通职业技术学院单招职业技能测试题库必考题
- 个人画协议合同范本
- 2024-2025学年山东省潍坊市高三上学期1月期末英语试题
- 2025-2030年中国青海省旅游行业市场现状调查及发展趋向研判报告
- 人力资源部门2023年度招聘效果分析
- 八年级数学下册 第1章 单元综合测试卷(北师版 2025年春)
- 人教版2025-初中物理实验室实验课程安排
- 舞蹈艺术赏析课件
- 2025年春新外研版(三起)英语三年级下册课件 Unit1第1课时Startup
- 2025年安徽碳鑫科技有限公司招聘笔试参考题库含答案解析
- 2025年寒假实践特色作业设计模板
评论
0/150
提交评论