2021SC@SDUSC

目录

晃动取消闹钟综述

所需基本知识

Switch

TimePicker

通用Intent

显式Intent

隐式Intent

方法

Bundle

Bundle与Intent区别

startActivityForResult用法

从子Activity获取返回结果

设置返回结果

setDescendantFocusability()

布局

主页面

定闹钟页面

响铃页面

设置闹钟时间

进入闹钟设置页面

获取用户设置的时间

TimePicker设置时间改变监听

Button设置点击事件监听


晃动取消闹钟综述

“晃动取消闹钟”是一个基于手机陀螺仪的app,当用户定的闹钟响时,用户需晃动闹钟30次才能关闭闹钟,这样能更有效地帮助用户起床。

此app分为三个页面——主页面、定闹钟页面、响铃页面。主要功能为设置/取消闹钟、闹钟响铃、摇一摇取消闹钟。

此app主要代码在于如何获取手机当前时间并对闹钟时间进行设置(需判断今日还是明日)和如何在设定时间内响铃并呈现响铃页面。下图为响铃页面:

android 跳转闹钟 安卓闹钟怎么关震动_返回结果

所需基本知识

Switch

Android Switch允许我们在两个状态之间切换,有点类似现在的滑动解锁。外观上可同时显示出开、关的文本,有利于引导用户操作。Switch属性如下图:

android 跳转闹钟 安卓闹钟怎么关震动_点击事件_02

TimePicker

Android TimePicker是一个时间选择器,主要用于选择时间,可以是24小时制的或是AM/PM12小时制。

属性

android:theme为指定字体颜色及大小用到的。

android:datePickerMode:控件显示方式 clock或spinner.

getCurrentHour():获取当前选择的时间,如果minSdkVersion >=23推荐使用getHour()

getCurrentMinute():获取当前选择的分钟,如果minSdkVersion >=23推荐使用getMinute()

setCurrentHour():获取当前选择的时间,如果minSdkVersion >=23推荐使用setHour()

setCurrentMinute():获取当前选择的分钟,如果minSdkVersion >=23推荐使用setMinute()

is24HourView():获取当前组件是否为24小时模式

setIs24HourView():设置当前组件是否为24小时模式

通用Intent

Intent是Android常用的一个用于组件间互相通信的信息对象,常用于启动组件和传递数据。

显式Intent

显示Intent是在创建Intent对象时就指定接收者。在启动 Activity 时必须在 Intent 中指明要启动的 Activity 所在的类。当需要启动其他 Activity 时,同样需要应用 Intent 和 startActivity() 方法来启动需要的 Activity。

Intent(Context packageContext,Class<?> cls)构造一个指定目标组件的 Intent,显式 Intent 的主要构造方法。

隐式Intent

Intent用于通过描述开发者想在某个Intent对象中执行的简单操作来启动另一应用中的某个Activity。这种Intent称作隐式Intent,因为它并不指定要启动的应用组件,而是制定一项操作并提供执行该操作所需的一些数据。

方法

intent中提供一系列的putExtra()方法的重载,可以把想要传递的数据暂存在intent中,当另一个活动启动后,再把这些数据从intent缓存中取出即可。

Bundle

Bundle主要用于传递数据,它保存的数据,是以key-value的形式存在的。

Bundle经常使用在Activity之间或者线程间传递数据,传递的数据可以是boolean、byte、int、long、float、double、string等基本类型或它们对应的数组,也可以是对象或对象数组。

当Bundle传递的是对象或对象数组时,必须实现Serializable或Parcelable接口。

Bundle提供了各种常用类型的putXxx()/getXxx()方法,用于读写基本类型的数据。

Bundle与Intent区别

Bundle只是一个信息的载体,内部其实就是维护了一个Map<String,Object>

Intent负责Activity之间的交互,内部是持有一个Bundle的。

startActivityForResult用法

如果想在Activity中得到新打开Activity 关闭后返回的数据,需要使用系统提供的startActivityForResult(Intent intent, int requestCode)方法打开新的Activity,新的Activity 关闭后会向前面的Activity传回数据,为了得到传回的数据,必须在前面的Activity中重写onActivityResult(int requestCode, int resultCode, Intent data)方法。

从子Activity获取返回结果

 startActivityForResult(Intent intent, int requestCode)
该方法的第一个参数是intent,第二个参数是请求代码。请求代码先发送给子activity,然后再返回给父activity的用户定义整数值。当一个activity启动多个不同类型的子activity,且需要判断区分消息回馈方时,通常会用到该请求代码

