Android总结

 

一.ANDROID开发环境

1)如何选择开发工具:Eclips、AndroidStudio

2)如何配置开发环境:JDK、SDK、ADT、开发工具(后面的三项goole官方网站提供的Eclips已经自带了)

3)如何使用和选取模拟器、测试机。云测试:模拟器可以使用AVD和Genymotion。AVD慢但功能稳定且齐全

4)如何处理开发环境的故障:故障主要表现为ADB故障

   关于adb故障排除

   1) 通过adb devices查看设备,如果存在正常的列表,但是在eclipse中没有显示设备,则eclipse需要重启;如果没有正常显示的列表,则应该重启adb服务,即先adb kill-server,然后adb start-server,当显示adb正常启动,则表示adb正常,然后再次查看设备列表,如果adb正常却没有设备列表,则需要重新

   连接设备,或者重启模拟器

   2) 如果adb start-server始终无法正常启动,则应该通过netstat -ano查看5037端口的使用情况,并结合任务管理器终止占用了5037端口的进程,然后再次启动adb服务

 

二、ANDROID的项目基础

1)如何创建ANDROID项目:Ctrl+N

2)ANDROID的项目结构:

src:程序的源代码

gen:自动生成的文件(有R文件,Aidl文件)

lib(s):放Jar包(如v4)

bin:生成最后的adk应用程序

asset:来存放应用程序必须要用的某些特殊的文件,如美团的定位城市的数据库

res:drawable:存图片,存selector

layout:布局文件和item  

还可以设置横屏和竖屏:Landscape和Portrait

        menu:

values:关于配置的strings.xml,color.xml,styles.xml

       values-sw600dp  :放配置(不用管)

AndroidManifest.xml:清单文件

package  包名,在一个设备上包名唯一

uses-sdk  放版本号

uses-permission  权限

application     放安卓的4大核心组件

<privider  exported=true(ContentProvider必须设置这项)>

project.properties:打包成adk时要用到它,存放指定android版本中的最高版本(如17)

3)ANDROID的项目启动流程:

检索AndroidManifest.xml文件找到入口Activity,启动对应的Activity,根据Activity

的生命周期,会执行onCreate(),在onCreate()执行过程中,根据setContentView()方法的参数,决定要加载的布局layout

从而决定该应用程序的显示

三、ANDROID的常用基础控件及事件监听

1)TextView  

gravity:left|center

 

2)ImageView

 scaleType="fitXY"

 

 

3)Button

onClick

4)EditText

hint  :inputType="text,number,numberPassword"

 

5)LineraLayout

6)RelativeLayout

layout_alignParentRight(4

layout_alignBottom(4与某控件的上下左右对齐

layout_below  toRightOf(4)     在某控件的上下左右 layout_centerHorizontal Vertical InParent(3

 

7)Toast 的显示时长由手机的操作系统决定

 

四、ANDROID的复合显示控件

1)ListView

Divider,去除底纹

2) GridView

GridView是一种以“网格”的形式显示数据的AdapterView,实现GridView的显示流程与使用ListView相同

关于GridView的配置属性:

android:numColumns:列的数量,即每行显示多少条数据

android:horizontalSpacing:水平的间距

android:verticalSpacing:垂直的间距

android:stretchMode:拉伸模式

使用GridView的注意事项:

通常GridView中的每个item的尺寸应该是相对固定的.

3)ArrayAdapter

   

ArrayAdapter用于每个item只有1个文本的数据显示

使用List或者数组做为数据源的Adapter

ArrayAdapter不是抽象的,可以直接创建对象

ArrayAdapter的泛型通常是String使用ArrayAdapter时,可以使用android.R.layout.???资源,无须自定义item,除非你认为这些资源不足以满足你的需求

如果需要自行定义ArrayAdapter的item(模板),请保证item的布局中,TextView是根节点

* 使用ArrayAdapter仅仅适用于ListView中的每个item只显示1个字符串

 

4)SimpleAdapter/SimpleCursorAdapter

SimpleAdapter可以完成绝大部分不需要过于自定义的数据显式

SimpleAdapter是一个普通的类,可以直接创建对象

  构造方法:SimpleAdapter(Contextcontext, List<? extends Map<String, ?>> data, int resource,String[] from, int[] to)

 

