Android开发一个简单实用的闹铃APP

Android开发一个简单实用的闹铃APP

一个简单的闹钟

生活中我们会常常遇到需要闹钟提醒;不管是起床还是生活中的事件提醒。

那作为Android开发如何自己开发一个闹钟功能呢,是不是觉得很酷呢?接下来我们就实战一个闹钟。

效果视频

闹钟子项

子项布局效果图

闹钟适配器类

本示例采用的是RecyclerView,其适配器类与常无二,其异在于继承一个代理类,为适配之后侧滑删除而准备

public class ClockAdapter extends WeSwipeProxyAdapter

建立一个内部类ViewHolder实现控件定义申明

public ViewHolder(@NonNull View itemView) { super( itemView ); DeleteBtn = itemView.findViewById( R.id.DeleteBtn ); Hour = itemView.findViewById( R.id.Hour ); Split = itemView.findViewById( R.id.Split ); Min = itemView.findViewById( R.id.Min ); Layout = itemView.findViewById( R.id.ItemLayout ); ClockSwitch = itemView.findViewById( R.id.ClockSwitch ); }

实现onCreateViewHolder方法载入子项布局文件

public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from( parent.getContext() ).inflate( R.layout.clock_item,parent,false ); return new ViewHolder( view ); }

绑定实体类,实现onBindViewHolder获取数据

public void onBindViewHolder(@NonNull final ViewHolder holder, final int position) { final ClockTime clockTime = timeList.get( position ); holder.Hour.setText( clockTime.getHour() ); holder.Split.setText( “:” ); holder.Min.setText( clockTime.getMin() ); boolean isSelect = clockTime.isSelect(); if (isSelect){ holder.ClockSwitch.setChecked( true ); }else { holder.ClockSwitch.setChecked( false ); } holder.DeleteBtn.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { DeleteItem(position); } } ); holder.ClockSwitch.setOnCheckedChangeListener( new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (isChecked){ SelectModel(holder,clockTime); }else { NormalModel(holder); } } } ); }

闹钟初始数据

此处有三处状态,第一种状态:第一次进入程序,默认加载固定闹钟子项;第二种状态:进入添加子项页面,然后返回其主页面,并判断其switch是否为ture,如果为ture则添加子项;第三种状态:程序被系统回收或者用户停止程序,并再次进入程序,防止加载前一时刻闹钟子项;

/** * 默认数据*/ private void InitData(){ if (flag == START){ for (int i = 6; i < 20 ; i+=2) { ClockTime clockTime = new ClockTime( timeFormat.HandleHour( i ),timeFormat.HandleHour( i ),false ); clockTimeList.add( clockTime ); clockTime.setClockTimeList( clockTimeList ); } }else if (flag == PAUSE){ GetCallBackData(); }else { Log.d( TAG,"Restart App" ); } }

侧滑删除闹钟子项

添加依赖 实现侧滑主要依赖于一个第三方包,然后使用RecyclerView进行子项绑定 依赖如下:

implementation ‘com.github.WangcWj:WeSwipe:1.0.2’ implementation ‘cn.wang.we:network:1.0.0’

并在目录build.gradle包下添加如下库

maven { url ‘https://jitpack.io’ }

布局设置

其实现侧滑删除主要的玄机在于布局文件当中,使用RelativeLayout布局,将删除按钮固定在布局右方,并使用其他布局将其覆盖,只有滑动时,才将其显示。掩盖侧滑删除按钮与暴露侧滑删除按钮效果对比图如下

实现侧滑回调方法

然后,在适配器类中,实现WeSwipeHelper.SwipeLayoutTypeCallBack接口,实现如下三个方法,第一个方法为获取侧滑删除按钮的宽度;第二个方法为需要滑动的视图,也就是覆盖侧滑删除按钮的布局;第三个方法为当视图正在滑动时,用户触发单击事件,自动还原滑动状态

float getSwipeWidth();//获取侧滑删除按钮的宽度 View needSwipeLayout(); View onScreenView();

绑定RecyclerView

最后,在需要添加子项的视图中绑定RecyclerView即可

WeSwipe.attach( mRecyclerView );

删除子项

通过监听子项滑动删除按钮点击事件,实现子项删除

holder.DeleteBtn.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { DeleteItem(position); } } ); private void DeleteItem(int position){ timeList.remove( position ); notifyDataSetChanged(); }

新增闹钟子项

序列化实体类

跳转新增闹钟子项Acticity需要传输实体类对象,传输对象一般需要序列化改类,其操作如下

定义实体类,并实现序列化

public class ClockTime implements Serializable

然后通过Intent传输Bundle对象

public void Add(View view){ flag = 1; Intent intent = new Intent( context,AddClockActivity.class ); Bundle bundle = new Bundle( ); bundle.putSerializable( “list”,(Serializable)clockTimeList ); intent.putExtras( bundle ); startActivity( intent ); }

取出序列化实体类对象

clockTimeList = (List) getIntent().getSerializableExtra( “list” );

TimePicker

