“山东大学移动互联网开发技术教学网站建设”项目实训日志四

时间:

​ 21春季学期第八周


个人工作内容:

​ 完成摇摇闹钟案例app


详细记录:
  • 指南针案例app设计说明
    • 目标用户:android开发入门阶段的学生。
    • 需求说明:说明加速度传感器的使用方法,讲解AlarmManager闹钟服务基础,讲解activity间信息传递,还有播放背景音乐、震动。
    • 设计说明:用户可以自己设置闹钟,到点后闹钟响铃并震动,需要摇晃手机30次才能关闭闹钟。
要点说明:

页面绘制、细节判断等内容将略过,只简述要点。

  • 首页
    图1
    对“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);
            }
        });
  • 设置闹钟时间

图2
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闹钟服务
    图3
		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();
    }
  • 响铃页面
    图4

设置背景音乐:

		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();
            }
        }
    }

后期工作规划:
  • 下周开始教学网站的建设
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值