【移动应用开发技术】Android中怎么实现一个闹钟功能_第1页
【移动应用开发技术】Android中怎么实现一个闹钟功能_第2页
【移动应用开发技术】Android中怎么实现一个闹钟功能_第3页
【移动应用开发技术】Android中怎么实现一个闹钟功能_第4页
【移动应用开发技术】Android中怎么实现一个闹钟功能_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

【移动应用开发技术】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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论