实现登录功能
任务目标:
1.掌握Activity的创建
2.掌握Activity的启动和声明
3.掌握为按钮控件添加监听事件
任务陈述:
本任务使用单元2的任务7中的设计界面作为跳转后的界面。当用户在智慧城市登录界面点击登录时,页面跳转到智慧城市的主界面。本任务主要是完成Android中两个页面之间的跳转功能。
任务学习:
1.Activity简介:
Activity是Android组件中最基本也是最为常见用的四大组件(Activity,Service服务,Content Provider内容提供者,BroadcastReceiver广播接收器)之一[1] 。Activity是一个应用程序组件,提供一个屏幕,用户可以用来交互为了完成某项任务。Activity中所有操作都与用户密切相关,是一个负责与用户交互的组件,可以通过setContentView(View)来显示指定控件。在一个android应用中,一个Activity通常就是一个单独的屏幕,它上面可以显示一些控件也可以监听并处理用户的事件做出响应。Activity之间通过Intent进行通信。
2.Activity的创建:
如何创建一个Activity:必须创建一个Activity的 子类,在子类中需要实现Activity状态在生命周期中切换时系统回调的函数(onCreate、onStart、onResume、onPause、onStop、onDestroy),当然并非所有的函数都需要重新实现。其中两个比较重要的函数为onCreate和onPause:
onCreate(),此方法必须要重写。系统调用此方法创建activity,实现该方法是你初始化你所创建Activity的重要步骤。其中最重要的就是调用 setContentView() 去定义你的要展现的用户界面的布局。
onPause(),当系统任务用户离开此界面时会调用此方法,此时并非销毁一个Activity。通常在这里就要处理一些持久超越用户会话的变化,比如:数据的保存。
为了保证流畅的用户体验和处理,你可以调用其他的回调函数来使你的Atctivity停止或销毁。在onStop()方法中,一般做一些大资源货对象的释放,如:网络或者数据库连接。可以在onResume时再加载所需要资源。
一个Activity创建完成后,为了它可以访问系统必须要声明注册它到应用的AndroidManifest.xml文件中:
3.Activity的跳转:
通过调用startActivity(intent)启动Activity,intent用来准确的描述你要启动的Activity。
4.基于监听事件的处理机制:
android对监听事件的处理可以分为4种:
第一种:内部类作为事件监听器类
内部类有两种:分别为匿名内部类和不匿名内部类,其中大部分事件监听类都是使用匿名内部类。
其中的好处有:
1.可以在当前类中复用该监听器类
2.可以自由访问外部类的所有界面组件
第二种:外部类作为事件监听器类
比较少见,其中优点为:
1.当某个事件监听器被多个GUI界面共享,且主要是完成某种业务逻辑的实现
其中确定为:
1.不利于提高程序的内聚性
2.不能自由访问创建GUI界面类的组件,编程不够简洁
第三种:Activity本身作为事件监听器
可以直接在Activity中定义事件处理方法
其中优点为:非常简洁
缺点为:
1.这种形式可能造成程序结构混乱。Activity的主要职责应该是完成界面初始化;但此时还需包含事件处理器方法,从而引起混乱
2.如果activity界面类需要实现监听器接口,让人感觉比较怪异。
第四种:直接绑定到标签
在布局中要发送事件源中定义一个:
android:onClick="clickHandler"
然后在该布局对应的Activity定义一个 void clickHandler(void source)方法。
1.复习并通过单元2所学习的知识在res/layout文件夹中新建activity_login.xml文件,完成登录界面和主界面的设计,如图3-1和图3-2所示。
2.在src文件中新建LoginActivity类,并重写Oncreat()方法。
3.声明一个按钮控件并通过通过findViewById找到布局中的界面再强制传唤成Button类型赋值给mBtnLogin绑定控件设置按钮的单击事件。
4.在AndroidManifest.xml中定义声明Activity。
通过代码可以理解Acitvity的跳转与为按钮添加监听事件的过程,充分理解了一个带界面的android应用程序可以由一个或者多个Activity组成,至于这些Activity是如何工作的或者他们之间有什么依赖关系,则完成取决于应用程序的业务逻辑。每个Activity都会有一个窗口,在默认情况下,这个窗口是充满整个屏幕的,也可以将窗口变得比手机屏幕小,或者悬浮在其他窗口上面。
主页面的生命周期
任务目标:
1.掌握Activity的生命周期
任务陈述:
本任务使用单元2的任务7中的界面设计,用日志输出的方式,展现Activity各个生命周期。
Activity的生命周期:
在Acivity从创建到销毁的过程中需要在不同的阶段调用7个生命周 期的方法。这7个生命周期方法定义如下:
Protected void onCreat(Bundle savedInstancedState)
1.启动Activity:系统会先调用onCreate方法,然后调用onStart方法,最后调用onResume,Activity进入运行状态。
Protected void onStart()
2.当前Activity被其他Activity覆盖其上或被锁屏:系统会调用onPause方法,暂停当前Activity的执行。
Protected void onResume()
3.当前Activity由被覆盖状态回到前台或解锁屏:系统会调用onResume方法,再次进入运行状态。
Protected void onPause()
4.当前Activity转到新的Activity界面或按Home键回到主屏,自身退居后台:系统会先调用onPause方法,然后调用onStop方法,进入停滞状态。
Protected void onStop()
5.用户后退回到此Activity:系统会先调用onRestart方法,然后调用onStart方法,最后调用onResume方法,再次进入运行状态。
Protected void onRestart()
6.当前Activity处于被覆盖状态或者后台不可见状态,即第2步和第4步,系统内存不足,杀死当前Activity,而后用户退回当前Activity:再次调用onCreate方法、onStart方法、onResume方法,进入运行状态。
Protected void onDestroy()
7.用户退出当前Activity:系统先调用onPause方法,然后调用onStop方法,最后调用onDestory方法,结束当前Activity。
上面的7个生命周期方法分别在4个阶段按一定得顺序进行调用,这4个阶段如下:
1.开始Activity:在这个阶依次执行3个生命周期方法,分别是onCreat、onStart和onResume。
2.Activity失去焦点:如果在Activity获得焦点的情况下进入其他的Activity或应用程序,当前的Activity会失去焦点。在这一阶段会依次执行onPause和onStop方法。
3.Activity重新获得焦点:如果Activity重新获得焦点,会依次执行3个生命周期方法,分别是onRestart、onStart和onResume。
4.关闭Activity:当Activity被关闭时系统会依次执行3个生命周期方法,分别是onPause、onStop、onDestory。
如果在这4个阶段执行生命周期方法的过程中不发生状态的改变,系统会按上面的描述依次执行这个4个阶段中的生命周期方法,但如果在执行过程中改变了状态,系统会按更复杂的方式调用生命周期的方法。
在执行的过程中可以改变系统的执行轨迹的生命周期的方法是onPause和onStop。如果在执行onPause方法的过程中Activity重新获得了焦点,然后又失去了焦点,系统将不会再执行onStop方法,而是按照如下顺序执行相应的生命周期方法:
onPause -> onResume -> onPause
如果在执行onStop方法的过程中Activity重新获得了焦点,然后又失去焦点,系统将不会执行onDestroy方法,而是按如下顺序执行相应的生命周期方法:
onStop -> onRestart -> onStart -> onResume -> onPause -> onStop
下图描述了Activity从创建到销毁以及中间状态的改变后调用生命周期方法的过程
-
新建项目工程引用单元2任务7的界面文件实现界面设计,如下图所示。
- 修改ActivityDemo7.java重写以上的七种方法,主要用Log打印代码。
-
运行上述工程,效果图如下图所示(没什么特别的)。
在Window->Show View会出来一个对话框,如图3-6,当我们点击Ok按钮时,会在控制台窗口出现LogCat视窗如图3-7所示:
当我们打开应用时先后执行了onCreate()->onStart()->onResume三个方法,看一下LogCat视窗如下所示:
当我们按BACK键时,我们这个应用程序将结束,这时候我们将先后调用onPause()->onStop()->onDestory()三个方法,如下所示:
当我们打开应用程序时,比如浏览器,我正在浏览NBA新闻,看到一半时,我突然想听歌,这时候我们会选择按HOME键,然后去打开音乐应用程序,而当我们按HOME的时候,Activity先后执行了onPause()->onStop()这两个方法,这时候应用程序并没有销毁。如下所示:
而当我们再次启动ActivityDemo7应用程序时,则先后分别执行了onRestart()->onStart()->onResume()三个方法,如下所示:
调用系统功能
任务目标:
1.掌握Android系统的信使:intent
2.掌握Activity的隐式启动
任务陈述:
当用户点击拍码购物的按钮后系统调用照相机功能进行二维码扫描。
Intent的中文意思是“意图,意向”,在Android中提供了Intent机制来协助应用间的交互与通讯,Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用。Intent不仅可用于应用程序之间,也可用于应用程序内部的Activity/Service之间的交互。因此,可以将Intent理解为不同组件之间通信的“媒介”专门提供组件互相调用的相关信息。
Intent有以下几个属性:
动作(Action),数据(Data),分类(Category),类型(Type),组件(Compent)以及扩展信(Extra)。其中Intent中的四个重要属性——Action、Data、Category、Extras
1.Intent的Action属性
Action是指Intent要完成的动作,是一个字符串常量。Intent也内含了很多默认的action。
2.Intent的Data属性
Intent的Data属性是执行动作的URI和MIME类型,不同的Action有不同的Data数据指定。比如:ACTION_EDIT Action应该和要编辑的文档URI Data匹配,ACTION_VIEW应用应该和要显示的URI匹配。
3.Intent的Category属性
Intent中的Category属性是一个执行动作Action的附加信息。比如:CATEGORY_HOME则表示放回到Home界面,ALTERNATIVE_CATEGORY表示当前的Intent是一系列的可选动作中的一个。 -
Extras属性主要用于传递目标组件所需要的额外的数据。通过putExtras()方法设置。常用值如下所示:
任务实现:
1.在Elipse下新建命为AndroidDome3_2的Android项目。
2.修改res/layout文件夹下的activity_main.xml文件,进行如下图界面设置。
3.声明Button控件,和拍照标识。
4.修改src目录下的MainActivity.java文件,并自定义一个initView()方法实现控件的初始化,同时为按钮添加监听事件。
5.实现调用系统自身照相机功能。