作者 by admin / 2022-10-09 / 暂无评论 / 3097 个足迹
题目
使用Android Studio写一个番茄钟,需要包含计时界面,番茄钟调整(工作时间、休息时间、工作组数),工作或休息时间结束时提醒用户并自动开始下一个番茄周期。
要求项目必须集成Github中的至少一个项目或框架。
Github的推荐安卓项目/框架:
AndroidProject(安卓技术中台):https://github.com/getActivity/AndroidProject
XXPermissions(权限请求框架):https://github.com/getActivity/XXPermissions
SmartRefreshLayout(智能下拉刷新框架):https://github.com/scwang90/SmartRefreshLayout
XPopup(弹窗框架):https://github.com/li-xiaojun/XPopup
EasyFloat(悬浮窗框架):https://github.com/princekin-f/EasyFloat
中等:实现番茄钟计时界面、番茄钟调整、时间到了提醒用户
所需知识:
Java:基础知识
Android:子线程(后台计时)、动态更新布局(页面计时时间)、权限配置(震动或响铃提醒用户)
较难:在中等的前提下,实现用户数据记忆(时间及周期),屏幕常亮(用户切换)
中等前提下还需要你掌握:
SharedPreferences、getWindow().addFlags()
解
题目不难,总体来说抽成几个部分:计时界面、计时功能、提醒功能。
计时界面和功能方面,我使用了Github上的CircleTimerView项目,提取其中的界面代码,并且计时功能已在其项目中集成,只是需要自己略加修改。
提醒功能方面,我写了一个MyNotification类,在其中写好通知方法和响铃/震动。
通知函数代码如下:
/**
* 专用于TimerActivity的通知函数
* 发送一个无声通知
* 支持通知点击跳转
* @param context
* @param Title
* @param ContentText
* @param SubText
* @param Ticker
*/
public static void SendNotification(Context context,String Title,String ContentText,String SubText,String Ticker){
NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
Intent intent=new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.setComponent(new ComponentName(context, TimerActivity.class));//用ComponentName得到class对象
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
| Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);// 关键的一步,设置启动模式,两种情况
PendingIntent pendingIntent;
//PendingIntent 是用于构建通知跳转路径的
// Android12以后,构建时必须指定标识 PendingIntent.FLAG_MUTABLE or PendingIntent.FLAG_IMMUTABLE,否则通知将构建失败抛出异常
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_MUTABLE);
}else {
pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
}
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
// 使用NotificationChannel 类构建一个通知渠道
NotificationChannel notificationChannel = new NotificationChannel("2", Title,
NotificationManager.IMPORTANCE_LOW);
notificationChannel.setSound(null,null);//设置静音
//通知的一些行为样式配置。
notificationChannel.enableLights(true); //是否在launcher icon右上角展示提示点
notificationChannel.setLightColor(Color.RED); //提示点颜色
notificationManager.createNotificationChannel(notificationChannel);
Notification notification = new Notification.Builder(context,"2")
.setContentTitle(Title)//标题
.setContentText(ContentText)//内容
.setSubText(SubText)//内容下面的一小段文字
.setTicker(Ticker)//收到信息后状态栏显示的文字信息
.setContentIntent(pendingIntent)//跳转页面
.setWhen(System.currentTimeMillis())//设置通知时间
.setSmallIcon(R.mipmap.ic_launcher_round)//设置小图标
.build();
notificationManager.notify(1, notification);
}else {
Notification notification = new Notification.Builder(context)
.setContentTitle(Title)//标题
.setContentText(ContentText)//内容
.setSubText(SubText)//内容下面的一小段文字
.setTicker(Ticker)//收到信息后状态栏显示的文字信息
.setSound(null)//设置静音
.setContentIntent(pendingIntent)//跳转页面
.setWhen(System.currentTimeMillis())//设置通知时间
.setSmallIcon(R.mipmap.ic_launcher_round)//设置小图标
.build();
notificationManager.notify(1, notification);
}
}
注意:Android12以后,构建时必须指定标识 PendingIntent.FLAG_MUTABLE or PendingIntent.FLAG_IMMUTABLE,否则通知将构建失败抛出异常。
响铃和震动直接调用即可,不在此特别说明,只是不要忘记向manifest中加入权限。
用户数据记忆用SharedPreferences即可,例:
//初始化SharedPreferences储存
sharedPreferences= getApplicationContext().getSharedPreferences("Pomodoro", Context.MODE_PRIVATE);
//将SharedPreferences储存可编辑化
editor=sharedPreferences.edit();
sharedPreferences.getInt("workTime", 25)
......
屏幕常亮:
//在Window增加flag打开屏幕常亮:
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
ScreenOnBtu.setBackgroundResource(R.drawable.ic_keep_screen_on);
//在Window去除flag关闭屏幕常亮:
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
ScreenOnBtu.setBackgroundResource(R.drawable.ic_keep_screen_off);
我的工程文件如下:
FocusOn.zip
评论已关闭