安卓应用总结_第1页
安卓应用总结_第2页
安卓应用总结_第3页
安卓应用总结_第4页
安卓应用总结_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

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

文档简介

安卓应用总结一、Activity类1、生命周期Android定义了一系列与生命周期相关的方法,在我们自己的Activity中,只是根据需要复写需要的方法,Java的多态性会保证我们自己的方法被虚拟机调用(即回调方法)。publicclassOurActivityextendsActivity(protectedvoidonCreate(BundlesavedInstanceState);setContentView(R.layout.main);/设置界面布局protectedvoidonStart();//启动protectedvoidonResume();//进入界面之前protectedvoidonPause();protectedvoidonStop();protectedvoidonDestroy();}onCreate==>onStart()==>onResume()==>running==>onPause()==>onStop()==>onDestroy()注:在这些生命周期方法中必须调用父类的该方法2、启动另外一个ActivityActivity.startA的电)()方法可以根据传入的参数启动另外一个Activity:Intentintent=newIntent(CurrentActivity.this,OtherActivity.class);startActivity(intent);注:OtherActivity同样需要在AndroidManifest.xml中定义3、Activity之间通信在Android中,不同的Activity实例可能运行在一个进程中,也可能运行在不同的进程中。因此我们需要一种特别的机制帮助我们在Activity之间传递消息。Android中通过Intent对象来表示一条消息,一个Intent对象不仅包含有这个消息的目的地,还可以包含消息的内容,这好比一封Email,其中不仅应该包含收件地址,还可以包含具体的内容。对于一个Intent对象,消息“目的地”是必须的,而内容则是可选项。Intent的中文意思是目的。在Android中也是"目的”的意思。就是我们要去哪里,从这个activity要前往另一个Activity就需要用到Intent。发件人:(CurrentActivity类中)Intentintent=newIntent(CurrentActivity.this,OtherActivity.class);//创建一个带“收件人地址”的emailBundlebundle=newBundle();//创建email内容bundle.putBoolean(〃boolean_key〃,true);//编写内容bundle.putString(〃string_key〃,〃string_value〃);intent.putExtra(〃key〃,bundle);//封装emailstartActivity(intent);//启动新的Activity收件人:(OtherActivity类中)Intentintent=getIntent();//收取email

Bundlebundle=intent.getBundleExtra(〃key〃);//打开emailbundle.getBoolean(〃boolean_key〃);//读取内容bundle.getString(〃string_key〃);使用SharedPreferencesSharedPreferences使用xml格式为Android应用提供一种永久的数据存贮方式。对于一个Android应用,它存贮在文件系统的/data/data/your_app_package_name/shared_prefs/目录下,可以被处在同一个应用中的所有Activity访问。Android提供了相关的API来处理这些数据而不需要程序员直接操作这些文件或者考虑数据同步问题。//写入SharedPreferencesSharedPreferencespreferences=getSharedPreferences(〃name〃,MODE_PRIVATE);Editoreditor=preferences.edit();editor.putBoolean(〃boolean_key〃,true);editor.putString(〃string_key〃,〃string_value〃);mit();//读取SharedPreferencesSharedPreferencespreferences=getSharedPreferences(〃name〃,MODE_PRIVATE);preferences.getBoolean(〃boolean_key〃,false);preferences.getString(〃string_key〃,〃default_value〃);4、Activity的IntentFilterIntentFilter描述了一个组件愿意接收什么样的Intent对象,Android将其抽象为android.content.IntentFilter类。在Android的AndroidManifest.xml配置文件中可以通过<intent-filter>节点为一个Activity指定其IntentFilter,以便告诉系统该Activity可以响应什么类型的Intento当程序员使用startActivity(intent)来启动另外一个Activity时,如果直接指定intent了对象的Component属性,那么ActivityManager将试图启动其Component属性指定的Activity。否则Android将通过Intent的其它属性从安装在系统中的所有Activity中查找与之最匹配的一个启动,如果没有找到合适的Activity,应用程序会得到一个系统抛出的异常。①Action匹配Action是一个用户定义的字符串,用于描述一个Android应用程序组件,一个IntentFilter可以包含多个Actiono在AndroidManifest.xml的Activity定义时可以在其<intent-filter>节点指定一个Action列表用于标示Activity所能接受的“动作”,例如:〈intent-filter><actionandroid:name=〃ent.action.MAIN〃/><actionandroid:name=〃com.zy.myaction〃/></intent-filter>如果我们在启动一个Activity时使用这样的Intent对象:Intentintent=newIntent();intent.setAction(〃com.zy.myaction〃);那么所有的Action列表中包含了“com.zy.myaction”的Activity都将会匹配成功。Android预定义了一系列的Action分别表示特定的系统动作。这些Action通过常量的方式定义在android.content.Intent中,以“ACTION_”开头。我们可以在Android提供的文档中找到它们的详细说明。一URI数据匹配一个Intent可以通过URI携带外部数据给目标组件。在<intent-filter>节点中,通过<data/>节点匹配外部数据。mimeType属性指定携带外部数据的数据类型,scheme指定协议,host、port、path指定数据的位置、端口、和路径。如下:<dataandroid:mimeType=〃mimeType〃android:scheme=〃scheme〃android:host=〃host〃android:port=〃port〃android:path=〃path〃/>如果在IntentFilter中指定了这些属性,那么只有所有的属性都匹配成功时URI数据匹配才会成功。Category类别匹配〈intent-filter>节点中可以为组件定义一个Category类别列表,当Intent中包含这个列表的所有项目时Category类别匹配才会成功。5、一些关于Activity的技巧①锁定Activity运行时的屏幕方向Android内置了方向感应器的支持。在G1中,Android会根据G1所处的方向自动在竖屏和横屏间切换。但是有时我们的应用程序仅能在横屏/竖屏时运行,比如某些游戏,此时我们需要锁定该Activity运行时的屏幕方向,<activity>节点的android:screenOrientation属性可以完成该项任务,示例代码如下:<activityandroid:name=〃.EX01〃android:label=〃@string/app_name〃android:screenOrientation=〃portrait〃〉//竖屏,值为landscape时为横屏</activity>全屏的Activity要使一个Activity全屏运行,可以在其onCreate()方法中添加如下代码实现://设置全屏模式getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);//去除标题栏requestWindowFeature(Window.FEATURE_NO_TITLE);在Activity的Title中加入进度条为了更友好的用户体验,在处理一些需要花费较长时间的任务时可以使用一个进度条来提示用户“不要着急,我们正在努力的完成你交给的任务”。如下图:在Activity的标题栏中显示进度条不失为一个好办法,下面是实现代码://不明确进度条requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);setContentView(R.layout.main);setProgressBarlndeterminateVisibility(true);//明确进度条requestWindowFeature(Window.FEATURE_PROGRESS);setContentView(R.layout.main);setProgress(5000);二、布局几种布局方式:View的布局显示方式有下面几种:线性布局(LinearLayout)、相对布局(RelativeLayout)、表格布局(TableLayout)、网格视图(GridView)、标签布局(TabLayout)、列表视图(ListView)、绝对布局(AbsoluteLayout)帧布局(FrameLayout)。语:布局相对比较简单,这里不再详细介绍。三、控件的使用1、ListView、Spinner、GridView与GalleryListView和Gallery,Spinner有一个共同点:它们都是AdapterView的子类。AdapterView的显示可以通过数据绑定来实现,数据源可以是数组或是数据库记录,数据源和AdapterView是通过Adapter作为桥梁。通过Adapter,AdatperView可以显示数据源或处理用户选取事件适配器有:BaseAdapter(较常用)、ArrayAdapter、SimpleAdapter加载数据的步骤activity的layout中声明控件在layout/创建ListView的一个item所需要的layout文件初始化数据源初始化适配器setAdapter各自实现的监听ListView:onItemClickedListeneronItemLongClickedListenerSpinner:(只显示一项数据,通过弹出式Dialog从其他数据中选择一项)onItemSelectedListenerGridView:android:columnWidthandroid:numColumnandroid:strechModeandroid:horizontalSpacingandroid:verticalSpacingOnItemClickListener/OnItemLongClickListener2、ImageSwitcher为图片切换提供了简单动画效果,使用该控件时必须调用setFactory()方法来构造一个ImageView控件setImageResource()3、AlertDialogDialogInterface.OnClickListener创建:newAlertDialog.Builder(context).setTitle().setMessage()/.setView(View

view).setPositiveButton().setNegitiveButton().create().show()4、Menu的创建OptionsMenu通过单击Menu按键出现©OverrideonCreateOptionsMenu():设置菜单项menu.add().setIcon()SubMenusubMenu=menu.addSubMenu()onOptionsItemSelected():处理菜单中某个子项被选中后的逻辑intid=item.getItemId();ContextMenu通过在控件上长按出现©OverrideonCreateContextMenu()onContextItemSelected()调用registerForContextMenu(Viewview)方法==>为view设置ContextMenu四、其他1、数据存储SharedPreferences项目内部/shared_prefs/*.xml有格式的存储简单私有数据:long,int,float,boolean,string以key+value形式存储数据SharedPreferenceget()//读取数据edit()//编辑SharedPreference.Editorput()//写入数据commit()//提交写入的数据InternalStorage项目内部/files/*.*项目内部存储私有数据FileInputStreamfis=openFileInput(name);FileOutputStreamfos=openFileOutput(name,mode);mode:Context.MODE_PRIVATE,Context.MODE_APPENDExternalStorageSD卡存储public数据IO流常用classFile(文件,目录)FileInputStream,FileOutputStreamFileReader,FileWriterBufferedReader(readLine)/BufferedWriterInputStreamReader/OutputStreamWriter字节流==>字符流)ByteArrayOutputStream(内存,toByteArray())String(getBytes(),getBytes(Stringencode),String(byte[]),String(byte[],encode))

ExternalStorage注意:(Environment)先判断SD卡是否挂载(即sd卡是否可用)MOUNTif(!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED){//return;}SD卡根位置不要去描述("/mnt/sdcard"),而是通过方法获取StringsdPath=Environment.getExternalStorageDirectory().getAbsolutePath();往SD卡写入数据时,需要给出写入权限(permission)android.permission.WRITE_EXTERNAL_STORAGE④SQLiteDatabase(SQLite数据库(适用于嵌入式开发的小规模数据库))SQL:StructuredQueryLanguage结构化的查询语言表Table:存储数据,一行就是一条数据基本SQL语句:增,删,改,查.sqlite3进入数据库客户端.tables查看当前库下所有表.schema表名查看表结构.exit退出SQLite客户端1)创建表CREATETABLE表名(列1定义,列2定义,)列定义:列名数据类型约束数据类型:integer,real,text,blob(大二进制)其中text类型的值使用单引号''引起来约束:primarykey主键约束,要求该列值不能重复而且不能为null(一个表中只能有一个primarykey约束)notnull非空约束,要求该列必须有值autoincrement自增长标识列,该列不给出值时系统会自动赋值;要求该约束必须应用在integer并且primarykey歹U上check条件表达式,要求该列的值必须满足条件表达式default值默认约束,该列不给值,使用默认值foreignkey外键约束,约束该列的值只能主表中关联列值,或者该列值为nullEg:CREATETABLEstudent(_idintegerprimarykeyautoincrement,nametextnotnull,teltext,scoreinteger);插入数据INSERTINTO表名values(列1值,列2值,...)//每列都要给值,其中autoincrement列可以给值为nullINSERTINTO表名(列1,列2,...)values(列1值,列2值,...)//按照表名后面的列给3)查看数据SELECT列1,列2,...//其实可以使用*代表所有列FROM表名[where条件表达式]//行过滤条件[groupby分组表达式[having组条件表达式]][orderby排序表达式asc|desc]//查询数据时,默认按照主键列升序,asc升序,desc降序特殊地:聚合函数count(*),count(表达式)count(*)统计行数,count(表达式)统计表达式的值不为null的行数sum(表达式),avg(表达式)max(表达式),min(表达式)条件描述:逻辑运算符:and,or,not关系运算符:>,>=,<,<=,=,!=,<>in(值1,值2,...)between...and字符列like值’:其中描述值时可以使用_(匹配1个任意字符)或者%(匹配任意个任意字符)select*fromstudentwhere_idin(1,3);select*fromstudentwhere_idbetween1and3;selectnamefromstudentwherenamelike'%a%'selectnamefromstudentwherenamelike'a%';selectnamefromstudentwherenamelikeJJa;selectmax(score),min(score)fromstudent;selectcount(*),count(tel)fromstudent;4)更新数据updateUPDATE表名SET列名=值,列2名=值,[WHERE条件表达式]updatestudentsettel='65656512';updatestudentsettel='121212'where_idin(1,3,5,6);updatestudentsetscore=60wherescore<60updatestudentsetscore=score+10wherescore<=90;删除数据deleteDELETEFROM表名[WHERE条件表达式]DELETEFROMstudentwherescore<=75;删除表DROPTABLE表名Android项目中操纵SQLite数据库extendsSQLiteOpenHelper(©OverrideonCreate(SQLiteDatabasedb)(db.execSQL("建表语句〃)调用SQLiteOpenHelper的getReadableDatabase()或者getWritableDatabase()获取SQLiteDatabase对象SQLiteDatabaseinsert()==>long刚插入的数据行idupdate()==>int更新的行数delete()==>int删除的行数query()==>CursorexecSQL()==>voidCursor游标查询结果集的记录指针,Cursor起初位置在第一条记录之前moveXXX(),如moveToNext()==>booleangetXXX(intindex)如getString(1)==>String2、ContentProvider敬据共享的唯一方式,数据存储在SQLiteDatabase里)query(tableName,columns,where,where,group,having,order)访问ContentProvider数据:tableName==>Uri==>类的常量或者一个字符串常量columns==>类的常量或者字符串ContentResolver:insert(),update(),delete(),query()getContentResolver()Uri初始化:Uri,parse(StringuriStr)==>UriUri字符串形式:1)协议:〃资源唯一标识字符串/资源名1)协议:〃资源唯一标识字符串/资源名/idContentUrisContentProvider中的Uri都遵循"content"协议ContentUris.withAppendedId(Uri,id)==>Uri3、Intent、Broadcast①Intent借助Intent可以startActvity(),startService(),sendBroadcast()Intent分为显式Intnet与隐式Intent:显式Intent一般用于启动自定义的Activity;隐式Intent需要借助Manifest文件中组件的<intent-filter>进行解析Intent的组成部分action==>StringsetAction()data==>Uri(Uri.parse(String))setData()category==>Activity需要Intent.CATEGORY_LAUNCHERInteger.CATEGORY_DEFAULT(默认)Intent.CATEGORY_HOMEIntent.CATEGROY_BROWSABLEextraputExtra(),getXXXExtra()flagIntent.FLAG_ACTIVITY_NEW_TASK如果在一个BroadcastReceiver中启动Activity,必须给Intent调用addFlag(),而且参数是IntentFLAG_ACTIVITY_NEW_TASKIntent传参Bundle传递参数是一个自定义class的object,要求该class必须implements接口Serializable或者ParcelableSerializable接口是一个标识性接口,不含任何抽象方法Parcelabel接口:要求实现所有抽象方法,而且必须含有一个Parcelable.Creator类型的静态域,而且名叫CREATOR]②Broadcast与BroadcastReceiversendBroadcast(intent)发送广播action==>Receiver接收,action一致BroadcastReceiver需要注册manifest.xml中注册(常驻型广播Receiver)<receiver><intent-filter><actionandroid:name="能收到的广播〃/>java代码注册(临时型广播Receiver)IntentFilteraddAction()registerReceiver(BroadcastReceiver,IntentFilter)unregisterReceiver(BroadcastReceiver);BroadcastReceiver作用:Broadcast全局事件BroadcastReceiver全局事件监听器及逻辑处理Broadcast发送方自己系统Broadcast的action4、Service服务运行在后台;启动可以通过startService(intent);Service并不单独开启线程使用:i,耗时任务;ii.Activity不在手机最前端,但是任务还要继续onCreate()==>反复执行onStartCommand()==>onDestroy()注:在Activity中启动Service,即便Activity退出,Service也可以不停止5、AlarmManager、NotificationManagerAlarmManager,TlephonyManager,SmsManager,AssetManager,AppWidgetManager,AudioManager①系统服务ManagerAssetManager(getAssetManager)==>管理项目下assets/AlarmManager,NotificationManagerSmsManagerTelephonyManager获取手机SIM卡相关信息,手机网络制式相关信息,手机呼叫状态等信息。

getLine1Number()//本机号码getSimSerialNumber()getCallState()//Idel,Ringing,OffHook(摘机)案例:BroadcastReceiver<actionandroid:name=〃ent.action.PHONE_STATE〃/><actionandroid:name=〃ent.action.NEW_OUTGOING_CALL〃/>先判断action是否是NEW_OUTGOING_CALL获取打出号码intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);获取来电号码intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);②AlarmManager全局闹钟服务,安排某些任务在将来某一时刻执行(如果设置时间是过去时间,则任务马上执行)set(inttype,longtimeMillions,PendingIntentpendingIntent)setRepeat(inttype,longtimeMillions,longinterval,PendingIntentpIntent)cancel(PendingIntentpIntent)注:cancel()时,PendingIntent的第四个参数flagId一样并且Intent的action一致。PendingIntent包装了Intent,类似于Intent的送货员,包装了Intent的目标组件以及目标组件的位置初始化三个static方法选其一,选择依据是Intent要启动的组件类别getActivity(Context,int,Intent,int)getService()getBoroadcast()第二个参数int是PendingIntent的requestCode,目前使用0第四个参数int是PendingIntent的flag标识id,自定义,建议>0NotificationManagernotify()[一般是在Receiver中设置]cancel()Notification必须设置三个属性:icon,tickerText,whenwhen属性的值一般是System.currentTimeMillions()必须调用一个方法:setLatestEventInfo()一般设置flags:Notification.FLAG_AUTO_CANCEL时间相关class:DategetTime()CalendargetTimeInMillions()System.currentTimeMillions()⑤SmsManager发送短信权限:SEND_SMSstaticgetDefault()divideMessage()sendTextMessage()

短息发送成功接收Receiver,判断if(getResultCode()==Activity.RESULT_OK)()AudioManager简介在程序获取了AudioManager对象之后,接下来就可调用AudioManager的如下常用方法:adjustStreamVolume(intstreamType,intdirection,intflags):调整手机指定类型的声音。其中第-个参数streamType指定声音类型,该参数可接受如下几个值,STHEAMLALARM;手机闹铃的声音.STREAM_DTMF;DTMF音调的声吊STREAM_MUSIC:手机音乐的声音。«STREAM_NOTIF1CATION:系统提示的声音。STREAM_RING:电话铃声的声音。STREAM_SYSTEM:手机系统的声音’STREAM_VO1CE_CALL:语音电话的声音。第二个参数指定对声音进行增大、还是减少;第三个参数是调整声音时的标志,例如指定FLAG_SHOW_Ub购指定调整声音时显示音量进度条。ad|ustStreamVolume(intstreamType,intdirection,intflags):调整手机指定类型的声音。其中第-个参数streamType指定声音类型•该参数可接受如下几个值。STREAM_ALARM;手机闹铃的声音*STREAM_DTMF;DTMF音调的声音・STREAM_MUSIC:手机音乐的声音。STREAM_NOTIF1CATION:系统提示的声音。STREAM_RING:电话铃声的声音。STREAM^SYSTEM:手机系统的声音,STREAM_VO1CE_CALL:语音电话的声音。第二个参数指定对声•首进行增大、还是减少:第三个参数是调整声音时的标志,例如指定FLAG_SHOW_Ub购指定调整声音时显示音量进度条。LocationManager位置服务LocationManager与Location经纬度LocationProviderGPS:精确度高,耗电量大,流量低NETWORK:精确度低,耗电量小,流量高LocationgetLongitude()经度getLatitude()纬度LocationListenerLocationManagerrequestLocationUpdate();Baidu控件MaPView/map/sdk-android.htm添加第三方包权限<com.baidu.mapapi.MapView...android:clickable="true”/>extendsMapActivity(privateBMapManagerbMapMan;privateMapViewmapView;privateMapViewControllercontroller;©OverrideonCreate()(bMapMan=newBMapManager(this);bMapMan.init(mapKey,null);super.initMapActivity(bMapMan);}bMapMan.start()bMapMan.stop()bMapMan.destroy()GeoPoint需要经纬度*1E6MapViewControllersetCenter()//一次animateTo()//移动到新的定位位置6.在地图上增加标识extendsOverlay(©Overridedraw()}2)mapView.getOverlays().add(YburOverlayObject)6、多媒体技术MediaPlaystaticMediaPlayercreate(intresId)//resIc是音频资源的idreset(),setDataSource(),prepare()start(),pause(),stop(),seekTo(),isPlaying()release()setLooping(),isLooping()setOnCompletionListener()监听当前歌曲播放结束注意:MediaPlayer的以上方法中,部分方法的调用有先后顺序,不能跳跃读取手机上的音频文件Audio.MediaStringalbumUriStr=〃content://media/external/audio/albumart〃;UrialbumUri=Uri.parse(albumUriStr);MediaRecorder录音(参考api)权限RECORD_AUDIO保存在sd卡上,文件扩展名是amrVideoView<activityandroid:theme=〃@android:style/Theme.Black.NoTitleBar.Fullscreen〃android:screenOrientation=〃landscape〃

setMediaController(newMediaController(context));setVideoPath()start()stopPlayBack()7、Handlerandroid规定:非主线程不允许更新主线程控件外观可以通过给主线程Activity的Handler发消息,Handler收到消息后执行更新任务Service中如果想更新控件外观,也通过Handler实现Handler:有两个对列:消息Message队列;任务Runnable队列发送消息sendXXXMessage()收到消息后执行任务©OverridehandlerMessage(Messagemsg)(//判断消息的类别(来源),然后执行相应的任务}Message:初始化:i.newii.handler.obtainMessage()四个public成员变量:intwhat:设置/获取消息类别intarg1,arg2:设置/获取整数类型参数Objectobj:设置/获取复杂类型参数8、Internet网络访问Browsei,输入url==>发出请求Request==>Server查找资源响应请求Response<==Request模式:GET与POSTGET:上传数据和url绑定在一个数据包中,格式为url?#数名=值&参数2=值&...POST:上传的数据和url分别在不同的数据包,上传数据也是需要name/value网络请求步骤网络访问权限初始化连接对象设置网络连接相关参数连接时长、读取资源时长、请求方式连接到网络如果网络响应代码是200,获取网络数据(网络输入流)Eg://2)URLurl=newURL(urlStr);HttpURLConnectionconn=(HttpURLConnection)url.openConnection();//3)conn.setConnectTimeout(10*1000);conn.setReadTimeout(10*1000);conn.setRequestMethod(〃GET〃);

//4)conn.connect();//5)if(200==conn.getResponseCode())(InputStreamis=conn.getInputStream();//如果请求的资源是文本,可以获取编码StringcontentType=conn.getContentType();Stringencode=null;if(contentType.indexOf('=')>=0)(encode=contentType.substring(contentType.indexOf('=')+1);}}网络上数据传输常用两种数据格式:xml与jsonxml文本,在使用pull或者sax方式进行解析时,是基于事件驱动的。五种事件:文档开始/结束;标记开始/结束;文本使用PULL方式解析xml数据观察xml文档,找出你要的数据;如果数据量小,直接将结果保存进变量;否则需要定义class,保存到对象或者集合开始解析初始化XMLPullParser设置解析源获取第一个事件==>文档开始事件反复读取后面的每一个事件,找出你要的数据,直到读取到文档结束事件while()SAX解析SAX是一种速度更快,更有效的方法。它逐行扫描文档,一边扫描一边解析。而且相比于DOM,SAX可以在解析文档的任意时刻停止解析,但任SAX的工作原理由融林SAX,它既是一个接口,也是一个软件包.但作为接口,SAX是事件驱动型析的一个标准接口不会改变SAX的工作原理简单地说就是对文档进行顺序扫描,当扫描到文档(document)开始与结束、元素(element)开始与结束、文档(document)结束等地方时通知事件处理函数,由事件处理函数做相应动作,然后继续同样的扫描,直至文档结束。大多数SAX都会产生以下类型的事件:1.在文档的开始和结束时触发文档处理事件。在文档内每一XM顷素接受解析的前后触发元素事件。3.任何元数据通常由单独的事件处理何事物都有其相反的一面,对于命繇域说就是操作复杂。对于解析过程中的每一步都会有事件发生,都会触发相应接口中的事件处理程序。编写程序的^^:通知主机应用程序解析错误。(1).创建事件处理程序(也就是编写ContentHandler的实现类,一般继承自DefaultHandler类,采用adapter模式)

.创建SAX解析器.将事件处理程序分配到解析器.对文档进行解析,将每个事件发送给事件处理程序SAX模型过程:首先SAXParserFactory来创建一个SAXParserFacto书?例SAXParserFactoryfactory二SAXParserFactory.newInstancef);根据SAXParserFactory^例来创建SAXParserS.SAXParserj^生SAXR的如rXMLReaderreader=factory.newSAXParserQ.getXMLReaderO;4.XMLReader加载XML,然后解析XML,在解析的过程中触发相对于接口中的事件处理程序9、WebView加载数据loadData(String,〃text/html〃,〃utf-8〃);loadUrl(url);设置支持JS,ZoomwebView.getSettings().setSupportZoom(true);webView.getSettings().setBuiltInZoomControls(true);webView.getSettings().setJavaScriptEnabled(true);设置进度条设置web内容在当前WebView中显示设置“返回”按键的动作是退回历史记录设置当前WebView所在的Activity是浏览器manifest.xml获取应用程序外部传递的urlgetIntent().getData().toString()TextView内容设置为超级连接:Stringurl=〃网址〃;Stringshow="TextView所显示的文字〃;tv.setText(Html.fromHtml(〃<ahref=\〃〃+url+〃\〃>〃+show+〃</a>〃));tv.setMovementMethod(LinkMovementMethod.getInstance());10、OnGestureListener手势监听1)extendsActivityimplementsOnGestureListener(privateGestureDetectorgesture;

©OverrideonTouchEvent(MotionEventev)(returngesture.onTouchEvent(ev);}//onGestureListener应该实现的抽象方法©OverrideonFling(MotionEventel,MotionEvente2,)(左右滑动的判定:el和e2的x值之差xl-x2>距离==>自右向左x2-xl>距离==>自左向右}extendsViewimplementsOnGestureListener(privateGestureDetectorgesture;©OverrideonTouch(MotionEventevent)(returngesture.onTouchEvent(event);}©OverridedispatchTouchEvent(MotionEventev)(if(gesture.onTouchEvent(ev))(ev.setAction(MotionEvent.ACTION_CANCEL);}returnsuper.dispatchTouchEvent(ev);};//onGestureListener应该实现的抽象方法©OverrideonFling(MotionEventel,MotionEvente2,)(左右滑动的判定:el和e2的x值之差xl-x2>距离==>自右向左x2-xl>距离==>自左向右}}11、项目中添加sdk以外的其他类库项目中创建一个文件夹,命名为libs将第三方jar文件拷贝到libs中选中该jar文件,右键:BuildPath==>AddtobuildPath然后该jar包中的class就可以在项目中被使用12、ViewPager内置有手势左右方向滑动的View切换处理需要android-support-v4.jarlayout中声明控件<android.support.v4.ViewPager.../>适配器:extendsPageAdapter*成员变量:Context,List<View>

*还要重写两个方法:instantiateItem(),destroyItem()准备数据源List<View>//添加layout:控件不需要监听器;添加Activitydata.add(LayoutInflater.from(this).inflate(R.layout.page1,null));LocalActivityManageractivityMan=newLocalActivityManager(this,true);activityMan.dispatchCreate(savedInstanceState);ViewpageView2=activityMan.startActivity(〃page2〃,newIntent(this,Page2.class)).getDecorView();data.add(pageView2);viewPager.setAdapter(adapter)ViewPager监听器setOnPageChangeListener13、AppWidget1、创建步骤:1)layout/*.xml描述AppWidget外观定义一个classextendsAppWidgetProviderres/xml/*.xml==>AppWidgetProviderInfo描述AppWidget的元数据manifest.xml注册AppWidget<receiverandroid:name=〃MyAppWidget〃><intent-filter><actionandroid:name=〃android.appwidget.action.APPWIDGET_UPDATE〃/></intent-filter><meta-dataandroid:name=〃vider〃android:resource=〃@xml/providerinfo〃/></receiver>2、AppWidget中控件所显示数据的更新,或者控件添加监听器的实现RemoteViewsAppWidagetManagerAppWidgetManagerappMan=AppWidgetMana

温馨提示

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

评论

0/150

提交评论