欢迎来到 厦门市某某地暖科技培训学校
全国咨询热线:020-123456789
联系我们

地址:联系地址联系地址联系地址

电话:020-123456789

传真:020-123456789

邮箱:admin@aa.com

新闻中心
Android开发一个简单实用的闹铃APP
  来源:厦门市某某地暖科技培训学校  更新时间:2024-05-08 13:22:12

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

一个简单的简单闹钟

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

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

效果视频


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


闹钟子项

子项布局效果图


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


闹钟适配器类

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

public class ClockAdapter extends WeSwipeProxyAdapter<ClockAdapter.ViewHolder>

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

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

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

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

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

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

闹钟初始数据

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

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

侧滑删除闹钟子项

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

implementation 'com.github.WangcWj:WeSwipe:1.0.2'n implementation 'cn.wang.we:network:1.0.0'

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

maven { url 'https://jitpack.io' }

布局设置

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


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



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


实现侧滑回调方法

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

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

绑定RecyclerView

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

WeSwipe.attach( mRecyclerView );

删除子项

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

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

新增闹钟子项

序列化实体类

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

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

public class ClockTime implements Serializable

然后通过Intent传输Bundle对象

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

取出序列化实体类对象

clockTimeList = (List<ClockTime>) getIntent().getSerializableExtra( "list" );

TimePicker

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

<TimePickern android:id="@+id/TimePicker"n android:layout_width="wrap_content"n android:layout_height="wrap_content"n android:timePickerMode="spinner"n />

自定义TimePicker文字大小及颜色

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

<style name="ThemePicker" parent="Theme.AppCompat.Light.NoActionBar">n <item name="android:editTextStyle">@style/Widget.Picker.Style</item>n </style>nn <style name="Widget.Picker.Style" parent="@android:style/Widget.EditText">n <item name="android:textColor">@color/colorWhite</item>n <item name="android:textSize">15sp</item>n </style>

然后再指定Activcty申明即可

<activityn android:name=".view.AddClockActivity"n android:theme="@style/ThemePicker"></activity>n <activity

获取时间数据

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

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

返回时间数据

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

存储数据

sp.PutData( context, "Hour", mHour );n sp.PutData( context, "Min", mMin );n sp.PutData( context, "isSelect", isSelect );

取出数据

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

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

子项添加

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

自定义Switch样式

Switch效果如图

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


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


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


创建thumb和track样式

thumb样式

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

<selector xmlns:android="http://schemas.android.com/apk/res/android">n<item android:state_checked="true" android:drawable="@drawable/open_thumb"/>n<item android:drawable="@drawable/shut_thumb"/>n</selector>

选中状态

创新open_thumb.xml文件

<?xml version="1.0" encoding="utf-8"?>n <shape xmlns:android="http://schemas.android.com/apk/res/android"nandroid:shape="rectangle" >n<!-- 高度40 -->n<size android:height="20dp" android:width="20dp"/>n<!-- 圆角弧度 20 -->n<corners android:radius="10dp"/>n<!-- 变化率 -->n<gradientn android:endColor="#eeeeee"n android:startColor="#eeeeee" />n<stroke android:width="1dp"n android:color="#33da33"/>n</shape>

默认状态

创建shut_thumb.xml文件

<?xml version="1.0" encoding="utf-8"?>n<shape xmlns:android="http://schemas.android.com/apk/res/android"n android:shape="rectangle" >n<size android:height="20dp" android:width="20dp"/>n<!-- 圆角弧度 20 -->n<corners android:radius="10dp"/>n<!-- 变化率 -->n<gradientn android:endColor="#eeeeee"n android:startColor="#eeeeee" />n<stroke android:width="1dp"n android:color="#666666"/>nn</shape>

track样式

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

<?xml version="1.0" encoding="utf-8"?>n<selector xmlns:android="http://schemas.android.com/apk/res/android">n <item android:state_checked="true" android:drawable="@drawable/open_track"/>n <item android:drawable="@drawable/shut_track"/>n</selector>

选中状态

