当前位置:网站首页>“山东大学移动互联网开发技术教学网站建设”项目实训日志四
“山东大学移动互联网开发技术教学网站建设”项目实训日志四
2022-07-29 05:19:00 【BEER_7】
时间:
21春季学期第八周
个人工作内容:
完成摇摇闹钟案例app
详细记录:
- 指南针案例app设计说明
- 目标用户:android开发入门阶段的学生。
- 需求说明:说明加速度传感器的使用方法,讲解AlarmManager闹钟服务基础,讲解activity间信息传递,还有播放背景音乐、震动。
- 设计说明:用户可以自己设置闹钟,到点后闹钟响铃并震动,需要摇晃手机30次才能关闭闹钟。
要点说明:
页面绘制、细节判断等内容将略过,只简述要点。
- 首页

对“07:00”TextView设置点击事件,调转到子activity(设置闹钟时间):
thetime.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent1 = new Intent(MainActivity.this, selecttime.class);
// startActivity(intent1);
startActivityForResult(intent1,10);
}
});
- 设置闹钟时间

xml文件中TimePicker组件:
<TimePicker
android:id="@+id/ttime"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
activity中监听TimePicker取值变化:
//设置是否24小时制显示
mTimepicker.setIs24HourView(true);
//禁用键盘输入
mTimepicker.setDescendantFocusability(TimePicker.FOCUS_BLOCK_DESCENDANTS);
mTimepicker.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() {
@Override
public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
// Toast.makeText(selecttime.this,hourOfDay+"时"+minute+"分",Toast.LENGTH_SHORT).show();
thehour = hourOfDay;
themin = minute;
}
});
至此可以获取到用户选择的闹钟时间,下一步是将时间传递给首页的activity
- 父子activity数据传递
主页activity中代码(同时注意改变主页时间TextView):
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(10 == requestCode){
Bundle bundle=data.getExtras();
if(bundle.getInt("flag") == 1){
cgdhour = bundle.getInt("hour");
cgdmin = bundle.getInt("minute");}}}
子activity中代码:
changetm.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
Bundle bundle=new Bundle();
bundle.putInt("flag", 1);
bundle.putInt("hour", thehour);
bundle.putInt("minute", themin);
intent.putExtras(bundle);
setResult(RESULT_OK, intent);
finish();
}
});
- AlarmManager闹钟服务

am = (AlarmManager) getSystemService(Service.ALARM_SERVICE);
intent = new Intent(MainActivity.this, ring.class);
pendingIntent = PendingIntent.getActivity(this,0,intent,0);
对Switch组件设置监听:
thebtn.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked){
if(isoutdue(cgdhour,cgdmin) == 1)
Toast.makeText(MainActivity.this,"闹钟已开启,将于明日"+thetime.getText()+"响铃",Toast.LENGTH_SHORT).show();
else
Toast.makeText(MainActivity.this,"闹钟已开启,将于今日"+thetime.getText()+"响铃",Toast.LENGTH_SHORT).show();
setAlarm();
}else {
Toast.makeText(MainActivity.this,"闹钟已关闭",Toast.LENGTH_SHORT).show();
cancelAlarm();
}
}
});
开启闹钟:
private void setAlarm(){
//android Api的改变不同版本中设置有所不同
if(Build.VERSION.SDK_INT<19){
am.set(AlarmManager.RTC_WAKEUP,getTimeDiff(cgdhour,cgdmin),pendingIntent);
}else{
am.setExact(AlarmManager.RTC_WAKEUP,getTimeDiff(cgdhour,cgdmin),pendingIntent);
}
}
关闭闹钟:
private void cancelAlarm(){ am.cancel(pendingIntent); }
获取set(int type,long startTime,PendingIntent pi)中参数startTime:
public long getTimeDiff(int a, int b){
//获得Calendar这个类的实例
Calendar ca=Calendar.getInstance();
//注意精确到秒,时间可以自由设置
//设置为明日
if(isoutdue(a,b) == 1){
ca.set(Calendar.DATE,ca.get(Calendar.DATE)+1);
ca.set(Calendar.HOUR_OF_DAY,a);
ca.set(Calendar.MINUTE,b);
ca.set(Calendar.SECOND,0);
}
else {
ca.set(Calendar.HOUR_OF_DAY,a);
ca.set(Calendar.MINUTE,b);
ca.set(Calendar.SECOND,0);
}
return ca.getTimeInMillis();
}
- 响铃页面

设置背景音乐:
intent = new Intent(ring.this, MyIntentService.class);
String action = MyIntentService.ACTION_MUSIC;
intent.setAction(action);
startService(intent);
震动:
vibrator = (Vibrator)this.getSystemService(this.VIBRATOR_SERVICE);
long[] patter = {0, 1000, 0, 1000};
vibrator.vibrate(patter, 1);
加速度传感器相关设置:
mSensorManager.registerListener(this,
mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),SensorManager.SENSOR_DELAY_NORMAL);
mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
继承SensorEventListener接口时需要实现方法:
@Override
public void onSensorChanged(SensorEvent event) {
// TODO Auto-generated method stub
int sensorType = event.sensor.getType();
//values[0]:X轴,values[1]:Y轴,values[2]:Z轴
float[] values = event.values;
if(sensorType == Sensor.TYPE_ACCELEROMETER){
/*因为一般正常情况下,任意轴数值最大就在9.8~10之间,只有在你突然摇动手机
*的时候,瞬时加速度才会突然增大或减少。
*所以,经过实际测试,只需监听任一轴的加速度大于14的时候,改变你需要的设置就OK了~~~
*/
if((Math.abs(values[0])>14||Math.abs(values[1])>14||Math.abs(values[2])>14)){
//事件
i--;
changei();
if(i == 0)
//摇晃完成,关闭页面,同时关闭震动和背景音乐
finish();
}
}
}
后期工作规划:
- 下周开始教学网站的建设
边栏推荐
- Dao race track is booming. What are the advantages of m-dao?
- Relative positioning and absolute positioning
- MOVE PROTOCOL全球健康宣言,将健康运动进行到底
- Use QSS to style the form
- Display effect of uniapp page title
- link与@import的关系
- Wapiti是什么以及使用教程
- [electronic circuit] how to select ADC chip
- Hcia-r & s self use notes (27) comprehensive experiment
- HCIA-R&S自用笔记(25)NAT技术背景、NAT类型及配置
猜你喜欢
随机推荐
DAO赛道异军突起,M-DAO的优势在哪里?
记xx公司SQL注入漏洞
Countdown of the uniapp component (such as the countdown to reading the agreement and the countdown to completing learning)
[JS question solution] questions 1-10 in JS of niuke.com
MySQL decompressed version windows installation
Okaleido Tiger 7.27日登录Binance NFT,首轮已获不俗成绩
Wechat applet - screen height
从Starfish OS持续对SFO的通缩消耗,长远看SFO的价值
字符类型转换
“山东大学移动互联网开发技术教学网站建设”项目实训日志三
打印出1-100之间的所有质数
Record the SQL injection vulnerability of XX company
Detailed installation and use tutorial of MySQL (nanny installation with pictures and texts)
华为2020校招笔试编程题 看这篇就够了(上)
“山东大学移动互联网开发技术教学网站建设”项目实训日志七
JS simple code determines whether the device that opens the page is the PC end of the computer, the H5 end of the mobile phone, or the wechat end
link与@import的关系
Hcia-r & s self use notes (25) NAT technical background, NAT type and configuration
常见特征工程操作
From starfish OS' continued deflationary consumption of SFO, the value of SFO in the long run









