Android应用开发教程03_第1页
Android应用开发教程03_第2页
Android应用开发教程03_第3页
Android应用开发教程03_第4页
Android应用开发教程03_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

应用项目的任务、进程和线程任务,进程,线程应用项目生命周期生命周期,Activity中的生命周期方法应用项目的界面控制概述界面控件描述,控件交互控制目录CONTENTS010203组件间的通信Intent,IntentFilter04Android应用的控制机制第3章用户界面状态保存SharedPreferences,Bundle05应用项目的界面控制概述PART.01界面控制概述在Android中,每一个Activity就是一个单独的屏幕显示。Activity中的内容在屏幕上的显示称作用户界面(UserInterface,UI)。

用户界面UI用户界面中可显示的内容有很多,如文本框、按钮、列表框、图片、进度条等,这些用户界面元素被称为控件。大部分控件是可见的。在Android中,所有的可视控件都继承自View类。控件View界面控制概述

Activity中控件的绘制,既可以使用XML文件描述,也可以通过成员方法在Java代码中动态设置。本着MVC的设计思想,推荐使用XML文件来描述界面的布局。使用XML声明法来描述应用项目的可视控件及其控件属性的信息,此文件称为布局文件。

每一个Activity对应一个布局文件,所有布局文件都存放在应用项目目录下的“res/layout”子目录内。

布局文件

实现Activity类使用Java代码。在代码文件中定义Activity的显示时机,以及显示、退出时Activity状态信息的保存与恢复,用户交互操作时各控件的事件响应等控制逻辑。类实现代码一个Activity可以启动另外一个Activity,实现方法是把请求信息放到一个Intent对象里,并把它传递给startActivity()。Intent任务、进程和线程PART.02任务完成用户的一个目的的所有Activity组成一个任务,Android系统用一个任务栈来记录一个任务。任务是一组以栈的模式将这些Activity组件聚集在一起的集合,这个栈称作任务栈(TaskStack)。任务栈只有在栈顶的Activity,才会有机会与用户进行交互。

新加入的Activity组件,位于栈顶。当栈顶的Activity完成使命时,任务将其退栈,并让下一个Activity跑到栈顶与用户面对面,直至栈中再无Activity,任务结束。工作原理进程进程(process)是低级核心处理过程。当某个组件第一次运行的时候,Android就启动了一个进程。默认情况下,所有的组件和程序运行在这个进程和线程中。

组件运行的进程由Androidmanifest文件控制,组件的元素都包含一个process属性,这个属性就是设置组件运行的进程。进程在Android操作系统中,进程是应用项目的具体实现,它们的主要用途是:改善稳定性、安全性,通过把未信任或者不稳定的代码放入独立的进程的方法中。简化在同一进程中多个.apk文件的运行。有助于系统管理资源,通过把重量级代码放入独立的进程,当进度被杀掉时,与程序的其他部分无关。进程作用前台进程可见进程服务进程后台进程拥有一个正在与用户交互的Activity。拥有一个绑定到正在与用户交互的Activity上的Service。拥有一个前台运行的Service。拥有一个正执行其生命周期回调方法的Service。拥有正在执行其onReceive()方法的BroadcastReceiver。拥有一个不在前台但仍可见的Activity。一个可视的Activity所绑定的Service。有一个由startService()方法启动的Service。支持正在处理的不需要可见界面运行的Service。一个进程拥有一个当前不可见的Activity。目前没有服务的Service。空进程不拥有任何Active组件。空进程是为了提高下一次运行它时的启动速度。进程分类一般不会被杀死极端情况下才被杀死任意时刻可被杀死已被杀死不可被杀死线程每个进程有一到多个线程运行在其中。进程中的所有组件都在UI线程(用户界面线程)中实例化。线程通过Java的标准对象Thread创建。线程不要阻塞UI线程。如果在UI线程中执行阻塞或者耗时操作会导致UI线程无法响应用户请求。不能在非UI线程(也称为工作线程)中更新UI。这是因为Android的UI控件都是线程不安全的。线程编程准则应用项目生命周期PART.0302040103当Activity处于Paused或者Stopped状态,该Activity被系统将从内存中删除时销毁状态Destroyed当Activity失去焦点,但是依然可见时暂停状态Paused在Activity启动之后并获得焦点,与用户进行交互时运行状态Running当Activity被新的Activity完全覆盖,并不可见时停止状态StoppedActivity生命周期状态05当Activity被压入栈顶,显示在屏幕的前台时启动状态StartingActivity生命周期状态启动状态运行状态

暂停状态停止状态销毁状态Activity首次被创建被Dialog或者透明的Activity覆盖被另一个Activity