5)BaseAdapter

BaseAdapter用于高度自定义的数据显示

开发步骤:

1) 设计ListView

2) 准备数据源,即List<? extends Map<String,?>>类型的数据

3) 设计item(模板)

4) 在程序中创建各个对象(ListView、data、adapter……),并为ListView配置Adapter(setAdapter)

五、ANDROID的其它控件和显示内容

1)DatePicker、TimePicker

CalendarViewshown 是否显示日期

StarYear , endYear 日期区域设定

2)ViewSwitcher、TextSwitcher、ImageSwitcher

ViewSwitcher

1. 2个子级控件之间切换显示

2. 切换过程中支持动画

ViewSwitcher继承自FrameLayout,其子级控件应该有且仅有2个,通常,可以使用setFactory(ViewFactory factory)方法以实现子级控件的自动添加,而不需要显式的调用addView(View child)方法

通过ViewSwitcher对象的getCurrentView()可以获取当前正在显示的View对象,通过getNextView()可以获取下一次将可显示的View对象(当显示时,2个View对象轮流扮演“当前”和“下一个”的角色)

通过ViewSwitcher的showNext()方法可以显示下一个控件

通过ViewSwitcher的setInAnimation()和setOutAnimation()可以设置控件的进场动画和出场动画

 

通过程序代码创建View对象

所有的View类(包括View的各子孙类)都有带Context context参数的构造方法,用于通过程序代码创建View对象

所有的View对象都应该配置该控件的宽度与高度,可以通过setLayoutParams()方法进行配置,其参数类型为LayoutParams,需要注意的是,在导包时,LayoutParams的外部类类型取决于当前View对象的父级控件,例如该View对象将被添加到LinearLayout中,则应该使用LinearLayout.LayoutParams

TextSwitcher

TextSwitcher是ViewSwitcher的子类,专门用于2个TextView切换显示

ImageSwitcher

ImageSwitcher是ViewSwitcher的子类,专门用于2个ImageView切换显示

由于ImageSwitcher固定用于显示图片,所以提供了setImage???()方法,这些方法会自动调用showNext()方法以显示下一个ImageView,因此,开发者不需要显式的调用showNext()方法

3)ViewPager

4)Dialog

 

5)Menu(Options Menu/Context Menu)

  1)系统菜单

    创建系统菜单:

      1、重写Activity的 onCreateOptionsMenu方法

         调用menu对象的add方法添加菜单项

      2、定义menu资源

         重写Activity的onCreateOptionsMenu方法

         根据menu资源扩充菜单   

    系统菜单的单击事件处理

      重写Activity的 onOptionsItemSelected方法

 

  2)上下文菜单

   创建上下文菜单

     为事件源对象设置OnCreateContextMenuListener监听器

   上下文菜单的单击事件处理

     重写Activity的onContextItemSelected方法

     注意:

       如果上下文菜单事件的事件源是AdapterView对象

       则,可以将上下文菜单项(MenuItem)的

       getMenuInfo方法的返回值强制转换为       AdapterContextMenuInfo

 

Menu(菜单类)

 MenuItem add(CharSequence title)

 MenuItem add(int groupId,int itemId,

              int order,CharSequence title)

 MenuItem add(int titleRes)

 MenuItem add(int groupId,int itemId,

              int order,int titleRes)

 

ContextMenu

 ContextMenu setHeaderIcon(int resId)

 ContextMenu setHeaderTtile(CharSequence title)

 MenuItem add(CharSequence title)

 MenuItem add(int groupId,int itemId,

              int order,CharSequence title)

 MenuItem add(int titleRes)

 MenuItem add(int groupId,int itemId,

              int order,int titleRes)

MenuItem(菜单项)

 MenuItem setIcon(Drawable d)

 MenuItem setIcon(int resId)

 MenuItem setEnable(boolean enable)

 ContextMenuInfo getMenuInfo()

6)RadioGroup、RadioButton、CheckBox

radioGroup.getCheckedRadioButtonId()//得到当前被点击控件的id;

radioGroup.chick(R.id.);设置id被点击

7)SeekBar、ProgressBar、RationgBar(淘宝的评星级)

SeekBar是可以拖拽的水平的进度条,SeekBar继承自ProgressBar,普通使用方式与一般的水平进度条相似

