版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Android平板应用开发教程轻松自信地设计和交付精美的平板App。课程概述培养基于Android平台的平板应用开发与设计能力,培养具有开发优质用户体验和高可靠性的平板App。教学内容Android开发基础View与WidgetsAndroid四大组件平板UI设计模式使用Fragment设计UI平板特色控件设计平板桌面开发使用HTML5开发平板应用课程核心培养目标教学目标
1、熟练使用Android基本开发工具与研发环境的能力。2、熟练使用AndroidActivity、View、ViewGroup等视图组件,能够通过实践项目理解如何构建优秀用户体验的人机对话界面。3、熟练使用Android布局套件,能够通过实践项目了解Fragment在项目中不同的运用场景。4、深入理解Android视图组件的构建规则、能够合理修改Android视图的各个部件,形成合理的自定义视图,满足复杂的工程级平板人机对话要求。Android开发基础1Eclipse中的Android开发创建项目①启动Eclipse集成开发环境。②运行File→New→AndroidApplicationProject菜单命令,打开NewProject向导。③单击Next按钮,缺省ConfigureProject设置和Configuretheattributeoftheiconset界面设置,选择BlankActivity,单击Finish按钮,完成项目的创建。Eclipse中的Android开发创建SDCard①在Windows中,运行“开始”→“运行”菜单命令,在打开的“运行”窗口中输入“cmd”并单击“确定”按钮,打开命令行窗口。②在窗口中输入如下命令:mksdcard-lmycard500MF:\\mysdcard.imgEclipse中的Android开发创建AVD①在Eclipse中,运行Window→AndroidVirtualDeviceManager菜单命令,打开AndroidVirtualDeviceManager对话框。Eclipse中的Android开发运行项目①在Eclipse的项目窗口中,右击项目节点名称HelloWorld,运行Runas→RunConfigurations菜单命令,打开RunConfigurations对话框。②在对话框的左侧选择AndroidApplication,并单击上方的Newlaunchconfiguration按钮,在右侧的Android标签页中单击Browse按钮,打开ProjectSelection对话框,选择项目。③在对话框的Target标签页中的AVD列表中勾选合适的Android模拟器。单击Apply和Run按钮,运行程序。Android项目架构SRCMainActivity是一个用户定义的Activity,继承自android.app.Activity类。Activity是应用程序的表示层,用于构建应用程序的UI界面。onCreate(Bundle)方法是Activity生命周期的组成部分,用于初始化Activity.调用setContentView()方法来指定显示布局,然后通过findViewById(int)方法在布局中检索需要交互的UI控件。Bundle类用于Activity之间传递数据。Android项目架构RESdrawabledrawable用于存放图片文件资源,或者能被编译为drawable类型的XML文件。包括drawable-hdpi、drawable-mdpi、drawable-ldpi和drawable-xhdpi等多个存放图片的文件夹。对drawable中的图片资源的引用主要有3种形式:①②在Java代码中引用的方法是R.drawable.image_name。③在Java代码中也可以通过getResources().getDrawable(R.drawable.image_name)方法返回R.drawable.image_name所代表的Drawable对象,或通过getResources().openRawResource(R.drawable.image_name)方法获取Drawable的输入流。Android项目架构RESlayoutlayout中存放用于编译成屏幕布局的XML文件。这些文件可以使用可视化编辑器生成,也可以通过编写XML生成。对layout中的布局资源的引用主要有2种形式:①在Java代码中引用的方法是R.layout.。②Android项目架构RESvaluesstrings.xml用于定义字符串和数值。array.xml用于定义数组信息。colors.xml用于定义颜色。dimens.xml用于定义尺寸数据。styles.xml用于定义样式。Android项目架构AndroidManifest.xmlAndroidManifest.xml是一个用来描述Android应用程序整体信息的结构化的XML配置文件。该文件描述了应用程序的环境及其支持的Activity、Service、Intent接收器和ContentProvider提供程序以及权限、外部库和设备特性等信息。在Android启动一个组件之前,它必须能够了解到这个组件的存在。因此,应用程序将它们的组件定义在Android包中的AndroidManifest.xml文件中。在所有的应用程序中都以AndroidManifest.xml命名,并保存在项目的根目录下。Eclipse常用窗口开启窗口①执行Window→ShowView→others菜单命令,在打开的ShowView对话框中,展开Android节点。②执行Window→OpenPerspective→others菜单命令,打开OpenPerspective对话框。Eclipse常用窗口Console窗口Console窗口输出一些程序运行过程中的相关信息。Eclipse常用窗口LogCat窗口LogCat有5种信息:①Log.v():Log.v的输出颜色是黑色。②Log.d():Log.d的输出颜色是蓝色。③Log.i():Log.i的输出颜色是绿色。④Log.w():Log.w的输出颜色是橙色。⑤Log.e():Log.e的输出颜色是红色。Eclipse常用窗口DDMS
窗口DDMS提供了设备截屏、针对特定的进程查看正在运行的线程以及堆信息、模拟电话呼叫以及虚拟地理坐标等服务。View与Widgets2图形布局编辑器ADTADT(AndroidDevelopmentTools,是一款用于开发Android应用程序的Eclipse插件)为AndroidUI提供了一种图形布局编辑器,当打开layout下的xml布局文件时,系统自动打开这个UI设计工具。图形布局编辑器Palette窗口Palette窗口提供了构建AndroidUI的基本控件,可以直接拖动Palette窗口中的控件到上图中部的布局容器中。图形布局编辑器Configuration面板Configuration面板可以根据项目的不同应用环境设置不同的参数。图形布局编辑器布局容器窗口布局容器窗口就是中部的图形化编辑区域,该区域展示了在当前硬件环境配置下的显示效果。可以直接从Palette窗口拖动控件到布局容器窗口中。图形布局编辑器Outline窗口Outline窗口包括两个部分:上方的窗口显示了当前布局的层次结构,也可以直接从Palette窗口拖动控件到Outline窗口中。下方的窗口是当前选中的控件的属性设置窗口,在属性设置窗口中,可以设置控件的布局参数、显示样式等信息。常见布局方式创建布局①在Android项目的res/layout节点上右单击,执行New→AndroidXMLFile命令,打开NewAndroidXMLFile对话框。②在File框中输入布局文件名,在RootElement列表中选择布局的根节点,单击Next按钮,打开ChooseConfigurationFolder对话框。常见布局方式相对布局相对布局(RelativeLayout)方式是将ViewGroup以相对位置显示它的子视图元素,一个视图可以指定相对于它的兄弟视图的位置(例如在给定视图的左边或者下面)或相对于RelativeLayout的特定区域的位置(例如底部对齐或中间偏左)。常见布局方式线性布局线性布局(LinearLayout)方式是将ViewGroup以线性方向显示它的子视图元素,即后一个元素垂直或水平显示在上一个子元素之后。常见布局方式帧布局帧布局(FrameLayout)方式是将ViewGroup中的视图自动的按照层次堆放在左上角,后加进来的控件覆盖前面的控件。定义任何空间的位置相关的属性都毫无意义。优化布局复用布局两种复用布局方式:通过<include>标签来嵌入布局通过Fragment来复用布局。优化布局多设备支持创建不同的Layout布局文件MyProject/res/layout/main.xmllayout-large/main.xml优化布局多设备支持创建横竖屏Layout布局文件MyProject/res/layout/main.xmllayout-land/main.xml优化布局调试用户界面HierachyViewer的主要功能有:从可视化的角度直观地获得UI布局设计结构和各种属性的信息,帮助开发者优化布局设计;结合调试帮助观察特定的UI对象进行invalidate和requestLayout操作的过程。表单控件文本控件TextViewandroid.widget.TextView是android.view.View类的直接子类,TextView自身的直接子类包括Button、EditText等,间接子类包括AutoCompleteTextView、CheckBox、RadioButton等。表单控件文本控件EditTextEditText是一个用于文本输入的控件,是TextView的直接子类。EditText常见使用inputType属性为文本框指定输入类型,使用hint属性为文本框指定输入提示信息。表单控件按钮控件ButtonButton是一个按钮控件,用来响应用户的单击事件。对每个Button实例设置setOnClickListener()方法,然后使当前Activity实现OnClickListener接口,然后重载接口方法onClick()来处理按钮的响应事件。表单控件选择控件RadioGroup与RadioButtonRadioButton是一种双状态的按钮,或处于选中状态,或处于未选中状态。表单控件选择控件CheckBoxCheckBox是一种有双状态按钮的特殊类型,可以选中或者不选中。其使用方式与RadioButton类似,主要区别是可以在一组CheckBox中有多个被选中。表单控件进度条
控件ProgressBarProgressBar一般用在某项延续性工作的进展过程中,为了不让用户觉得程序无响应,需要有个活动的进度条,表示此过程正在进行中。或者是在某些操作的进度中的可视指示器,为用户呈现操作的进度。ProgressBar有一个次要的进度条,用来显示中间进度,如流媒体播放的缓冲区的进度。一个进度条也可不确定其进度。在不确定模式下,进度条显示循环动画。这种模式常用于应用程序使用任务的长度是未知的情况下。适配器控件适配器适配器(Adapter)是Android中数据和适配器控件之间的桥接,负责将每个数据项显示在子View上。Android系统提供了如下几种适配器:ArrayAdapter<T>、BaseAdapter、CursorAdapter、HeaderViewListAdapter、ListAdapter、ResourceCursorAdapter、SimpleAdapter、SimpleCursorAdapter、SpinnerAdapter、WrapperListAdapter,比较常用的有BaseAdapter,ArrayAdapter,SimpleCursorAdapter等。适配器控件BaseAdapter使用BaseAdapter一般遵循以下步骤:①定义AdapterView子Item的布局。②获取数据集合。③实现BaseAdapter实例,主要是实现一个构造方法(主要用于获取数据集合),并重载BaseAdapter的4个方法。应用适配器的一般格式:AdapterView.setAdapter(myBaseAdapter)适配器控件GalleryGallery是一个锁定中心条目并且拥有水平滚动列表的视图,一般用于一组相同尺寸图片的显示。适配器控件SpinnerSpinner是下拉列表框控件。Spinner的使用一般遵循以下过程:①生成一个ArrayAdapter,用于Spinner下拉列表的内容。②通过adapter.setDropDownViewResource()方法设置下拉列表样式。③使用Spinner.setAdapter(adapter)方法将数据源绑定。④使用Spinner.setOnItemSelectedListener()方法响应下拉列表的选择。适配器控件ListViewListView是用于显示一组列表项的列表视图。ListActivity是Activity的子类,用于显示一个绑定到数组或游标等数据源的列表,并且为列表的每一项提供一个单击事件的管理方法,当用户单击其中的列表项时就能进行相应的处理。适配器控件GridViewGridView是一种在平面上可显示多个条目的可滚动的栅格视图控件,该控件中的条目通过一个Adapter和该控件进行关联。Widgets事件处理按键事件处理物理键盘监听对物理键盘使用onKeyDown(intkeyCode,KeyEventevent)、onKeyUp(intkeyCode,KeyEventevent)方法来监听按键的按下和释放事件。Widgets事件处理按键事件处理软键盘监听使用dispatchKeyEvent(KeyEventKEvent)方法对软键盘的按键进行监听。Widgets事件处理触屏事件处理触屏事件通过onTouchEvent(MotionEventevent)方法进行监听。多点触屏也是使用onTouchEvent(MotionEventevent)方法进行监听,在监听时,通过Event的getPointerCount()获取触屏点个数,然后进行多点触屏事件处理。Widgets事件处理手势事件处理Android系统提供了GestureDetector类,将基本的触屏事件转变成各种不同的手势动作。通过实现GestureDetector.OnGestureListener接口来构造一个GestureDetector的一个实例。如果仅仅只是想处理少部分的手势动作,可以选择继承GestureDetector.SimpleOnGestureListener而不用去实现GestureDetector.OnGestureListener接口。Widgets事件处理感应事件处理传感器是通过监听机制来实现的,一般步骤如下:①创建SensorManager对象。②实现SensorListener接口。③注册SensorListener。对话框ToastToast是一个简单的弹出式信息,最适合于确定用户正在关注屏幕时显示简短信息。对话框NotificationNotification显示一些简要的信息,用户在任何时候都可以从状态栏访问它们。它提供升级、提醒以及一些重要但不至于直接打断用户的信息。将状态栏滑下可以打开通知抽屉。单击消息将会打开相关的应用。对话框Alert
DialogAlertDialog.Builder中的重要方法:
setTitle():为对话框设置标题。
setIcon():为对话框设置图标。
setMessage:为对话框设置内容。
setView():给对话框设置自定义样式。
setItems():设置对话框要显示的一个列表,一般用于显示几个命令时使用。
setPositiveButton():给对话框添加"Yes"按钮。setNegativeButton():对话框添加"No"按钮。
create():创建对话框。
show():显示对话框。菜单OptionsMenuOptionsMenu是作用于当前Activity全局的一种菜单,其中的菜单项命令对当前Activity的进程都有效。在大部分的手机上,用户按下"MENU"键就会在屏幕下方显示OptionsMenu。用户再次按下"MENU"键或"返回"键就会关闭OptionsMenu。菜单OptionsMenu创建OptionsMenu的三个回调方法:onCreateOptionsMenu(Menu)onOptionsItemSelected(MenuItem)onPrepareOptionsMenu(Menu)菜单ContextMenuContextMenu是当用户长按一个注册了ContextMenu的View时出现的浮动菜单项目列表。ContextMenu类似于桌面操作系统的右键菜单,对于不同的对象给出不同的菜单命令。菜单ContextMenu创建ContextMenu的三个回调方法:onCreateContextMenu(ContextMenumenu,Viewv,ContextMenuInfomenuInfo)onContextItemSelected()registerForContextMenu(Viewview)动作栏动作栏设计创建菜单资源时,如果为某一菜单项添加android:showAsAction=“ifRoom”声明,则该菜单项将作为动作栏子项来显示。动作栏ActionModeActionMode是一个显示在屏幕顶部的操作栏,允许用户选择多个选项,ActionMode在AndroidAPI11之后才有支持。当用户激活ActionMode后,一个上下文操作栏会出现在屏幕的顶端,呈现出用户可以对当前选中项目进行的操作选项。Android四大组件3Activity创建Activity①在Eclipse中,选择项目src下的包节点。②单击工具栏上的新建按钮,在打开的新建对话框中选择Android→AndroidActivity,单击下一步。③选择BlankActivity,单击下一步,打开NewActivity对话框,并输入Activity的相关信息。ActivityActivity生命周期ActivityActivity状态迁移
Resumed状态处于Resumed状态(有时也简称为运行状态)的Activity处于栈顶,且是可见的,有焦点的,能够与用户互动。当另一个Activity进入栈顶时,当前的Activity将进入Paused状态。
Paused状态另一个Activity在屏幕前,取得焦点,但原来的Activity仍然可见。暂停的Activity完全是存在的(Activity对象保留在内存中,它维护所有状态和成员信息,并保持窗口管理器的联系),但在极低的内存的情况下,可以被系统终止。
Stoped状态Activity完全被另一个Activity遮住了(现在Activity是在后台)。此时,Activity也仍然存在。然而,它已不再是对用户可见。在极低的内存的情况下,可以被系统终止。Activity显式调用Activity隐式调用ActivityActivity的回调startActivityForResult(Intentintent,intrequestCode)onActivityResult(intrequestCode,intresultCode,Intentdata)setResult(intresultCode,Intentdata)Activity使用Intent
传递数据Intent提供了各种常用类型重载后的putExtra()方法,如:putExtra(Stringname,Stringvalue)、putExtra(Stringname,longvalue)。在putExtra()方法内部会判断当前Intent对象内部是否已经存在一个Bundle对象,如果不存在就会新建Bundle对象,以后调用putExtra()方法传入的值都会存放于该Bundle对象。Activity使用Bundle
传递数据Bundle类是一个封装了Map<String,Object>的键值对,可以从String类型的键中获得任意类型的对象。使用Bundle传递数据一般遵循如下步骤:在传送数据的Activity中:①新建一个Bundle类;②通过Bundle.putString(key,value)等方法将数据存入Bundle;③通过Intent.putExtras(Bundle)方法将数据附加到Intent对象上。Activity使用Bundle
传递数据Bundle类是一个封装了Map<String,Object>的键值对,可以从String类型的键中获得任意类型的对象。使用Bundle传递数据一般遵循如下步骤:在接收数据的Activity中:①新建一个Bundle类;②通过Intent.getExtras()方法从Intent对象获取封装了的数据包;③通过Bundle.getString(key)等方法从键中获取数据。Activity使用Application
传递数据使用ApplicationContext。一般步骤如下:①新建一个类,继承自Application。②在AndroidManifest.xml的application标签中。③MyAppappState=((MyApp)getApplicationContext());ActivityActivity栈一个设备的主屏幕是大多数任务栈的起点。当用户触屏图标(或者在屏幕上的快捷方式)时,该应用程序就会到达任务栈的最前面。如果该应用在任务栈中不存在,就会在任务栈中创建一个新的任务,并将该应用作为“主”Activity放置在根任务栈中。堆栈的特性是后进先出,两个主要操作是压栈和出栈。每当用户切换到一个新的Activity时,Android会将其压入到StackBack,使其成为栈顶,也就是用户当前看到的Activity;栈顶后面的Activity此时呈Stop状态,对应着Activity生命周期方法中的onStop(),并且Android还会保留其状态。这就是压栈操作。当用户按下返回键,Android就会将栈顶部的Activity弹出来,紧随其后的Activity顶上去,就实现了回退的功能。被弹出的Activity此时呈Destroy状态,对应着onDestroy(),新栈顶Activity呈Resume状态,对应着onResume()。这就是出栈操作。Activity任务管理用户为了完成某个功能而执行的一系列操作形成了一个Activity序列,这个序列在Android中称之为任务,它是从用户体验的角度出发,把一组相关的Activity(这些Activity可以来自不同的应用程序)组织在一起而抽象出来的概念。因此,任务包含一个按照用户交互顺序排序的Activity集合,任务可以把每个Activity按照用户执行顺序放到后台并且保持状态而且不丢失工作。当一个Activity启动时,如果任务也随之启动的话,那么这个Activity就是根Activity。Android系统内部一旦有任务,那么按返回键就可以回到上一个Activity。Activity栈可以是多个任务的组成部分。ActivityActivity加载模式standardsingleTopsingleTasksingleInstanceActivityActivity状态protectedvoidonSaveInstanceState(BundleoutState)72Service处于android.app包中;Service是Android最基本的应用程序组件;运行在后台、不可见但可交互的一种服务组件。概述73Service3个阶段创建服务阶段开始服务阶段销毁服务阶段生命
周期74ServiceContext.startService()Service会一直运行,直到通过Context.stopService()或者stopSelf()停止它生命周期为:onCreate-->onStart(可多次调用)-->onDestroy多次通过startService()启动某个服务并不会生成多个实例,但会导致服务的onStart()被多次调用注意,onCreate()只在Service第一次启动时被调用。启动
方式75ServiceContext.bindService()获得一个服务的链接,这个链接一直保持到通过Context.unbindService()断掉它生命周期为:onCreate-->onBind-->Servicerunning-->onUnbind-->onDestroy通过bindService()方法启动的Service会一直存在到没有任何客户端与它保持连接为止注意,使用startService()方法启用服务,调用者与服务之间没有关连,即使调用者退出了,服务仍然运行。使用bindService()方法启用服务,调用者与服务绑定在了一起,调用者一旦退出,服务也就终止。启动
方式76ServiceAIDLAndroidInterfaceDefinitionLanguageandroid接口描述语言是一个IDL语言可以使在一个android设备上运行的两个进程使用内部通信进程进行交互远程
调用77Service远程服务设计步骤1、创建AIDL文件,
在这个文件里面定义接口,
该接口定义了可供客户端访问的方法和属性;2、编译AIDL文件,
Eclipse会根据adil文件自动生成java文件并编译;3、编译器根据AIDL接口,
产生一个java接口,这个接口有一个名为Stub的内部抽象类,它继承扩展了接口并实现了远程调用需要的几个方法;4、向客户端提供接口ITaskBinder;5、在服务器端回调客户端的函数。远程
调用78Service实现接口的几个原则抛出的异常不要返回给调用者;跨进程抛异常处理是不可取的;IPC调用是同步的;不能在AIDL接口中声明静态属性。远程
调用79ServiceIPC的调用步骤1.声明一个接口类型的变量,该接口类型在.aidl文件中定义;2.实现ServiceConnection;3.调用ApplicationContext.bindService(),并在ServiceConnection实现中进行传递;
4.在ServiceConnection.onServiceConnected()实现中,会接收一个IBinder实例(被调用的Service),调用YourInterfaceName.Stub.asInterface((IBinder)service)将参数转换为YourInterface类型;5.调用接口中定义的方法。总要检测到DeadObjectException异常,该异常在连接断开时被抛出。它只会被远程方法抛出;6.断开连接,调用接口实例中的ApplicationContext.unbindService()。远程
调用80ServiceIPC的调用步骤1.声明一个接口类型的变量,该接口类型在.aidl文件中定义;2.实现ServiceConnection;3.调用ApplicationContext.bindService(),并在ServiceConnection实现中进行传递;
4.在ServiceConnection.onServiceConnected()实现中,会接收一个IBinder实例(被调用的Service),调用YourInterfaceName.Stub.asInterface((IBinder)service)将参数转换为YourInterface类型;5.调用接口中定义的方法。总要检测到DeadObjectException异常,该异常在连接断开时被抛出。它只会被远程方法抛出;6.断开连接,调用接口实例中的ApplicationContext.unbindService()。远程
调用81BroadcastReceiverBroadcast是一种广泛运用的在应用程序之间传输信息的机制。BroadcastReceiver是对发送出来的Broadcast进行过滤接收并响应的一类组件。用于异步接收广播Intent。概述82BroadcastReceiver静态注册静态注册一般为BroadcastReceiver单独编写一个继承自BroadcastReceiver类,然后在AndroidManifest.xml中用<receiver>标签申明注册,并在标签内用<intent-filter>标签设置过滤器。继承BroadcastReceiver,并重写onReceive()方法:
publicclassIncomingSMSReceiverextendsBroadcastReceiver{
@OverridepublicvoidonReceive(Contextcontext,Intentintent){
}
}
注册83BroadcastReceiver动态注册动态注册一般步骤:先定义一个BroadcastReceiver实例;在代码中先定义并设置好一个IntentFilter对象;在需要注册的地方调用Context.registerReceiver()方法;取消时调用Context.unregisterReceiver()方法。
注意:用动态方式注册的BroadcastReceiver的Context对象被销毁时,BroadcastReceiver也就自动取消注册了。注册84BroadcastReceiver一般过程:首先在需要发送信息的地方,把要发送的信息和用于过滤的信息(如Action、Category)装入一个Intent对象;然后通过调用Context.sendBroadcast()、sendOrderBroadcast()或sendStickyBroadcast()方法,把Intent对象以广播方式发送出去。当Intent发送以后,所有已经注册的BroadcastReceiver会检查注册时的IntentFilter是否与发送的Intent相匹配,若匹配则就会调用BroadcastReceiver的onReceive()方法。发送广播85BroadcastReceiver普通广播是完全异步的,可以在同一时刻(逻辑上)被所有接收者接收到。优点:效率比较高。缺点:接收者不能将处理结果传递给下一个接收者,并且无法终止广播Intent的传播。两种
广播86BroadcastReceiver有序广播是按照接收者声明的优先级别,被接收者依次接收广播。优先级别在<intent-filter>的android:priority属性中声明,数值越大优先级别越高,取值范围:-1000到1000。也可以调用IntentFilter对象的setPriority()进行设置。有序广播的接收者可以终止广播Intent的传播,广播Intent的传播一旦终止,后面的接收者就无法接收到广播。两种
广播87ContentProvider主要用于在不同应用程序之间实现数据共享概述88ContentProvider定义一个CONTENT_URI常量用于标识共享数据路径定义一个继承ContentProvider的类用于提供数据生成一个ContentResolver实例,实现query,insert,update,delete等方法在androidmanifest.xml中进行声明使用
方式89ContentProvider概述Uri代表了要操作的数据ContentResolver通过URI来查询ContentProvider中提供的数据URI90ContentProvider组成A:标准前缀,说明被ContentProvider控制数据B:URI的标识,定义了是哪个ContentProvider提供这些数据。C:路径D:表示需要获取的记录的ID;如果没有ID,就表示返回全部URI91ContentProviderUriMatcher:用于匹配Uri注册需要匹配的Uri路径使用uriMatcher.match(uri)方法对输入的Uri进行匹配ContentUris:用于获取Uri路径后面的ID部分URI
工具92ContentProvider概述通过ContentResolver发起数据请求,系统检查请求的URI所属的提供者,并将该请求转发到注册了此URI的ContentProvider进行处理。对数据进行添加、删除、更新等操作。Content
Resolver93ContentProviderActivityApplicationActivityApplicationActivityContentProviderServiceApplicationDataSQLiteXMLRemoteStoreContentResolverContentResolverContentResolverContent
Resolver94ContentProvider主要接口返回值方法声明finalUriinsert(Uriurl,ContentValuesvalues)finalintdelete(Uriurl,Stringwhere,String[]selectionArgs)finalCursorquery(Uriuri,String[]projection,Stringselection,String[]selectionArgs,StringsortOrder)finalintupdate(Uriuri,ContentValuesvalues,Stringwhere,String[]selectionArgs)Content
Resolver95Intent是一种运行时绑定(runtimebinding)机制,它能在程序运行的过程中连接两个不同的组件。概述96IntentActivityServiceBroadcastReceiverAndroidManifest.xmlIntent作用97Intent显式Intent隐式Intent种类98Intent在初始化时已经通过名字指定目标组件setComponent(ComponentName)setClass(Context,Class)setClassName()一般用于启动其它应用程序的组件显式Intent99Intent常见方式if(type.equals("audio/*")||type.equals("video/*")){Intentintent=newIntent();intent.setClass(MainActivity.this,MediaPlayerActivity.class);Bundlebl=newBundle();bl.putString("mediapath",f.getAbsolutePath());bl.putString("mediatype",type);intent.putExtras(bl);startActivity(intent);return;}显式Intent100Intent一般形式Intent<Intent_name>=newIntent(<ACTION>,<Data>);
startActivity(newIntent("com.google.app.CLEARSPLASH"));隐式Intent101Intent5种属性:Action为请求的动作命名系统定义的动作ACTION_CALL
程序定义的动作ject.SHOW_COLOR重要方法setAction()getAction()隐式Intent102Intent5种属性:Data需要操作的数据的URI和它的MIME类型Data一般和Action有关用Uri格式表示重要方法setData()、setType()、setDataAndType()getData()、getType()隐式Intent103Intent5种属性:Category包含了关于处理该intent的组件的种类的信息一个Intent对象可以有任意个categoryIntent类定义了许多category常数重要方法
addCategory()removeCategorygetCategories()隐式Intent104Intent5种属性:Extras为键值对形式的附加信息
Intent对象通过put...()和set...()方法来设定和获取附加信息借助Bundle对象存放数据后,使用putExtras()和getExtras()对数据进行封装
5种属性:Flags指示android系统如何启动一个activity和启动后如何处理它的标志。隐式Intent105Intent解析Android系统根据比较Intent的内容和intentfilter来找到最合适的组件来处理它。一个intentfilter是IntentFilter类的实例,但是它一般不出现在代码中,而是出现在androidManifest文件中,以<intent-filter>的形式设置(例外:broadcastreceiver的intentfilter是使用Context.registerReceiver()来动态设定的,其intentfilter也是在代码中创建的)隐式Intent106Intent解析——intentfilterintentfilter是组件的一个相关结构,表示其接受intent的能力如果一个组件没有intentfilter,那么它只能接受显式intent
当一个intent和intentfilter比较时,只考虑三个属性:action,data,category,extra和flag在intent解析中没有用
activity,service和broadcastreceiver可以有多个intentfilter来告知系统它们能接受什么样的隐式intent隐式Intent107Intent解析——安全一个intentfilter不一定安全可靠,一个应用程序可以让它的某个组件去接受隐式intent,但是它没法防止这个组件接受显示intent,其它的程序总是可以使用自定义的数据加上显式的程序名称来调用该组件。
隐式Intent108Intent解析——匹配Action一个intent对象只能指定一个action,而一个intentfilter可以指定多个action;一个intent对象的action必须和intentfilter中的某一个action匹配,才能通过;如果intentfilter的action列表为空,则所有的Intent将检测不通过;如果intent对象不指定action,并且intentfilter的action列表不为空,则通过所有测试。隐式Intent109Intent解析——匹配Category一个intent要通过category测试,那么该intent对象中的所有category都必须和filter中的某一个匹配;理论上来说,一个intent对象如果没有指定category,它应该能通过任意的category测试。(例外:android把所有的传给startActivity()的隐式intent看做至少有一个category:“ent.category.DEFAULT”。隐式Intent110Intent解析——匹配Data一个不含uri也不含数据类型的intent对象只通过两者都不包含的filter;一个含uri但不含数据类型的intent对象(并且不能从uri推断数据类型的),仅当过滤器也不指定数据类型,同时它们的uri匹配,才能通过检测。例如,mailto:和tel:都不指定实际数据。一个只包含数据类型但不包含uri的intent,仅当过滤也只包含数据类型且与Intent相同,才通过测试。一个既包含uri又包含数据类型的intent对象只通过这样的filter:intent对象的数据类型和filter中的一个类型匹配,intent对象的uri要么和filter的uri匹配,要么intent对象的uri为content:或者file:,并且filter不指定uri。隐式Intent平板UI设计模式4设计模式官方文档使用Fragment设计UI5创建Fragment特性Fragment是Activity的用户界面中的一部分或一种行为。可以在一个单独的Activity中把多个Fragment组合成为一个多区域的UI,也可以在多个Activity中复用一个Fragment。可以把Fragment认为是模块化的Activity片段,它具有自己的生命周期,处理自己的输入事件,并可以在Activity运行时动态添加或删除Fragment。Fragment不能独立存在,它必须嵌入到Activity中,而且Fragment的生命周期直接受所在的Activity的影响。创建Fragment创建创建Fragment和创建Activity类似,一般需要实现Fragment的布局XML文件并通过onCreateView()方法加载布局文件,最后将Fragment添加到Activity中。创建Fragment添加到Activity在Activity的布局文件里声明Fragment<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android=""android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="horizontal">
<fragmentandroid:android:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="3"class="com.nexes.manager.tablet.DirListActivity"/>
<fragmentandroid:android:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="1"class="com.nexes.manager.tablet.DirContentActivity"/>
</LinearLayout>创建Fragment添加到Activity在代码中添加Fragment到一个ViewGroup01 FragmentManagerfragmentManager=getFragmentManager();02 FragmentTransactionfragmentTransaction=03 fragmentManager.beginTransaction();04 ExampleFragmentfragment=newExampleFragment();05 fragmentTransaction.add(R.id.fragment_container,fragment);06 fragmentTmit();管理Fragment生命周期管理FragmentFragmentManagerFragmentManager的功能包括: 使用findFragmentById()(用于在Activity布局中提供有界面的Fragment)或者findFragmentByTag()获取Activity中存在的Fragment(用于有界面或者没有界面的Fragment)。 使用popBackStack()(模仿用户的返回命令)从后台栈弹出Fragment。 使用addOnBackStackChangedListener()注册一个监听后台栈变化的监听器。 使用FragmentManager打开一个FragmentTransaction来执行Fragment的事务,例如添加或删除Fragment。管理FragmentFragment之间通信在Fragment内部定义一个回调接口,然后在宿主Activity中实现它。当Activity通过接口接收到回调时,可以在必要时与布局中的其它Fragment共享信息。如果Activity没有实现这个接口,那么Fragment会抛出一个ClassCaseException异常。平板特色控件设计6动作栏功能直接在动作栏中显示选项菜单中的项目。提供在不同Fragment之间的导航标签。提供导航用的下拉列表。提供交互式的动作视图以代替动作项目。动作栏创建01 @Override02 publicbooleanonCreateOptionsMenu(Menumenu){03 //Menuitemsdefaulttonevershowintheactionbar04 menu.add("Normalitem");05 06 MenuItemactionItem=menu.add("ActionButton");07 //Itemsthatshowasactionsshouldfavorthe"ifroom"setting08 actionItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);09 actionItem.setIcon(android.R.drawable.ic_menu_share);10 returntrue;11 }动作栏创建01 <?xmlversion="1.0"encoding="utf-8"?>02 <menuxmlns:android="">03 <itemandroid:04 android:05 android:06 android:showAsAction="ifRoom|withText"/>07 </menu>动作栏导航应用程序图标导航@OverridepublicbooleanonOptionsItemSelected(MenuItemitem){
switch(item.getItemId()){caseandroid.R.id.home://appiconinActionBarclicked;gohomeIntentintent=newIntent(this,HomeActivity.class);intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);returntrue;default:returnsuper.onOptionsItemSelected(item);}}动作栏导航添加导航标签页①创建一个ActionBar.TabListener的实现来处理动作栏标签的交互事件。②对于要添加的每个标签页,通过调用setTabListener()来实例化ActionBar.Tab和设置ActionBar.TabListener。还可以用setText()和setIcon()设置标签页的标题和图标。③通过调用addTab()添加每个标签页到动作栏。动作栏导航添加下拉导航①创建一个SpinnerAdapter,为下拉提供可选择项目的列表,以及当绘画列表中每个项目时所使用的布局。②实现ActionBar.OnNavigationListener以定义用户从列表中选中一个项目时所发生的行为。③使用setNavigationMode()为动作栏开启导航模式。④用setListNavigationCallbacks()设置下拉列表的回调。动作栏ActionMode①实现ActionMode.Callback接口。在它的回调方法中,可以设置操作的上下文操作栏。回调方法包括:
onCreateActionMode(ActionModemode,Menumenu)第一次被创建的时候调用。
onPrepareActionMode(ActionModemode,Menumenu)刷新菜单列表的时候被调用,一般使用false即可。
onActionItemClicked(ActionModemode,MenuItemitem)菜单项被选中的时候被调用。
onDestroyActionMode(ActionModemode)退出或销毁菜单的时候被调用。②在需要显示上下文操作栏的时候,调用startActionMode(ActionMode.Callback)。搜索面板搜索语音搜索。根据最近的搜索结果,给出搜索建议。根据程序的实际搜索结果,给出搜索建议。搜索面板搜索ViewPager是AndroidSDK扩展包android-support-v4.jar中的控件,使用ViewPager能够实现只显示当前一组界面中的其中一个界面,当用户通过左右滑动界面时,当前的屏幕显示当前界面和下一个界面的一部分,滑动结束后,界面自动跳转到当前选择的界面中。搜索面板组成SearchDialog或SearchWidget的配置文件SearchableActivity搜索接口,包括SearchDialog和SearchWidget搜索面板SearchDialog为了使用SearchDialog,必须设计一个接收SearchDialog搜索请求的SearchableActivity,以便执行搜索,并在AndroidManifest.xml中代表该Activity的<activity>元素中加入<meta-data>。这个<meta-data>必须包含android:value属性,该属性指明了SearchableActivity的类名,还必须包括属性android:name,且其值必须为"android.app.default_searchable"。<activityandroid:name=".MainActivity"...><!--enablethesearchdialogtosendsearchestoSearchableActivity--><meta-dataandroid:name="android.app.default_searchable"android:value=".SearchableActivity"/></activity><!--thisisthesearchableactivity;itperformssearches--><activityandroid:name=".SearchableActivity"><intent-filter><actionandroid:name="ent.action.SEARCH"/></intent-filter><meta-dataandroid:name="android.app.searchable"android:搜索面板SearchWidget和SearchDialog一样,首先应该创建好searchable配置和SearchableActivity,然后为每个SearchView设置好搜索助手。可以通过setSearchableInfo()方法来设置SearchableInfo对象,SearchableInfo代表的是searchable配置。可以同过SearchManager的getSearchableInfo()来得到一个SearchableInfo的引用。导航类容器ViewPagerViewPager是AndroidSDK扩展包android-support-v4.jar中的控件,使用ViewPager能够实现只显示当前一组界面中的其中一个界面,当用户通过左右滑动界面时,当前的屏幕显示当前界面和下一个界面的一部分,滑动结束后,界面自动跳转到当前选择的界面中。导航类容器View
FlipperViewFlipper继承自ViewAnimator,用于将多个视图组织在一起,并实现滑屏动画效果。ViewFlipper一次仅能显示一个子视图。如果需要,可以设置ViewFlipper的间隔时间使子视图像幻灯片一样自动显示。导航类容器TabHostTabHost是一种选项卡容器,即UI界面以选项卡的形式将多个Activity组合在一起,通过单击选项卡标签显示不同的View或Activity的内容。TabHost的三要素是TabWidget、FrameLayout和List<TabSpec>。TabHost包含了两种子元素:一些可以自由选择的Tab和Tab对应的内容TabContent,在布局的<TabHost>下它们分别对应TabWidget和FrameLayout。TabWidget是TabHost中的标签页控件;FrameLayout是每个标签页内容的布局形式;List<TabSpec>是标签页集合。特定容器WebViewWebView是AndroidView类的子类,可以在Activity布局中嵌入一个WebView控件来显示一个网页。特定容器MapView通过引用Google地图扩展包com.google.android.maps来创建地图服务应用程序。特定容器VideoViewVideoView是Android提供的一个视频播放控件。在布局文件中使用VideoView结合MediaController来实现对视频播放的控制。平板桌面开发7简单桌面组件设计AppWidgets微型桌面应用程序(AppWidgets)是一个可以嵌入到其他应用程序(如主屏幕),并能定期更新其视图的桌面小部件。一个能容纳其他AppWidgets的应用程序,称之为AppWidgetsHost。简单桌面组件设计RemoteViewsRemoteViews类在android.widget.RemoteViews包下,是一个能够显示在其他进程中的远程视图。AppWidgets中的视图都是通过RemoteViews表现的。在RemoteViews的构造方法中,通过传入布局文件的ID来获取布局文件对应的RemoteViews视图。然后,调用RemoteViews中的方法能对布局中的控件进行设置。简单桌面组件设计AppWidget
ProviderInfoAppWidgetProviderInfo用于定义AppWidgets的基本属性,如显示的最小尺寸、初始布局资源、更新频率和ConfigurationActivity等。AppWidgetProviderInfo在res/xml目录中定义。AppWidgetProviderInfo的定义必须在一个只有单一的<appwidget-provider>元素的XML资源文件中进行。简单桌面组件设计AppWidget
ProviderAppWidgetProvider继承于BroadcastReceiver,它对AppWidgets的广播进行了简单分类,并封装了处理的统一接口,通过这些方法可以很方便和AppWidgets进行交互。AppWidgetProvider基于广播事件。当AppWidgets进行更新、启用、禁用和删除时,在AppWidgetProvider中,将收到其对应的广播,并调用相应的回调方法进行处理。简单桌面组件设计声明AppWidget创建了AppWidgetProviderInfo并实现了AppWidgetProvider之后,还需要在AndroidManifest.xml文件中声明该AppWidgetProvider类。在<meta-data>元素中,必须要指定AppWidgetProviderInfo资源文件,需要定义以下2个属性:
android:name属性
android:resource属性配置和管理桌面组件ConfigurationActivity如果想让用户在添加一个新的App
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年农行个人教育贷款合同规范
- cif下出口商的合同的保险条款
- 2025年反担保合同中的担保责任承担范围
- 江西省余干县重点达标名校2025届中考生物猜题卷含解析
- 2025届江西省高安市吴有训实验校中考四模生物试题含解析
- 山东省日照市五莲县重点中学2025届中考生物全真模拟试卷含解析
- 2019-2020北师大版小学数学五年级下册(全册)教案
- 酶解技术在肉类嫩化中的实践探索
- 混凝土表面硬化处理提高耐久性
- 能源项目风险管理 课件 6-能源项目风险应对管理
- 屠宰刀安全操作及保养规程
- 民航服务礼仪课件
- 公司供应商大会策划方案
- 云管理平台运营面试题
- “简约与繁复”二元思辨【 审题立意+范文精评 】 语文高分写作 多元思辨
- 计算物理课件
- 集中供热管网系统一次网的调节方法
- MRP、MPS计划文档教材
- 甲状腺疾病护理查房课件
- 安全安全带检查记录表
- Listen-to-this-3-英语高级听力-(整理版)
评论
0/150
提交评论