<?xml version="1.0" encoding="utf-8"?>n<shape xmlns:android="http://schemas.android.com/apk/res/android"nandroid:shape="rectangle">nn <!-- 高度30 此处设置宽度无效-->n <size android:height="20dp"/>n <!-- 圆角弧度 15 -->n <corners android:radius="10dp"/>n <!-- 变化率 定义从左到右的颜色不变 -->n <gradientn android:endColor="#2EA803"n android:startColor="#2EA803" />n</shape>

默认状态

<?xml version="1.0" encoding="utf-8"?>n<shape xmlns:android="http://schemas.android.com/apk/res/android"n android:shape="rectangle">n <size android:height="20dp" android:width="20dp"/>n <corners android:radius="10dp"/>n <gradient android:startColor="#eeeeee"n android:endColor="#eeeeee"/>n <stroke android:width="1dp"n android:color="#666666"/>n</shape>

闹钟提醒服务

Service

创建一个服务类

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

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

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

<service android:name=".service.ClockService"n android:theme="@style/NotTitleBar"/>

开始服务

使用Intent实现服务启动

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

暂停服务

杀死程序

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

单例类

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

SP封装类

SharedPreferences

KillProcess封装类

KillProcess

TimeFormat封装类

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

文末

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


友情链接智己IM AD的妙处你知道多少?智驾生活从此揭开帷幕智己IM AD的妙处你知道多少?智驾生活从此揭开帷幕中国互联网消费服务平台行业市场运营格局及投资策略探讨报告智己IM AD的妙处你知道多少?智驾生活从此揭开帷幕来自网友的评测:在找绿标短链接的我,测试了5款链接缩短产品汇川技术:工控智能制造龙头,号称“小华为”,每周一股并发编程:CompletableFuture异步编程没有那么难中国工厂“外迁”踩刹车,优质供给“转场”16883款搭载「天玑8000」系列手机盘点,你更看好哪一款呢?C++17:结构化绑定港股午评:恒指涨3.15%,恒生科技指数涨5.74%,比亚迪电子涨超17%www.headphoneclub.com美股科技股1日多数上涨全球大通胀,苹果是否会大面积涨价?垂直整合资讯科技「数科集团」递表港交所,创陞融资保荐首日上涨中信证券:稀土永磁行业有望迎来高速发展的黄金时代《酒业数字藏品技术规范》团体标准起草单位征集H&M二季度增速17%;京东与腾讯开启第三轮战略合作|服装行业热点红米Note12系列遭曝光:居中挖孔直屏设计,有望使用大底主摄苹果手机在“掌阅”APP上打广告,很多人不明白为什么?关于美团好评返现资讯 | 苹果曝光新专利,特斯拉“节流”裁员,绿色金融进入新阶段一文清晰了解-什么是Redis?能干什么?6月30日午间公告一览:四维图新与宝马汽车签署服务框架协议旺季来临前,被要求捷克波兰VAT合规?是否参与到小米造车进程中?千方科技:通过布局路侧智能设备等展开与造车新势力盟友深度合作在 aardio 中嵌入 Delphi 控件嵌入式段错误的3种调试方法汇总研究揭示黄土地区人类工程扰动导致地表回弹现象脑洞大开的金属钛冶炼新工艺 (2018 CN10854696)消息称英特尔 Z790 主板支持 PCIe 5 M.2 SSD,将于第三季度发布四川易泊时捷科技与河南儒凯智能科技就智慧停车等项目开展合作机器人呼叫真的那么好吗?新时达成立高端装备制造软件应用研究新公司纳微科技:元生创投拟减持不超1.5%股份日本教授起诉英特尔FPGA与SoC产品侵犯一项设计专利聚观早报 | 雷军卸任小米互娱执行董事;腾讯新增四个游戏工作室新研究:借助AI算法对隐藏在直接视线之外的物体进行成像5款知乎大佬都说好用的软件,每一个都值得安装联智科技终止创业板IPO 保荐机构为西部证券
联系我们

地址:联系地址联系地址联系地址

电话:020-123456789

传真:020-123456789

邮箱:admin@aa.com

0.3386

Copyright © 2024 Powered by 厦门市某某地暖科技培训学校   sitemap