通过配置OnSeekBarChangeListener可以对SeekBar的进度改变、拖拽事件进行监听

ProgressBar是显示进度的控件ProgressBar配置了style="?android:attr/progressBarStyleHorizontal"时表示水平的进度条,或者其它有Horizontal字样的样式也可以,如果缺省,或者配置为其它的style属性,则表示圆圈类型的进度条,圆圈类型的进度条没有“刻度”的概念

ProgressBar的核心属性:

style:样式

android:max:进度条的最大“刻度”

android:progress:当前进度

8)Notification

 

六、4个核心组件

 

ANDROID中的进程的优先级

优先级从高到低:

1) 前台进程(完全可见的进程)

2) 可见进程(局部可见的进程)

3) 服务进程

4) 后台进程(完全不可见的进程)

5) 空进程

1)Activity

Activity的生命周期

当Activity被激活时:onCreate() -> onStart() -> onResume()

当Activity被销毁时:onPause() -> onStop() -> onDestory()

当新的Activity被激活时:原来的Activity先onPause(),当新的Activity已经完全激活(显示在前台)时,原来的Activity会onStop()

当遮挡A_Activity的B_Activity被销毁时:A_Activity被重新显示,会经历:onRestart() -> onStart() -> onResume()

显式的调用finish()方法会导致onDestory()被回调

Activity的状态

1) 运行状态:处于前台的Activity

2) 暂停状态:被非全屏的Activity遮挡后,原来的Activity处于暂停状态

3) 停止状态:当Activity被置于后台(例如被其它Activity完全遮挡,或者用户按下HOME键回到桌面)

4) 终止状态:当Activity被销毁(调用了Activity的finish()或者用户按下BACK键,表现为onDestory()被执行)

Activity的启动模式(launchMode)

在AndroidManifest.xml中,可以为每个Activity配置不同的启动模式

1) standard:【默认】标准的,每次都会激活一个全新的Activity

2) singleTop:当Activity位于任务栈的顶部时,是唯一的

3) singleTask:在任务栈中是唯一的,如果当前Activity在任务栈中不存在,则直接创建,

并获取栈顶位置,如果当前Activity已经在任务栈中存在,则清除任务栈中该Activity上方的所有Activity,并且让该Activity自然获得栈顶位置

4) singleInstance:Activity独自占有另外一个任务栈,且该栈中仅有这1个Activity

正确的理解Activity的启动模式,可以更加简便有效的管理Activity,并掌握Activity的任务栈

Activity的启动模式与Activity的taskAffinity相关

startActivityForResult方法:

 1、当前Activity启动目标Activit,并接受目标Activity的返回值

 2、工作原理:

  1)当前Activity在启动目标Activity时使用     startActivityForResult方法

  2)在目标Activity中,结束前调用setResult方法设置返回值

     setResult(int resultCode)

     setResult(int resltCode,Intent data)

     如果目标Activity返回前未调用setResult方法设置返回值

     则默认返回RESULT_CANCELED

  3)当目标Activity结束后,返回到源Activity,并回调源          Activity中的onActivityResult方法,将返回值回传

 3、相关的Activity方法:

   startActivityForResult(Intent inetnt,intrequestCode)

   onActivityResult(int requestCode,

                    int resultCode,Initentdata)

   setResult(int resultCode)

   setResult(int resltCode,Intent data)

2)Service

Service是ANDROID系统的核心组件之一,由ANDROID系统进行管理和维护,所有自定义的Service都必须继承自android.app.Service类,并且必须在AndroidManifest.xml文件的<application>节点下声明它Service是没有用户界面的,适合用于在后台(看不到的)长期的默默的执行程序

注意:Service尽管适合用于长期执行,但是,它仍然是运行在主线程的,所以,耗时操作需要在Service中开启子线程来执行

Service的生命周期

使用startService(Intentservice)可以激活Service组件,在通过该方法激活的Service中,会经历的生命周期:

1) onCreate()

2) onStartCommand()

3) onDestory()

可以反复的调用startService()激活同一个Service组件,但是,该Service组件只会创建1次,后续的反复激活只会重新经历onStartCommand()

通过stopService(Intentintent)可以停止Service,在Service内部,也可以通过stopSelf()方法停止当前Service

 

Service的粘性