实现时间选择主要使用系统集成的组件TimePicker,其使用方法如下 其有两种显示方式,第一种为spinner,就是下拉滑动式,第二种为clock,即显示一个时钟,通过滑动指针选择时间

自定义TimePicker文字大小及颜色

在style.xml文件中申明如下样式

@style/Widget.Picker.Style @color/colorWhite 15sp

然后再指定Activcty申明即可

获取时间数据

获取数据比较简单,实现对应接口即可

timePicker.setOnTimeChangedListener( new TimePicker.OnTimeChangedListener() { @Override public void onTimeChanged(TimePicker view, int hourOfDay, int minute) { mHour = hourOfDay; mMin = minute; } } );

返回时间数据

将获取的数据通过SharedPreferences存储起来,然后点击存储时,进行页面跳转,然后再该界面进行取出数据

存储数据

sp.PutData( context, “Hour”, mHour ); sp.PutData( context, “Min”, mMin ); sp.PutData( context, “isSelect”, isSelect );

取出数据

首先判断回调的switch数据是否为ture,如果为ture则保存该子项,然后再适配器类中进行数据添加

boolean access = (Boolean) sp.GetData( context,”access”,false ); if (access) { int Hour = (int) sp.GetData( context, “Hour”, 0 ); int Min = (int) sp.GetData( context, “Min”, 0 ); boolean isSelect = (boolean) sp.GetData( context, “isSelect”, false ); Log.d( TAG, Hour + “firstHour” ); Log.d( TAG, Min + “firstMin” ); if (Hour == 0 || Min == 0) { Log.d( TAG, “null” ); } else { clockTime = new ClockTime( timeFormat.HandleHour( Hour ), timeFormat.HandleHour( Min ), isSelect ); adapter.AddItem( clockTime ); } }else { Log.d( TAG,”Cancel Set AlarmClock” ); }

子项添加

public void AddItem(ClockTime clockTime){ timeList.add( clockTime ); notifyDataSetChanged(); }

自定义Switch样式

Switch效果如图

选中与默认两种状态效果图如下

创建thumb和track样式

thumb样式

创建一个选择器文件,有选中和默认两种状态

选中状态

创新open_thumb.xml文件

默认状态

创建shut_thumb.xml文件

track样式

同样创建一个选择器,并用于两种状态

选中状态

默认状态

闹钟提醒服务

Service

创建一个服务类

其中AlarmManager为系统主要操作类,参数为提醒模式、提醒时间(long型)、PendingIntent对象 以下有三种时间传入,第一种,直接传入一个Long型时间用于测试,第二种,通过设置系统启动至今而设置时间,第三种,通过取出设置的时间,然后获取系统当前时间,将其差传入其中。

