下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
彭彬()
浙江大学城市学院计算分院
ZhejiangUniversityCityCollegeAndroid程序设计综合入门浙江大学城市学院移动互联应用实验室ZUCCMobileInternetApplicationLab.UI设计Android本地UI设计的核心内容布局文件及布局器控件及其使用事件及事件响应控件访问/线程模型/异步操作资源:国际化/尺寸适配/平台适配AndroidUI设计概述在一个Android应用中,用户界面是由View
和ViewGroup对象构建的。View与ViewGroup都有很多种类,而它们都是View类的子类。View对象是Android平台中用户界面体现的基础单位。AndroidUI设计概述在Android平台上,你可以用下图所示的View和ViewGroup层次图来定义一个Activity的UI。AndroidUI设计概述android.view.View1)为指定的屏幕矩形区域存储布局和内容2)处理尺寸和布局,绘制,焦点改变,翻屏,按键、手势3)widget基类android.view.Viewgroup1)包含并管理下级系列的Views和其他Viewgroup2)布局的基类声明式UI设计方法Android使用Layout配置文件通过配置文件中声明控件及定义控件属性的方法来配置一个应用程序UI<LinearLayoutxmlns:android=""android:orientation="vertical"android:background="@drawable/blue"android:layout_width="match_parent"android:layout_height="wrap_content"><TextViewandroid:background="@drawable/box"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="@string/linear_layout_1_top"/><TextView……/><TextView……/></LinearLayout>.example.android.apis.view.LinearLayout9.java/layout/linear_layout_9.xml编程式UI设计方法同样可以使用编程的方法动态的生成控件
Buttonbtn=newButton(this);btn.setText(getString(R.string.btntxt));btn.setOnClickListener(this);layout.addView(btn,newLayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT));布局器定义并展现你的视图层次的最常用的方法是使用XML布局文件。如同HTML一样,XML为布局提供了一种可读的结构。XML中的每个元素都是View或ViewGroup对象(亦或它们的子类)。View对象是树的叶节点,而ViewGroup对象是树的分支LinearLayoutLinearLayout
isaviewgroupthatalignsallchildreninasingledirection,verticallyorhorizontally.Youcanspecifythelayoutdirectionwiththe
android:orientation
attribute.AllchildrenofaLinearLayoutarestackedoneaftertheother,soaverticallistwillonlyhaveonechildperrow,nomatterhowwidetheyare,andahorizontallistwillonlybeonerowhigh(theheightofthetallestchild,pluspadding).ALinearLayoutrespectsmarginsbetweenchildrenandthegravity(right,center,orleftalignment)ofeachchild.LinearLayoutLinearLayout-LayoutWeight
LinearLayoutalsosupportsassigningaweighttoindividualchildrenwiththeandroid:layout_weightattribute.Thisattributeassignsan"importance"valuetoaviewintermsofhowmuchspaceitshouldoccupyonthescreen.
Alargerweightvalueallowsittoexpandtofillanyremainingspaceintheparentview.Childviewscanspecifyaweightvalue,andthenanyremainingspaceintheviewgroupisassignedtochildrenintheproportionoftheirdeclaredweight.Defaultweightiszero.Forexample,iftherearethreetextfieldsandtwoofthemdeclareaweightof1,whiletheotherisgivennoweight,thethirdtextfieldwithoutweightwillnotgrowandwillonlyoccupythearearequiredbyitscontent.Theothertwowillexpandequallytofillthespaceremainingafterallthreefieldsaremeasured.Ifthethirdfieldisthengivenaweightof2(insteadof0),thenitisnowdeclaredmoreimportantthanboththeothers,soitgetshalfthetotalremainingspace,whilethefirsttwosharetherestequally.RelativeLayoutRelativeLayoutisaviewgroupthatdisplayschildviewsinrelativepositions.Thepositionofeachviewcanbespecifiedasrelativetosiblingelements(suchastotheleft-oforbelowanotherview)orinpositionsrelativetotheparentRelativeLayoutarea(suchasalignedtothebottom,leftorcenter).ARelativeLayoutisaverypowerfulutilityfordesigningauserinterfacebecauseitcaneliminatenestedviewgroupsandkeepyourlayouthierarchyflat,whichimprovesperformance.IfyoufindyourselfusingseveralnestedLinearLayoutgroups,youmaybeabletoreplacethemwithasingleRelativeLayout.RelativeLayoutRelativeLayoutFrameLayout
FrameLayoutisdesignedtoblockoutanareaonthescreentodisplayasingleitem.Generally,FrameLayoutshouldbeusedtoholdasinglechildview,becauseitcanbedifficulttoorganizechildviewsinawaythat'sscalabletodifferentscreensizeswithoutthechildrenoverlappingeachother.Youcan,however,addmultiplechildrentoaFrameLayoutandcontroltheirpositionwithintheFrameLayoutbyassigninggravitytoeachchild,usingtheandroid:layout_gravity
attribute.
Childviewsaredrawninastack,withthemostrecentlyaddedchildontop.ThesizeoftheFrameLayoutisthesizeofitslargestchild(pluspadding),visibleornot(iftheFrameLayout'sparentpermits).FrameLayoutGridLayoutAlayoutthatplacesitschildreninarectangulargrid.Thegridiscomposedofasetofinfinitelythinlinesthatseparatetheviewingareaintocells.ThroughouttheAPI,gridlinesarereferencedbygridindices.AgridwithNcolumnshasN+1gridindicesthatrunfrom0throughNinclusive.RegardlessofhowGridLayoutisconfigured,gridindex0isfixedtotheleadingedgeofthecontainerandgridindexNisfixedtoitstrailingedge(afterpaddingistakenintoaccount).RowandColumnSpecsChildrenoccupyoneormorecontiguouscells,asdefinedbytheirrowSpecandcolumnSpeclayoutparameters.Eachspecdefinesthesetofrowsorcolumnsthataretobeoccupied;andhowchildrenshouldbealignedwithintheresultinggroupofcells.AlthoughcellsdonotnormallyoverlapinaGridLayout,GridLayoutdoesnotpreventchildrenbeingdefinedtooccupythesamecellorgroupofcells.Inthiscasehowever,thereisnoguaranteethatchildrenwillnotthemselvesoverlapafterthelayoutoperationcompletes.GridLayout资源概述资源是外部文件(即非源代码文件),它们被你的代码使用,并且在编译时被编译到你的应用程序中。Android支持很多不同类型的资源文件,包括XML、PNG和JPEG文件。XML文件会由于其所描述的内容不同而形式不同。资源从源代码中被抽取出来,基于效率考虑,XML文件被编译成二进制、可以快速加载的形式。字符串,同样被压缩为一种更富效率的存储形式。Android资源系统记录应用程序中所有非代码资产。你可以使用Resources类来访问应用程序中的资源;一般可以通过Context.getResources()获得这个Resources实例。创建资源Android支持字符串、位图以及其他很多种类型的资源。每一种资源的语法、格式以及存放的位置,都会根据其类型的不同而不同。通常,你创建的资源一般来自于三种文件:XML文件(除位图和raw之外的任何文件)、位图文件(图像)以及Raw文件(除前面以外的其他东西,如声音文件等等)。事实上,XML文件也有两种不同的类型:被原封不动地编译进包内的文件和被aapt用来产生资源的文件。R类资源被编进最终的APK文件中。Android创建了一个封装类,叫做R,在代码中你可以使用它来引用这些资源。R包含了根据资源文件的路径和名称命名的子类。它包含了你的程序中所有资源的资源标识符。这个类包含了一些子类,每一个子类针对一种Android支持的资源类型*注意:R类是一个自动产生的文件,并没有设计为可以手动编辑。当资源更新时,它会根据需要重新产生。使用资源在Layout等资源文件中也可以应用其他的资源来填充自己的属性值。用户界面事件当你在用户界面中加入了一些视图(控件)之后,你可能想要知道如何让它们与用户交互,进而实现你的动作。定义一个事件侦听器并将其注册至视图。通常情况下,这是你侦听事件的主要方式。View类包含了一大堆命名类似On<什么什么>Listener的接口,每个都带有一个叫做On<什么什么>()的回调方法。比如:View.OnClickListener
(用以处理视图中的点击),View.OnTouchListener
(用以处理视图中的触屏事件),以及View.OnKeyListener
(用以处理视图中的设备按键事件)。所以,如果你希望你的视图在它被”点击”(比如选择了一个按钮)的时候获得通知,你就要实现OnClickListener,定义它的onClick()回调方法(在其中进行相应处理),并将它用setOnClickListener()方法注册到视图上。控件Android在android.widget下提供了主要的系统控件和布局器;请参考
ListView概述ListView
isaviewgroupthatdisplaysalistofscrollableitems.Thelistitemsareautomaticallyinsertedtothelistusingan
Adapter
thatpullscontentfromasourcesuchasanarrayordatabasequeryandconvertseachitemresultintoaviewthat'splacedintothelist.使用适配器构建布局如果布局的内容是属于动态或未预先确定的内容,您可以使用这样一种布局:在运行时通过子类AdapterView用视图填充布局。AdapterView类的子类使用Adapter将数据与其布局绑定。Adapter充当数据源与AdapterView布局之间的中间人—Adapter(从数组或数据库查询等来源)检索数据,并将每个条目转换为可以添加到AdapterView布局中的视图。适配器支持的常见布局包括:使用数据填充适配器视图可以通过将AdapterView实例与Adapter绑定来填充AdapterView(如ListView或GridView),此操作会从外部来源检索数据,并创建表示每个数据条目的View。Android提供了几个Adapter子类,用于检索不同种类的数据和构建AdapterView的视图。两种最常见的适配器是:ArrayAdapterSimpleCursorAdapterArrayAdapter在数据源为数组时使用此适配器。默认情况下,ArrayAdapter会通过在每个项目上调用toString()并将内容放入TextView来为每个数组项创建视图。例如,想要在ListView中显示的字符串数组,使用构造函数初始化一个新的ArrayAdapter,为每个字符串和字符串数组指定布局,然后,只需在ListView上调用setAdapter()示例ListView中的mainActivity基本的Item点击操作当Listview中的选项被点击,需要做出事件响应的时候,可以使用类似其它控件的onClick事件响应方法。对点击操作,需要实现:AdapterView.OnItemClickListener示例ListView中的mainActivitySimpleCursorAdapter(概要理解即可)
请在数据来自Cursor时使用此适配器。使用SimpleCursorAdapter时,必须指定要为Cursor中的每个行使用的布局,以及应该在哪些布局视图中插入Cursor中的哪些列。例如想创建人员姓名和电话号码列表,则可以执行一个返回Cursor(包含对应每个人的行,以及对应姓名和号码的列)的查询。然后创建一个字符串数组,指定要在每个结果的布局中包含Cursor中的哪些列,并创建一个整型数组,指定应该将每个列放入的对应视图:示例ListView中的SimpleCursorAdapterSimpleCursorAdapter(概要理解即可)UsingaLoaderUsingaCursorLoaderisthestandardwaytoqueryaCursorasanasynchronoustaskinordertoavoidblockingyourapp'smainthreadwiththequery.WhentheCursorLoaderreceivestheCursorresult,theLoaderCallbacksreceivesacallbacktoonLoadFinished(),whichiswhereyouupdateyourAdapterwiththenewCursorandthelistviewthendisplaystheresults.AlthoughtheCursorLoaderAPIswerefirstintroducedinAndroid3.0(APIlevel11),theyarealsoavailableintheSupportLibrarysothatyourappmayusethemwhilesupportingdevicesrunningAndroid1.6orhigher.自定义ListView
Item样式及构成(使用Simple
Adapter)Simple
Adapter
AneasyadaptertomapstaticdatatoviewsdefinedinanXMLfile.YoucanspecifythedatabackingthelistasanArrayListofMaps.EachentryintheArrayListcorrespondstoonerowinthelist.TheMapscontainthedataforeachrow.YoualsospecifyanXMLfilethatdefinestheviewsusedtodisplaytherow,andamappingfromkeysintheMaptospecificviews.自定义ListView
Item样式及构成可以使用一个部件文件定义一个ListView
Item的样式上面的例子中使用了SimpleAdapter,构造函数中指定了一个布局文件用于布局单个Item自定义Adapter可以自定义Adapter用于控制列表数据的加载和单个Item的布局控制,以达到更加灵活的列表构造自定义Adapter-BaseAdapter
CommonbaseclassofcommonimplementationforanAdapterthatcanbeusedinbothListView(byimplementingthespecializedListAdapterinterface)andSpinner(byimplementingthespecializedSpinnerAdapterinterface).自定义Adapter-AdapterAnAdapterobjectactsasabridgebetweenanAdapterViewandtheunderlyingdataforthatview.TheAdapterprovidesaccesstothedataitems.TheAdapterisalsoresponsibleformakingaViewforeachiteminthedataset.(PartofMethodslistbelow)/reference/android/widget/Adapter.html思考:适配器模式ListView中,填充数据的Adapter类是“适配器模式”的具体应用;讨论:这里适配器模式带来的好处FragmentFragment概述Fragment表现Activity中UI的一个行为或者一部分。可以将多个fragment组合在一起,放在一个单独的activity中来创建一个多界面区域的UI,并可以在多个activity里重用某一个fragment。把fragment想象成一个activity的模块化区域,有它自己的生命周期,接收属于它自己的输入事件,并且可以在activity运行期间添加和删除.Fragment必须总是被嵌入到一个activity中。它们的生命周期直接受其宿主activity的生命周期影响。例如:当activity被暂停,那么在其中的所有fragment也被暂停;当activity被销毁,所有隶属于它的fragment也被销毁。Fragment概述Fragment在Android3.0(APIlevel11)时被引入旧版本的Android使用android-support-v4.jar提供支持Fragment有自己的布局、生命周期、单独处理输入可以在多个Activity中复用Fragment概述当应用程序同时适用于平板电脑和手机时,可以利用Fragment实现灵活的布局Fragment的生命周期Fragment必须嵌入在Acitivity中使用,所以Fragment的生命周期和它所在的Activity是密切相关的如果Activity是暂停状态,其中所有的Fragment都是暂停状态如果Activity是stopped状态,其中所有的Fragment都不能被启动如果Activity被销毁,其中的所有Fragment都会被销毁但当Activity在活动状态,可以独立控制Fragment的状态Fragment的基础使用使用Fragment最简单的一种方式,把Fragment当成普通的控件,直接写在Activity的布局文件中Fragment的基础使用<?xmlversion="1.0"encoding="utf-8"?>
<LinearLayoutxmlns:android=""
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
<fragmentandroid:name="com.example.news.ArticleListFragment"
android:id="@+id/list"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="match_parent"/>
<fragmentandroid:name="com.example.news.ArticleReaderFragment"
android:id="@+id/viewer"
android:layout_weight="2"
android:layout_width="0dp"
android:layout_height="match_parent"/>
</LinearLayout>见示例:StaticUsagefragmentclasses和其他控件一样需要指定唯一IDFragmentManager简介FragmentManager用于管理activity中的fragments可以使用findFragmentById()或findFragmentByTag()方法得到Activity中存在的fragment可以使用popBackStack()将回退栈中最后的fragment转换弹出。这个函数是异步的:它将弹出栈的请求加入队列,但是这个动作直到应用回到事件循环才会执行使用addOnBackStackChangedListener()为backstack加上监听器可以获取FragmentTransaction来管理Fragment的变化Fragment的高级属性Fragment比Activity多了几个额外的生命周期回调方法onAttach(Activity)当Fragment与Activity发生关联时调用onCreateView(LayoutInflater,ViewGroup,Bundle)创建该Fragment的视图onActivityCreated(Bundle)当Activity的onCreate方法返回时调用Fragment的高级属性onDestoryView()与onCreateView相对应,当该Fragment的视图被移除时调用onDetach()与onAttach相对应,当Fragment与Activity关联被取消时调用注意:除了onCreateView,其他的所有方法如果重写,必须调用父类对于该方法的实现Fragment的高级属性FragmentTransaction使用fragment能跟据用户的输入对fragment进行添加、删除、替换以及执行其它动作,提交的一组fragment的变化叫做一个事务,它通过FragmentTransaction来执行一个事务是在同一时刻执行的一组动作(很像数据库中的事务)。可以使用add(),remove(),replace()等方法构成事务,最后使用commit()方法提交事务。replace()相当于同时调用remove()与add()Fragment的高级属性在调用commit()之前,可以用addToBackStack()把事务添加到一个回退栈中,这个回退栈属于所在的activity。使用回退栈就可以在用户按下返回键时,返回到fragment执行事务之前的状态调用commit()并不立即执行事务。它会将事务安排排期,一旦准备好,就在activity的UI线程(主线程)上运行Fragment的高级属性注意:你只能在activity中保存它的状态,在用户离开activity之前使用commit()提交事务,否则会抛出一个异常添加变化到FragmentTransaction的顺序不重要,除以下例外:必须最后调用commit()如果添加多个fragment到同一个容器,那么添加的顺序决定了它们在viewhierarchy中显示的顺序Fragment的高级属性当执行一个移除fragment的事务时,如果没有调用addToBackStack(),那么当事务提交后,那个fragment会被销毁,并且用户不能导航回到它。所以,当移除一个fragment时,如果调用了addToBackStack(),那么fragment会被停止,如果用户导航回来,它将会被恢复见示例:TransactionUsageListFragmentListFragment是Fragment的一个子类,内置了列表显示支持功能(内部包含了一个ListView控件);为手机上大量的List/Detail类型的浏览模型提供支持;只有继承ListFragment就可以直接获取一个可用的ListFragment实例;publicclassItemListFragmentextendsListFragmentListFragment使用ListFragment在基本构造上非常类似于使用ListView控件;最简单的步骤可以概括为:实现ListFragment的onCreate事件回调,在此方法中设置各种属性,特别是提供一个数据适配器(Adapter)实现一个数据适配器(Adapter),实现getView方法,提供列表项视图;实现onListItemClick接口方法,获取列表项目点击事件;实现onResume事件回调,更新可能由于跳转其他编辑页面导致数据更新的页面更新;ListFragment使用ListFragment时,ListView同样只有在需要显示内容时才会申请视图对象(调用getView方法);实现此特性的关键是实现Adapter,Adapter负责1)创建列表项的视图对象2)用模型数据填充每一个视图对象3)将视图对象创建完毕后返回给ListView我们在示例中使用了最简单的ArrayAdapter<T>类,所有的XXXXXXAdapter类都需要实现Adapter接口,所以用法基本一致;ListFragmentListView和Adapter的交互示意图:我们拖动List界面时,系统自动调用Adapter按需填充需要的View对象ListFragment点击事件与列表项布局1.在ListFragment中只要override对应的onListItemClick事件,就可以捕获对列表项的点击事件;2.可以定制一个为列表项布局设计的布局文件,通过在Adapter的getView方法中加载此布局文件实例化为View对象后,通过findViewById方法获取每个控件的实例,完成每个具体控件的渲染。通过此方法可以设计很复杂的复合列表项(可以想象一下比如微博的列表显示);Fragment参数传递一般使用ListFragment在列表和明细界面间跳转的过程中会存在参数的传递要求。比如明细项目的ID等;向Fragment传递参数和Activity间传递参数的概念一致,就是使用一个类似于Map的数据结构Bundle进行参数的打包和传递;
Fragment参数传递在ListFragmentExample当中我们在两个Activity间用Intent传递参数,在Fragment的容器Activity中构造Bundle传递给Fragment的构造函数;虽然Fragment可以获取容器Activity直接读取参数,但是由于Fragment是可以在不同Activity间复用的结构,这种做法导致了高耦合度,和Fragment的设计目标不相符;ListFragmentExample分析代码分析:ListFragmentExample1)ListFragment基本结构2)实现Adapter3)实现表项布局4)实现参数传递和跳转5)实现回退和数据刷新DialogFragmentAndroid上有两种对话框DialogDialogFragment从3.0开始,官方推荐使用DialogFragment,DialogFragment由FragmentManager负责管理生命周期,比如在切换横竖屏等需要重建Activity的情况下负责管理Dialog的重建,Dialog的销毁等都被FragmentManager统一管理了;DialogFragment创建DatePickerDialogFragment:当通过DialogFragment创建对话框Fragment时只要通过overridonCreateDialog方法即可;同样使用AlertDialog可以创建各种对话框(使用setView方法可以加载各种布局做为对话框)显示DialogFragment显示DialogFragment对话框仅仅需要调用其成员方法show即可,show有两种形式,可以使用FragmentTransaction或者FragmentManager做为参数,适用于不同的参数场景,基本区别不大;通过使用setView加载不同的对话框视图,和Fragment加载视图方法一致;DialogFragment与调用的Fragment之间传递参数Fragment有一个回调成员onActivityResult,其作用和容器Activity的同名回调方法含义一致,系统会在调用Activity的此方法后调用Fragment的该方法;本示例中由于两个Fragment在同一个Activity中,所以可以通过一个Fragment直接调用另外一个Fragment的此方法达到参数传递的目的;DialogFragment与调用的Fragment之间传递参数为了使这种方法顺利实施,还需要为DialogFragment设置目标Fragment,建立两个Fragment间的关联;之后就可以使用Intent将设置值回传*如果仔细观察的话,这种方法和不同Activity间传递参数的做法是一致的,所以Fragment的复用度又得到了提高;使用Fragment创建自适应布局
一般自适应布局应用于大屏设备或者横屏显示的情况下。基本做法是通过捕获当前设备的状态(屏幕大小,显示方向等),通过if语句加载不同的布局文件,在布局文件中复用fragment。所以要求Fragment的设计应该和具体的Activity进行解耦,在不同的Activity容器中均能够正确运行。使用Fragment创建自适应布局
示例中采用了values/strings.xml,values-land/strings.xml中设置不同的常量值得方法,当设备处于竖屏/横屏时加载不同的常量,在Activity中通过比较此标志来加载不同的布局文件的方法;
由于布局文件同样分布在不同的layout目录中(layout和layout-land中),通过不同布局中加载Fragment的方法达到自适应横屏,竖屏的效果。其他针对大屏幕的自适应方法类似于此方法;请参考ListFragmentExampleRotation示例中的MainActivity类的onCreate方法;数据存储数据存储Android三种存储数据的方式:SharedPreference
轻量级键-值方式存储,以XML文件方式保存。文件
采用java.io.*库所提供有I/O接口,读写文件。SQLite数据库SQLite是轻量级嵌入式内置数据库。Android提供的一种私有数据存储/访问方式:ContentProviderContentProvider可为数据封装,为多个应用共享。SharedPreferenceThe
SharedPreferences
classprovidesageneralframeworkthatallowsyoutosaveandretrievepersistentkey-valuepairsofprimitivedatatypes.Youcanuse
SharedPreferences
tosaveanyprimitivedata:booleans,floats,ints,longs,andstrings.Thisdatawillpersistacrossusersessions(evenifyourapplicationiskilled).SharePreference用来存储应用程序的首选项数据这样的轻量级数据。文件文件用来存储大数量的数据,采用java.io.*库所提供有I/O接口来处理文件的读写流,读写文件,和普通J2SE中的文件操作相同。使用java.io.*库可以访问任何有权限的文件系统位置。java.io.Filejava.io.FileInputStreamjava.io.FileOutputStream访问SDCard,需要申请访问SDCard的权限。在AndroidManifest.xml中加入访问SDCard的权限如下:<!--在SDCard中创建与删除文件权限--><uses-permissionandroid:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/><!--往SDCard写入数据权限--><uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>文件Context类(Acitivty)也拥有一组方法,用来方便的处理应用程序私有文件数据。默认的处理路径是/data/data/<packagename>/files/Context.openFileInputContext.openFileOutputContext.deleteFileContext.fileListContext.getFilesDir*这里的应用程序私有文件目录是在手机内存中,不要存储大量的文件数据,需要存储大量文件数据时使用java.io.*库将文件内容存储在SD卡中。SQLiteSQLite,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源世界著名的数据库管理系统来讲,它的处理速度比他们都快。SQLite第一个Alpha版本诞生于2000年5月。不像常见的客户端/服务器结构范例,SQLite引擎不是个程序与之通信的独立进程,而是连接到程序中成为它的一个主要部分。/Android中使用SQLite创建数据库,关闭数据库,删除数据库创建表及其他数据库对象,删除数据库对象创建,修改和删除记录事务查询Android控件与数据库数据绑定*AndroidSDK中包含的若干有用的SQLite数据库管理类存在于包android.database.sqlite中*可以通过AndroidSDK提供的Sqlite3命令行工具操作应用程序创建的数据库。ContentProviderContentProvider是Android应用程序间共享数据的一种机制。应用程序通过ContentProvider访问别的应用程序的数据,或者作为ContentProvider向别的应用程序提供数据访问。Android系统通过ContentProvider机制将一些内建应用的数据提供给其他应用程序使用ContentProvider-基础概念ContentProvider的实现者定义各自的数据存取方式,但是通过一个一致的接口提供数据的访问方法。
数据使用者使用ContentResolever对象来完成和一个ContentProvider的数据交互访问。ContentProvider的对象实例由系统来维护其生命周期,无需使用者显式创建,一般一种ContentProvider只有一个实例,不过可以同时与不同应用程序的多个ContentResolver交互。ContentProvider-查询数据示例
如果要返回一条特定的记录,需要将记录的id值附加在URI串的后面,比如content://…/123*也可以使用帮助函数来附加id值到URI中withAppendedId或者withAppendedPath()系统内建的ContentProvider系统内建程序提供的ContentProvider主要在包vider中MediaStore:系统中存储的媒体资源;CallLog:通话历史;Brower:浏览器的浏览历史和书签ContactsContract:联系人Settings:系统范围的设备设置和首选项UserDictionary:用户定义字典,用于文本输入预测;实现ContentProvider1.设计一套存储数据的机制,一般可以采用SQLite来作为后台存储数据机制;2.继承ContentProvider类并复写父类方法:publicclassMyProviderextendsContentProvider{publicbooleanonCreate()publicUriinsert(Uriuri,ContentValuesvalues)publicintdelete(Uriuri,Stringselection,String[]selectionArgs)publicintupdate(Uriuri,ContentValuesvalues,Stringselection,String[]selectionArgs)publicCursorquery(Uriuri,String[]projection,Stringselection,String[]selectionArgs,StringsortOrder)publicStringgetType(Uriuri)}3.在Manifest文件中声明contentProviderURI结构解析A:标准前缀B:authority串,用来唯一标示一个ContentProvider,应该是全局唯一的,也是在manifest文件中声明时authorities属性的定义值C:子数据集标志,这个部分由ContentProvider解释,一般用来做数据集映射,比如content://vider/student用来访问学生数据子集content://vider/teacher用来访问老师数据子集而且C这个部分可以具有多层结构,其解释完全依赖于ContentProvider的实现类content://vider/student/male:男同学数据content://vider/student/female:女同学数据D:指定特定记录的ID号,即_id列网络与多任务处理Android网络程序设计Android平台包括了包,即支持普通的基于Socket的网络程序设计模式;目前流行的网络通讯方式都基于Http协议工作;网络传输处理过程较为费时,需要处理UI线程与处理工作者之间的关系,需要涉及到多线程程序处理;网络程序一般通过http协议交换xml/json数据载荷或者处理html页面呈现,分别需要使用xml解析和webview渲染html内容AndroidHTTP访问Android应用程序都是作为Web客户端工作,利用URL类读取服务器内容是相当容易的。URLtext=newURL("");InputStreamisText=text.openStream();byte[]bText=newbyte[250];intreadSize=isText.read(bText);Log.i("Net","readSize="+readSize);Log.i("Net","bText="+newString(bText));
isText.close();通过URL类很容易获取指定Url所标识的服务器资源为了使应用程序使用网络,授权许可是必不可少的<uses-permissionandroid:name="android.permission.INTERNET"/>*示例:SimpleNetworking,NetworkReadBytesActivityAndroid使用ThreadAndroid支持Java中的Thread类,可以使用J2SE中多线程的处理方法来构建多线程程序;Android线程概述当一个Android应用程序运行时,系统会为应用程序创建一个main线程。Main线程对每个Android应用程序都很重要,主要的职责有:1)负责消息循环(包括各种用户操控消息)2)负责和各种UI组件交互(所以有的时候main线程也成为UI线程)如果应用程序不显式的创建一个线程,那么应用程序就只有一个主线程在单线程模式下,所有的功能性代码都在UI线程中执行,所以当代码执行时间较长时,不能对用户的操作做出响应,在Android系统上如果对用户事件不能及时响应(大约5秒),系统会弹出“应用程序没有响应”对话框,用户可以选择强制关闭应用程序。Android中UI控件不是线程安全的,所以所有的UI控件操作必须在主线程中完成。Android线程概述Android两条重要的设计原则:1)不要阻塞主线程(比如执行等待,耗时的计算,网络I/O等)2)不要在主线程外操作Android的UI控件,比如更新UI控件显示状态*上面的更新mImageView的代码违反了上述第二条原则Android显式在主线程中执行功能针对不能在主线程外操作Android的UI控件,Android提供了几个相应的Api来显示指定在主线程中执行某些功能:Activity.runOnUiThread(Runnable)View.post(Runnable)View.postDelayed(Runnable,long)Android使用AsyncTask可以使用AsyncTask来简化工作线程和主线程的交互;AsyncTask提供了几个特定的方法来规划功能的执行,保证一些方法在工作者线程(由AsyncTask来创建)中执行,保证一些方法在主线程中执行onPreExecute()方法:在主线程中执行,在开始工作者线程前被执行;doInBackground()方法:在工作者线程中执行的功能;onProgressUpdate()方法:在工作者线程调用publishProgress方法后在主线程中执行,用于工作者线程执行过程中和主线程进行交互;onPostExecute()方法:在主线程中执行,而且是在doInBackground()方法执行完毕后被执行;Android使用AsyncTaskAndroid使用Handler当耗时的功能在工作线程中的处理代码较为复杂时,使用Handler处理比较适合Handler自动和创建Handler实例的线程的消息队列相绑定;一个Handler类和一个特定线程的消息队列绑定后,主要可以用来完成两个功能:1)向绑定的消息队列发送消息,用于在其他线程中提交一个操作到handler绑定的线程中执行;2)处理绑定的消息队列中的消息;Android使用Handler在另一个线程中提交一个操作到Handler绑定的线程中执行:post(Runnable)postAtTime(Runnable,long)postDelayed(Runnable,long)
*示例:SimpleNetworking中FlickrActivity3在另一个线程中向Handler绑定的线程消息队列发送消息,后续会在Handler绑定的线程中调用Handler的HandleMessage(message)方法处理消息:sendEmptyMessage(int)sendMessage(Message)sendMessageAtTime(Message,long)sendMessageDelayed(Message,long)异步网络访问时序图示例硬件设备访问照相机在android中应用相机功能,一般有两种:一种是直接调用系统相机,一种自己通过API写的相机。注意:使用照相功能需要在AndroidManifest.xml配置相应的permission权限:照相机第一种:是使用Intent跳转到系统相机,action为:android.media.action.STILL_IMAGE_CAMERA
关键代码:Intentintent=newIntent();//调用照相机
intent.setAction("android.media.action.STILL_IMAGE_CAMERA");
startActivity(intent);//createIntenttotakeapictureandreturncontroltothecallingapplication
Intentintent=newIntent(MediaStore.ACTION_IMAGE_CAPTURE);
//settheimagefilename
intent.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(newFile(SD_PATH,"temp.jpg")));
//starttheimagecaptureIntent
startActivityForResult(intent,CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);或者通过以下方法,此方法多用于获取调用相机拍照后返回的数据,如微博、微信的照片分享、头像设置等自定义相机第二种:通过API自定义相机首先我们要自己创建一个照相界面,用SurfaceView显示照相机中的预览效果,控制SurfaceView需要一个surfaceHolder,他是系统提供的一个用来设置SurfaceView的一个对象,可以通过surfaceView.getHolder()这个方法来获得.Camera提供一个setPreviewDisplay(SurfaceHolder)的方法来连接surfaceHolder,并通过他来控制surfaceView.而我们则使用android的Camera类提供了startPreview()和stopPreview()来开启和关闭预览.关系如下:
Camera---->SurfaceHolder------>SurfaceView.自定义相机开启相机.Camera.open()这是个静态方法,如果相机没有别人用着,则会返回一个相机引用,如果被人用着,则会抛出异常。//设置参数
parameters=camera.getParameters();//获取各项参数
parameters.setPictureFormat(PixelFormat.JPEG);//设置图片格式
parameters.setPreviewSize(width,height);//设置预览大小
parameters.setPreviewFrameRate(5);//设置每秒显示5帧
parameters.setPictureSize(width,height);//设置保存的图片尺寸
parameters.setJpegQuality(100);//设置照片质量开启相机后,通过Camera.Parameters可以设置各种照相参数自定义相机拍照,拍照用到了一个camera.tackPiture()这个方法,这个方法,有三个参数分别是
ShutterCallBackshutter,PictureCallBackraw,PictureCallBackjpeg.publicfinalvoidtakePicture(ShutterCallbackshutter,PictureCallbackraw,
PictureCallbackjpeg)shutter--拍照瞬间调用raw--获得没有压缩过的图片数据jpeg---返回jpeg的图片数据
当不需要对照片进行处理,可以直接用null代替.自定义相机拍完照之后就是保存照片,实现PictureCallback接口的onPictureTaken方法:@Override
publicvoidonPictureTaken(byte[]data,Cameracamera){
try{
saveToSDCard(data);//保存图片到
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 护理实践中的家庭支持
- 护理基本用药护理
- 护理考试名师难点解析
- 护理实践中的护理质量改进
- 护理学生人文关怀教育
- 呼吸系统疾病护理的质量控制
- 护理安全管理的国际经验与借鉴
- 护理课件评估与反馈机制
- 旅游行业经理人才选拔面试技巧
- 基于可持续发展的空天旅游载具环境影响评估
- 2026年2月时政题库(附答案)
- 2026江苏无锡江阴水韵新城建设投资有限公司招聘工作人员7人笔试备考试题及答案解析
- 2026年河南林业职业学院单招职业适应性测试题库带答案详解
- 2026年内蒙古商贸职业学院单招职业技能考试题库附答案详解
- 2026年安徽城市管理职业学院单招职业适应性测试题库带答案详解(新)
- KTV事故隐患内部报告奖励制度
- 应急管理干部警示教育以案促改心得体会
- 2026年小学六年级下册劳动教育教学计划
- 乡卫生院卫生统计制度
- 2026年妇联岗位面试考点梳理练习题及答案
- 露天矿山应急管理课件
评论
0/150
提交评论