使用startService(Intentservice)激活的Service组件默认是粘性的,表现为:被意外终止后,会自动的重启(onCreate() -> onStartCommand())

在Service中,onStartCommand()方法的返回值决定了它的粘性:

Service.START_NOT_STICKY:非粘性的

Service.START_STICKY:粘性的

Service.START_STICKY_COMPATIBILITY:兼容的粘性的【默认】

Service.START_REDELIVER_INTENT:粘性的,并且重启Service时会重新传递Intent

绑定模式激活Service

绑定Service是通过bindService()方法激活Service组件的方式

通过绑定Service,可以实现其它组件(例如Activity)可以直接调用Service组件中的方法

绑定模式的Service的生命周期:

onCreate() -> onBind()-> onDestory()

在Service中的onBind()方法的返回值不可以为null,否则绑定将不成功,在Activity端的ServiceConnection中的方法不会被回调,在Activity端也不可能得到有效的IBinder对象

 

onServiceDisconnected()

在ServiceConnection中的onServiceDisconnected()将在绑定意外断开时被回调,正常断开绑定并不会回调该方法

 

onRebind()

在Service中的onRebind()方法表示“当重新绑定”时会回调的方法,该方法通常不会被回调,因为只有“绑定 -> 断开 -> 绑定”才是重新绑定,但是“断开”时Service将被销毁,导致第2次“绑定”到新的对象,则不会是“重新绑定”

如果要实现“重新绑定”,则应该先通过startService()激活Service组件,然后通过bindService()绑定相同的Service组件,当再次断开时,由于没有调用stopService(),则该Service不会被销毁,下次再次绑定时即为“重新绑定”

3)BroadcastReceiver

BroadcastReceiver是ANDROID系统的核心组件之一,开发人员自定义的广播接收者需要继承自BroadcastReceiver。

调用ContextWrapper类定义的sendBroadcast(Intent intent)方法可以发送广播,当广播发送后,全设备所有正在运行的广播接收者

,在匹配Intent的action等属性时,都可以接收到该广播,并且进行处理

注册广播接收者

注册广播接收者可以使用静态注册和动态注册

1) 动态注册

在程序中,通过registerReceiver()注册广播接收者,当注册成功后,对应的广播接收者就可以开始接收指定的广播,最后,当程序退出之前,应该通过unregisterReceiver()取消注册广播接收者

动态注册具体方案

BroadcastReceiver可以使用“动态注册”的方法,实现组件的注册,具体的实现注册方法是:

1) 调用ContextWrapper类定义的registerReceiver(BroadcastReceiverreceiver, IntentFilter filter)方法注册

2) 自行创建receiver对象

3) 初始化filter对象,并调用filter.addCategory(Intent.CATEGORY_DEFAULT);,并且通过filter.addAction(String

 action)添加该广播接收者可以接收的广播

当注册广播接收者的组件(Activity或者Service)被销毁时,应该通过unrgisterReceiver(BroadcastReceiverreceiver)方法取消注册

 

2) 静态注册

在AndroidManifest.xml中的<application>节点下,添加<receiver>节点,通过配置android:name属性指定广播接收者的类,并且在<receiver>节点下添加<intent-filter>节点,然后在更下级添加<action>节点,通过配置<action>节点的android:name属性指定该广播接收者可以接收的广播,所有静态注册的广播,一旦应用程序安装到设备中,无论该应用程序是否处于运行状态,都会始终接收广播

无序广播和有序广播区别

无序和有序的主要区别在于:广播接收者们是否会按照一定的顺序接收到广播

无序广播(普通广播)是通过sendBroadcast()发送的广播

有序广播是通过sendOrderedBroadcast()发送的广播

 

有序广播的接收者们的接收顺序

通过配置IntentFilter的priority可以设置各个广播接收者的优先级,priority的值越高,则优先级越高,则更加优先接收到广播

动态注册广播接收者时,通过IntentFilter对象的setPriority()方法配置,静态注册时,为<intent-filter>节点配置android:priority属性即可

官方推荐priority值不超过1000,实际开发时,为了抢占优先级,可以使用Integer.MAX_VALUE

当多个广播接收者的priority值相同时,动态注册的广播接收者的优先级高于静态注册的广播接收者

如果多个动态注册的广播接收者的priority值相同,先注册的先接收,后注册的后接收