覆盖,不可见被覆盖的Activity返回被重新激活系统内存不足,被回收系统内存严重不足,被回收发生异常或其他情况Activity新实例启动Activity生命周期回调方法方法说明下一个被调用的方法onCreate()在Activity第一次被创建的时候调用。在此做所有初始化设置,如创建视图、绑定数据至列表等。onStart()onRestart()在Activity停止后,在再次启动之前被调用。onStart()onStart()当Activity变为用户可见之前被调用。onResume()或onStop()onResume()在Activity开始与用户进行交互之前被调用。此时Activity位于堆栈顶部,并接受用户输入。onPause()onPause()当系统将要启动另一个Activity时调用。此方法主要用来将未保存的变化进行持久化,停止动画和其他耗费CPU的动作等。onResume()或onStop()onStop()当Activity不再为用户可见时调用此方法。这可能发生在它被销毁或者另一个Activity(可能是现存的或者是新的)回到运行状态并覆盖了它。onRestart()或onDestroy()onDestroy()在Activity销毁前调用。这是Activity接收的最后一个调用。这可能发生在Activity结束(调用了它的finish()方法)或者因为系统需要空间所以临时销毁了此Acitivity的实例时。—onSaveInstanceState(Bundle),调用该方法让Activity可以保存每个实例的状态。接下来调用onPause()或onStop()。onRestoreInstanceState(Bundle),使用了前一方法保存状态,现在要重新初始化本Activity时调用该方法。接下来调用onResume()。Activity生命周期状态与回调方法ActivitylaunchedActivityrunningActivityshutdownonCreate()AppprocesskilledonStart()onResume()

onRestart()onPause()onStop()onDestroy()用户返回到该Activity用户导航到该Activity用户导航到该Activity另一个Activity被推送到前台该Activity不再可见该Activity已完成或正在被系统销毁优先级更高的App需要内存Activity生命周期回调方法如果有两个Activity分别为ActivityA、ActivityB,依次进行下列操作,Android的生命周期方法调用的情况如下。多个Ativity生命周期方法的调用顺序先启动ActivityA,方法回调的次序是:onCreate(A)→onStart(A)→onResume(A)

ActivityA不关闭,跳转第二个ActivityB,方法回调的次序是:onPause(A)→onCreate(B)→onStart(B)→onResume(B)→onStop(A)

在ActivityB上单击返回键后,回到ActivityA,方法回调的次序是:

onPause(B)→onActivityforResult(A)→onRestart(A)→onStart(A)→onResume(A)→onStop(B)→onDestroy(B)在ActivityA上单击退出键退出应用时,方法回调的次序是:onPause(A)→onStop(A)→onDestroy(A)

组件间的通信PART.04Intent

Intent类都定义在android.content.Intent。一个Intent对象(IntentObjects)其实就是一堆信息的捆绑,Intent对象由组件名称、动作、数据、类别、附加信息及标志6部分组成。组件名称(Componentname):是指要处理该Intent的组件名字。组件名字可选,指定组件名称为显式意图;不指定组件名称为隐式意图。动作(Action):是一个将被执行的动作的字符串命名;或者对于广播意图而言,是发生并被报告的动作。数据(Data):是为动作提供要操作的信息,用指向数据的一个资源标识符(URI)来表示。类别(Category):是关于Intent中action要执行的动作的附加描述,它是一个字符串。附加信息(Extra):是要递交给Intent处理组件的附加信息键-值对。标志(Flag):是各种类型的标志。该标志用来指示Android系统如何去加载一个Activity和启动后如何对待它。Intent对象IntentIntent对象的动作常量,由大写英文单词和下划线组成常量目标组件含义ACTION_CALLActivity拨打电话,被呼叫的联系人在数据中指定ACTION_EDITActivity显示数据给用户进行编辑ACTION_GET_CONTENTActivity让用户选择数据并返回ACTION_INSERTActivity在容器中插入一个空项ACTION_MAINActivity启动一个任务的起始Activity,没有数据输入和数据返回ACTION_PICKActivity从数据中选择一个子项目,并返回所选中的项目ACTION_BATTERY_LOWBroadcastReceiver提示电池电量低ACTION_SCREEN_ONBroadcastReceiver屏幕已开启ACTION_HEADSET_PLUGBroadcastReceiver耳机插拔ACTION_TIMEZONE_CHANGEDBroadcastReceiver时区变化Intent数据的一个资源标识符(URI)来表示。URI的格式为“scheme://host:port/path”。不同的动作伴随着不同种类的数据规格,这个数据类型可以从URI里推断出来。Intent数据与动作相关如果动作是ACTION_EDIT,数据字段会包含可编辑文档的URI。如果动作是ACTION_CALL,数据字段会是一个含呼叫电话号码的URI。获取一个URI的语句格式为:Uriuri=Uri.parse(<字符串>);例如,在Java代码中,获取指向1号联系人的URI,语句为:

Uriuri1=Uri.parse("content://contacts/1");IntentIntent对象的类别定义了若干类别常量常量含义CATEGORY_ALTERNATIVE在某种数据类型的项目上可以替代默认执行的动作。例如,一个联系人的默认动作是浏览它,替代的可能是去编辑或删除它CATEGORY_BROWSABLE目标Activity可以被浏览器安全地唤起来显示被一个链接所引用的数据。例如,一张图片或一条E-mail消息CATEGORY_DEFAULT设置这个类别来让组件成为Intent过滤器中定义的data的默认动作。这对使用显式Intent启动的Activity来说也是必要的CATEGORY_HOME这个Activity将显示桌面,也就是用户开机后看到的第一个屏幕或者按HOME键时看到的屏幕CATEGORY_LAUNCHER这个Activity可以是一个任务的初始Activity,并被列在应用项目启动器的顶层CATEGORY_PREFERENCE目标Activity是一个选择面板Intent创建一个Intent对象的语句格式为:Intentintent=newIntent(<动作>,<内容>);Intent对象创建方法设置Intent对象的动作:通过setAction()方法。指定Intent对象的数据:通过setData()方法指定一个URI数据;通过setType()方法指定MIME;通过setDataAndType()方法可同时指定URI和MIME数据。添加Intent对象的类别:通过addCategory()方法。添加Intent对象的附加数据:通过putExtras()和getExtras()方法来插入和读取附加数据。IntentFilter过滤器描述组件的一个能力,它通知系统哪些组件可以处理哪些Intent。一系列组件想要接收的Intent,实际上按照一个期望的类型来进行Intent滤入,同时滤出不想要的Intent。注意:IntentFilter只针对隐式意图起作用。IntentFilter在Android系统中,可以用Java代码来设置IntentFilter类的一个实例,但是在更多情况下,是在AndroidManifest.xml清单文件中设置<intent-filter>元素。IntentFilter创建方法Intent解析一个组件没有任何的意图过滤器,那它只能接收显式意图。一个带过滤器的组件可以同时接收显式和隐式意图。当一个Intent对象被一个意图过滤器测试时,一般是通过对动作、数据(URI和MIME)和类别三个方面进行监测的。通过比较Intent对象的内容和意图过滤器,找到相匹配的目标组件。组件与IntentFilterIntent解析一个Intent只能设置一种Action;一个IntentFilter却可以设置多个Action过滤。当IntentFilter设置了多个Action过滤时,只需一个满足即可完成Action验证。检查Action包括:对数据的URI进行监测;对数据的类型进行监测。只有这些信息完全匹配时,Data的验证才会成功。检查Data在IntentFilter中同样可以设置多个Category。当Intent中的Category与IntentFilter中的一个Category完全匹配时,此Category验证通过。检查Category一个隐式意图为了递交到拥有这个过滤器的组件,它必须全部通过以下三项测试。如果即使只有一个不通过,Android系统都不会把它递交给这个组件。Intent应用案例在两个Activity组件中都使用按钮控件,在布局文件中,需要声明按钮控件。如果仅从ActivityA跳转到ActivityB,使用startActivity()方法;如果ActivityA跳转到ActivityB,然后从ActivityB返回到ActivityA,且需要传递数据时,则使用startActivityForResult()方法。两个Activity相互调用,在创建Intent对象时最好用显式的。在ActivityA中,使用startActivityForResult()方法发送Intent给ActivityB,重写onActivityResult()方法用于处理返回的数据;在ActivityB中,使用setResut()方法准备好回传数据,使用finish()的方法来将打包好的数据回传给ActivityA;返回到ActivityA后系统会自动执行A中的onActivityResult()方法。设计思路【案例3.1】设计两个Activity:MainActivity和SubActivity。MainActivity为首次进行的Activity,其中有个按钮,单击该按钮可跳转到SubActivity上,并且在标题栏显示跳转信息;SubActivity上也有一个按钮,单击该按钮可以返回到MainActivity上,且在标题栏显示跳转返回信息。如此循环往复。Intent应用案例运行结果在AndroidStudio的模拟器上运行。首次运行项目,标题栏会显示“首次进入主页面!”的内容,如图(a)所示。在主Activity中,单击“跳转到下一页”,进入子Activity,如图(b)所示。在子Activity中单击“返回到首页”,返回主Activity,注意此时的标题栏内容携带了子Activity的信息,如图(c)所示。(a)首次进入主Activity界面(b)单击按钮后进入子Activity(c)单击按钮后返回主Activity用户界面状态保存PART.05SharedPreferencesSharedPreferences是Android平台上一个轻量级的存储类。以一个键-值对的二元组的形式存储。通常用来存储简单的配置信息,支持String、Long、Float、Integer、Boolean等数据类型。SharedPreferences对象的访问权限是私有的。保存在一个内部的XML文件中。是一种简单、持久化的存储设置。BundleBundle类用作携带数据,它类似于Map,用于存放键-值对形式的值。可传递基本数据类型,比如int、float、string等。利用Bundle绑定数据的封装能力,将要数据或参数通过Intent对象来传递到不同的Activity。Bundle对象中的数据是保存在应用项目的上下文中,会随着相应的上下文销毁而消失。用户界面状态保存

Android使用SharedPreferences对象或Bundle对象来保存Activity实例的状态信息。BundleBundle对象常用的方法方法返回值说明clear()—清除所有保存的数据clone()Bundle对象克隆当前Bundle对象get(Stri

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论