public class ClockService extends Service { private Intent intent; private PendingIntent pendingIntent; private AlarmManager alarmManager; private int Hour,Min; private Calendar calendar; @Nullable @Override public IBinder onBind(Intent intent) { return null; } @Override public int onStartCommand(Intent intent, int flags, int startId) { alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); calendar = Calendar.getInstance(); /** * 10秒,用于测试*/ long Minutes = 60*1000*60; //long triggerAtTime = SystemClock.elapsedRealtime() + Minutes; //alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtTime, pendingIntent); /** * 理论*/ Hour = intent.getIntExtra(“Hour”,0); Min = intent.getIntExtra(“Min”,0); Log.d( TAG,Hour+”ClockServiceHour” ); Log.d( TAG,Min+”ClockServiceMin” ); calendar.setTimeZone( TimeZone.getTimeZone( “GMT+8:00″ ) ); calendar.set( Calendar.HOUR_OF_DAY, Hour ); calendar.set( Calendar.MINUTE, Min ); long clockTime = calendar.getTimeInMillis(); long current = System.currentTimeMillis(); long time = clockTime – current; Log.d( TAG,clockTime+”Clock” ); Log.d( TAG,current+”Current” ); Log.d( TAG,time+”Millisecond” ); intent = new Intent(this, WarnActivity.class); pendingIntent = PendingIntent.getActivity(this, 0, intent, 0); alarmManager.set(AlarmManager.RTC_WAKEUP, time, pendingIntent); return super.onStartCommand( intent, flags, startId ); } @Override public void onDestroy() { super.onDestroy(); //alarmManager.cancel(pendingIntent); }

然后再清单文件中注册服务

开始服务

使用Intent实现服务启动

private void StartService(){ Intent intent = new Intent( this, ClockService.class ); intent.putExtra( “Hour”,mHour ); intent.putExtra( “Min”,mMin ); startService( intent ); }

暂停服务

杀死程序

public void Exit(View view){ killProcess.finishAll(); }

单例类

本示例总共使用到了三个单例类:SP(SharedPreferences封装)、TimeFormat(时间数据格式封装)、KillProcess(杀死所有Activity)

SP封装类

SharedPreferences

KillProcess封装类

KillProcess

TimeFormat封装类

ublic class TimeFormat { private static TimeFormat timeFormat; private TimeFormat(){ } public static TimeFormat getInstance(){ if (timeFormat == null){ sync(); } return timeFormat; } private static synchronized void sync(){ if (timeFormat == null){ timeFormat = new TimeFormat(); } } public String HandleHour(int hour){ if (hour < 10){ return "0"+hour; }else { return String.valueOf( hour ); } } public String HandleWeek(int week){ String weekday = ""; switch (week){ case 1: weekday = "星期一"; break; case 2: weekday = "星期二"; break; case 3: weekday = "星期三"; break; case 4: weekday = "星期四"; break; case 5: weekday = "星期五"; break; case 6: weekday = "星期六"; break; case 7: weekday = "星期七"; break; } return weekday; }}

文末

文章带这里就完成了一个简单的闹钟;Android开发还有许多更加更多的知识学习。进一步学习Android技术,我这里推荐这份笔记方便学习,我就放在私信,发送“核心笔记”或“手册”即可获取。朋友们可以免费领取!

郑重声明:本文内容及图片均整理自互联网,不代表本站立场,版权归原作者所有,如有侵权请联系管理员(admin#wlmqw.com)删除。
用户投稿
上一篇 2022年6月25日 21:22
下一篇 2022年6月25日 21:22

相关推荐

  • 5+3疫情防控从哪天开始算(辽宁疫情防控最新政策)

    最近有关国内各地的疫情大家也都有在持续关注,目前国内各地疫情隔离时间也根据二十条防控措施有了新的调整。那么,5+3疫情防控从哪天开始算?对于密接的5+3隔离时间计算大家还是比较关心…

    2022年11月25日
  • 蓝码怎么变绿码需要几天(蓝码怎么变绿码需要几天)

    大家都知道健康码的颜色有红码、绿码、黄码,近日湖南健康码上线“蓝码”,不少小伙伴发现自己健康码变蓝了,都想赶紧恢复绿码,那么蓝码怎么变绿码需要几天?下面小编为大家带来蓝码变绿码需要…

    2022年11月25日
  • 拼多多百亿补贴预售一般多久发货(拼多多百亿补贴预售)

    拼多多里面有很多优惠活动,其中百亿补贴活动非常火爆,一些里面的东西价格比别的平台便宜,质量也有保障,还有预售的活动,那么拼多多百亿补贴预售一般多久发货?下面小编为大家带来拼多多百亿…

    2022年11月25日
  • 北京疫情多久能解除封控(北京疫情还要多久结束)

    最近一段时间北京疫情形势备受关注,马上就要到年底了,不少人想要去北京办事,。都非常关注当地疫情相关政策,那么 北京疫情多久能解除封控?北京疫情什么时候恢复正常生活?下面小编为大家带…

    2022年11月25日
  • 什么是推广cpa一篇文章带你看懂CPA推广渠道

    CPA渠道 CPA指的是按照指定的行为结算,可以是搜索,可以是注册,可以是激活,可以是搜索下载激活,可以是绑卡,实名认证,可以是付费,可以是浏览等等。甲乙双方可以根据自己的情况来定…

    2022年11月25日
  • 抖音直播带货有哪些方法技巧(抖音直播带货有哪些痛点)

    如今抖音这个短视频的变现能力越来越突显了,尤其是在平台上开通直播,更具有超强的带货属性,已经有越来越多的普通人加入到其中了。不过直播带货虽然很火,但是也不是每个人都能做好的,那么在…

    2022年11月24日
  • 科比19岁女儿遭自称与她生“科比式孩子”男子跟踪骚扰

    极目新闻记者王亮亮黄佳琪 据福克斯新闻网报道,当地时间11月21日,已故篮球巨星科比·布莱恩特的长女娜塔莉亚·布莱恩特21日向法院提交临时限制令,声称这位32岁的前科从十几岁起就骚…

    2022年11月24日
  • 免费清理c盘的软件(清理c盘空间不影响系统)

    电脑用久了慢如龟速,还卡顿,这最大的原因啊就是C盘空间不足造成的。 即使电脑配置再好,或者硬盘再快,如果长时间没有打扫C盘,打开文件或者稳定之类的,都卡得让人头大。 这时候呢不要去…

    2022年11月24日
  • 明查|美国新冠后遗症患者中有16%症状严重以致无法工作?

    点击进入澎湃新闻全球事实核查平台 速览 – 网传数据比例无权威信源佐证,该比例有可能是结合了美国疾病防控中心和布鲁金斯学会的数据得出,但这两个机构的调研目的和样本都不同…

    2022年11月24日
  • pdf虚拟打印机(添加pdf虚拟打印机)

    本文主要讲的是pdf虚拟打印机,以及和添加pdf虚拟打印机相关的知识,如果觉得本文对您有所帮助,不要忘了将本文分享给朋友。 pdf虚拟打印机具体是什么功能? 电脑虚拟打印机的功能有…

    2022年11月24日

联系我们

联系邮箱:admin#wlmqw.com
工作时间:周一至周五,10:30-18:30,节假日休息