如果多个静态注册的广播接收者的priority值相同,则根据各广播接收者所在的应用程序的包名进行排序

 

如何让广播接收者尽量获取更高的优先级

1) 指定最大值的priority

2) 可行的情况下,设置排序可以更靠前的包名

3) 使用静态注册的方式,接收“系统开机”的广播,并且在接收到该广播后,使用动态注册的方式注册广播接收者

 

有序广播的拦截

在广播接收者处理广播时,调用abortBroadcast()可以终止广播向后继续传递,则会导致优先级更低的广播接收者不会收到该广播

 

有序广播的篡改

在有序广播的传递过程中,可以通过setResult???()配置数据,优先级更低的广播接收者可以通过匹配的getResult???()获取这些数据,甚至进行篡改,而后续的接收者会收到篡改后的数据

4)ContentProvider

ContentProvider是ANDROID系统的核心组件之一,用于向其它应用程序提供自身的数据的访问方式(可以包含增删改查),与其它系统组件相同,ContentProvider需要实现与系统的ContentProvider的继承关系,并且需要在AndroidManifest.xml文件中注册,注册时,除了android:name属性外,还必须配置android:authority属性,在偏高版本的ANDROID系统中,还需要配置android:exproted和android:enabled属性,均需要设置为true

其中,android:authority属性是该ContentProvider的“网址”,在全设备中应该是唯一的,其值也是其它的访问者对数据进行访问时必要的参数之一

ContentResolver

ContentResolver是访问ContentProvider的工具,通过ContextWraaper定义的getContentResolver()方法可获取其对象

ContentResolver中也定义了一整套访问ContentProvider中的数据的方法,例如:insert()、update()、delete()、query()

UriMatcher

UriMatcher是一个快捷的验证Uri是否匹配的工具,常用方法:

UriMatcher(int):构造方法,参数通常使用UriMathcer.NO_MATCH,表示验证Uri时,如果不匹配,则返回该值

addUri(Uri, String, int):添加匹配规则,其中,参数3表示将进行验证时,如果匹配,则返回该int值

match(Uri):验证Uri,如果匹配,则返回addUri()时的参数3,如果不匹配,则返回构造方法的参数

七、ANDROID的存储方案

1)偏好设置SharedPreferences

实例化:

  activity对象的 getPreferences(int mode)

  context对象的  getSharedPreferences(Stringname,int mode)

  PreferenceManager.getDefaultSharedPreferences

                                          (Context ctx)

 主要方法:

  Editor edit()

  int getInt(String key,int defaultValue)

  ...

 

Editor

 put(String key,boolean value)

 put(String key,int value)

 put(String key,float value)

 put(String key,String value)

 put(String key,Set<String> value)

 remove(String key)

 commit()

2)内部文件存储

文件存储方式是一种较常用的方法,在Android中读取/写入文件的方法,与Java中实现I/O的程序是完全一样的,提供了openFileInput()和openFileOutput()方法来读取设备上的文件。

3)内部缓存

4)外部文件存储

5)外部缓存

6)SQLite数据库

7)网络存储

 

八、ANDROIDDE的线程间通信

在ANDROID系统中,可以依赖Handler和Message实现线程间的通信,这种机制也被称之为消息机制

Handler:用于发送和处理Message,在主线程中创建的Handler默认是运行在主线程的,所以,使用Handler可以控制各个控件的显示

 

1)UI线程模型

2)消息机制

Message:消息的载体

发送消息:使用Handler对象的sendMessage(Message msg)方法发送消息

接受消息:不需要开发者考虑

处理消息:自定义类继承Handler,并重写public void handleMessage(Message msg)方法,决定如何处理消息

在消息(Message)中封装数据:可以使用Message的int arg1、intarg2、Object obj属性封装数据

 

关于Message对象

Message类有公有的无参数的构造方法,开发者可以随意创建Message对象,但是,Message对象大多是被处理后就没有存在的意义了,所以反复创建Message对象会无谓的消耗内存

推荐使用Message.obtain()方法获取消息的对象,Message类自身使用了“Message池”对消息对象进行管理,从而可以控制产生的Message对象的数量

如果使用的Message.obtain()方法中,使用到了Handler做为参数,则需要使用Message对象的sendToTarget()发送消息,而不再使用Handler的sendMessage()系列方法