设置返回结果

setResult(int resultCode)

setResult(int resultCode,Intent data)

一般来说,参数resultCode可以是Activity.RESULT_OK、Activity.RESULT_CANCELED这两个预定义常量中的任何一个。

setDescendantFocusability()

这个函数是在ViewGroup里定义的,主要用于控制child View获取焦点的能力,比如是否阻止child View获取焦点。

FOCUS_BEFORE_DESCENDANTS ViewGroup本身先对焦点进行处理,如果没有处理则分发给child View进行处理
FOCUS_AFTER_DESCENDANTS 先分发给Child View进行处理,如果所有的Child View都没有处理,则自己再处理
FOCUS_BLOCK_DESCENDANTS ViewGroup本身进行处理,不管是否处理成功,都不会分发给ChildView进行处理

布局

主页面

android 跳转闹钟 安卓闹钟怎么关震动_android 跳转闹钟_03

此页面为线性布局,所以使用<LinearLayout></LinearLayout>作为根元素。再添加两个<TextView></TextView>和<ImageView></ImageView>,还嵌套了一个水平<LinearLayout></LinearLayout>表示闹钟时间。嵌套的水平LinearLayout中有一个TextView表示时间,一个Switch开关来设置/取消闹钟。

定闹钟页面

android 跳转闹钟 安卓闹钟怎么关震动_android 跳转闹钟_04

此页面为线性布局,所以根元素为<LinearLayout></LinearLayout>,在里层添加一个TimePicker来选择时间,再添加一个Button来提交闹钟。

响铃页面

android 跳转闹钟 安卓闹钟怎么关震动_android_05

此页面较为简单, 线性布局<LinearLayout></LinearLayout>为根元素,在里层添加三个TextView分别表示三个不同的文本。

设置闹钟时间

进入闹钟设置页面

开启app首先进入主页面,点击主页面的时间TextView可进入闹钟设置页面,因此需要给TextView添加点击监听。

首先获得主页面特定的表示时间的TextView

android 跳转闹钟 安卓闹钟怎么关震动_android_06

然后调用setOnClickListener()方法为此TextView添加点击监听。

通过Intent的构造方法创建一个指定目标组件的显示 Intent,指明要启动的Activity为settime(设置时间)Activity。

再调用startActivityForResult()方法来获得闹钟设置Activity关闭并需要返回给主页Activity的数据。

android 跳转闹钟 安卓闹钟怎么关震动_返回结果_07

获取用户设置的时间

TimePicker设置时间改变监听

首先通过控件属性id获取时间设置页面中的TimePicker

android 跳转闹钟 安卓闹钟怎么关震动_点击事件_08

再通过调用setIs24HourView()设置时间是否是24小时制显示

通过调用setDescendantFocusability()传入FOCUS_BLOCK_DESCENDANTS参数,不会分发给ChildView进行处理,禁用键盘输入。

android 跳转闹钟 安卓闹钟怎么关震动_返回结果_09

再给此TimePicker设置时间改变监听,当时间改变时,得到TimePicker上选择的hour和minute并且存入thehour和themin中,方便后续返回给主页面。

android 跳转闹钟 安卓闹钟怎么关震动_数据_10

Button设置点击事件监听

首先通过控件属性id获取时间设置页面中的Button

android 跳转闹钟 安卓闹钟怎么关震动_android 跳转闹钟_11

给按钮增加点击事件监听

重写onClick()来定义点击事件触发后的操作

先调用Intent和Bundle的构造函数创建Intent和Bundle实例,再将想要传给主页面的数据以键值对形式放进Bundle实例中,再调用intent.putExtras(bundle)将想要传递的数据暂存在intent中,当主页面Avtivity启动后,再把这些数据从intent缓存中取出即可。

再调用setResult设置从设置时间子Activity返回到主页面的返回结果类型

最后调用finish()结束设置事件这个Activity的生命周期。由于前文主Activity使用了startActivityForResult(),此方法会开启新的Activity ,子Activity关闭后会向主Activity传回数据,因此可以得到用户设置的时间。

android 跳转闹钟 安卓闹钟怎么关震动_android_12

当点击了返回键,未设置时间则只需将设置闹钟子Activity标识返回给主页面并结束设置闹钟子Activity

android 跳转闹钟 安卓闹钟怎么关震动_android_13