Message的what属性用于标识消息的类型(因为子线程可能向主线程发送若干种不同的消息),不应该用于封装有具体数值含义的数据,通常,what属性的值应该使用静态常量表示,

例如msg.what =MESSAGE_UPDATE_CLOCK;

通过Handler对象的obtainMessage()系列方法也可以获取Message对象,其实现效果与Message类的obtain()方法是等效的

 

Handler.Callback

 

使用Handler.Callback接口的实现类对象,做为Handler构造方法的参数,也可以实现对消息的处理【推荐】

Handler.Callback定义了public boolean handleMessage(Message msg)方法,其中,返回值(boolean类型)表示“是否已经完全处理了消息”

,当返回值为false时,如果存在其它的消息处理方法,则对应的代码也会被执行,当返回值为true时,表示“已经完全处理了消息”,则其它的处理消息的代码不会运行

 

关于处理消息的方式

1) 使用Message.obtain(Handler h, Runnable callback)中的Runnable对象处理消息

2) 使用Handler.Callback处理消息

3) 重写Handler类的handleMessage()处理消息

以上3种方式可以并存,优先级为1 -> 2 -> 3

当存在第1种方式时,消息将直接被处理,并且不会向后传递

当第2种方式存在时,其public boolean handleMessage(Message msg)方法的返回值决定消息是否向后传递

3)其它的在子线程中更新UI的方法:runOnUiThread()

AsyncTask(异步任务)

AsyncTask是一个抽象类,通常需要自定义类,继承自AsyncTask,在继承时,需要指定3个泛型的数据类型,

分别表示:执行任务时所需要的参数的数据类型、执行任务过程中如果需要更新进度,表示进度的数据类型、执行任

务完成之后,结果的数据类型。

部分任务可能不需要以上3种中的某些数据类型,通常使用Void类型进行标识。

AsyncTask是一个自动在子线程执行任务,并且自动实现了在主线程对进度和结果更新的一个异步任务类,开发者只

需要将不同的代码重写在不同的方法即可。

例如:doInBackground()方法会自动开启子线程执行,而onPostExecute()方法则自动运行在主线程,所以,开发

者不需要考虑线程间通信的问题。

使用AsyncTask可以更好的将同一个任务的所有代码集中管理。

AsyncTask的执行特性是一把双刃剑,当存在多个AsyncTask时,所有的As遹ncTask会依据启动的顺序依次执行,

而并不会存在多个任务的多个子线程同时运行的状况

如果需要使用AsyncTask更新进度,则,在doInBackground()中,需要更新进度时,使用publishProgress()方法

提交进度,

并在AsyncTask中重写onProgressUpdate()方法用于处理提交过来的进度

九、网络通信

1)基于TCP的编程

2)基于HTTP的编程

HTTP协议

超文本传输协议,使用HTML(Hyper Text Meta Language)编写的文件即为常见的“网页”,HTML是一门预定义的标签,因此,在编写HTML文档时,需要参考已定义的标签的特性。

部署tomcat服务器

1) 下载tomcat,并解压缩

2) 配置环境变量,变量名为JAVA_HOME,变量值为jdk目录的位置

3) 打开cmd窗口,切换到tomcat目录下,并打开bin目录,执行startup即可

4) 在tomcat的webapps下,创建新的文件夹(推荐使用英文、数字命名),并且将需要通过HTTP提供共享的文件存放在该文件夹中,例如*.html文件

 

访问tomcat服务器

打开浏览器,输入 http://主机:端口号

本机使用 localhost 或 127.0.0.1

某些早期版本的浏览器,在输入网址时,如果指定端口号,则必须显式的在网址中包括 http://

如果需要访问自己的相关资源,则输入 http://主机:端口号/路径/资源名

其中,路径表现为在tomcat的webapps下创建的文件夹名称,资源名表现为具体的文件的文件全名(如果文件存在于自定义的文件夹下更子级的文件夹中,则需要补全各级文件夹名称)

 

HTTP的访问模式

类似“聊天”案例中的CommonServer与客户端的通信,是由客户端发送访问的“请求”,当服务器接收到以后,对客户端进行“响应”的过程,当服务器完成响应后,通信过程结束。

请求:Request

响应:Response

HTTP的请求区分为GET请求和POST请求,GET请求会将请求的参数暴露在网址中,并且网址的长度是有限的,不适合传输大量的数据;而POST请求会将请求参数封装以后再发送,并不会暴露出来,而且使用POST请求可以传输更多的数据。

 

使用HttpUrlConnection访问HTTP服务器

1) 声明HttpUrlConnection对象

2) 初始化网址(String)

3) 根据网址(String)创建URL对象

4) 调用URL对象的openConnection()方法建立与HTTP服务器的连接,并发送请求,该方法返回UrlConnection对象,可以强制转换为HttpUrlConnection

5) 通过HttpUrlConnection对象的getInputStream()方法可以接收到服务器响应的数据流,再通过对流的处理即可获取到有效数据

6) 在实现访问后,还可以通过HttpUrlConnection的其它方法获取相关数据,例如getContentLength()方法可以获取响应的数据的长度

7) 在结束访问后,调用HttpUrlConnection对象的disconnect()方法断开连接,以释放资源。

 

关于HTTP的响应码

通过HttpUrlConnection连接HTTP服务器时,可以通过getResponseCode()方法获取响应码

HTTP的响应码是3位的数字,并且以1~5作为数字的百位数,不同的百位数表示不同的意义

以1为百位数:

以2为百位数:正确的响应,例如:200正确的相应  206 对于区间段的相应码

以3为百位数:

以4为百位数:请求错误,通常可以理解为错误的原因在于客户端,例如404

以5为百位数:服务器端错误

使用HttpClient实现HTTP访问

1. HttpClient,是访问HTTP的工具,类似于浏览器,用于发送请求,并且获取响应结果,HttpClient是接口,需要创建对象,可以直接创建DefaultHttpClient的对象,HttpClient通过execute()方法,将HttpGet或HttpPost对象作为参数,以发送请求,并且,得到HttpResponse对象,作为响应结果

2. HttpGet,是HTTP访问的GET请求对象,通常,使用Http(String ri)创建其对象

3. HttpResponse,是HTTP访问的响应结果对象,通过该对象的getStatusLine().getStatusCode()方法,以获取响应码,通过该对象的getEntity()方法,可以获取HttpEntity对象,即响应的实体对象

4. HttpEntity,是HTTP响应结果的实体,通过getContent()方法可以获取响应的InputStream,通过getContentLength()方法可以获取响应的数据长度

5. EntityUtils,是HttpEntity的工具类,提供了静态的toString(HttpEntity entity)方法,用于将响应的正文直接返回字符串,通常用于访问结果是文本数据的访问过程,例如访问HTML页面、XML文件等,需要注意,该方法执行完毕后,即意味着已经通过Http响应的InputStream将所有数据全部读完了,则连接将断后,该连接就不再可用,如果仍需要继续使用,则需要再次重新连接

十、其它知识点

1)Fragment

Fragment表示“碎片”,可以简单的理解为Activity的某一部分,或者是更小号的、并且存在于Activity内部的Activity。

 

ViewPager+FragmentAdapter+Fragment+layout

1. 当前Activity类的父类修改为FragmentActivity

2. 自定义类继承自Fragment类,重写onCreateView()方法,并加载layout布局

3. 声明并初始化ViewPager

4. 自定义类继承自FragmentPagerAdapter,并重写其中的抽象方法,其中,getItem(int position)用于根据不同的position值得到不同的Fragment对象

5. 通过FragmentActivity的getSupportFragmentManager()方法可以获取FragmentManager对象,用作FragmentPagerAdapter类的构造方法的参数

6. 为ViewPager配置FragmentPagerAdapter

Ps. Fragment类与Context并没有直接关系,如需要使用Context,则可以使用getActivity()方法,获取当前承载Fragment的Activity对象

十一、自定义控件

自行创建新的Java类,继承自原有的某个View,即为自定义View,在自定义View中,可以对继承得到的方法进行重写,或者扩展。

当继承自某个View后,自定义需要至少显式的声明某个构造方法,在ANDROID系统中,View类没有无参数的构造方法,而声明了3个带参数的构造方法,其中,带1个参数的构造方法用于在Java程序使用new ???()语法创建控件的对象,带2~3个参数的构造方法用于在res\layout下使用XML设计布局

十二、第三方控件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值