Android学习笔记(二)

六大布局
FrameLayout GridLayout LinearLayout RealativeLayout TableLayout AbsoluteLayout
FrameLayout
帧布局中,容器为每个加入其中的控件创建一个空白的区域(称为一帧)。每个控件占据一帧,这些帧会按


gravity属性执行自动对齐。
帧布局的效果是将其中所有的控件都叠在一起
常用属性:
top       顶端对齐
bottom    底端对齐
fill_vertical 垂直方向填充
fill_horizontal 水平方向填充


GridLayout
GridLayout布局使用虚细线将布局分为行、列和单元格,支持一个控件在行、列上交错排列
XML属性          说明
columnCount     设置一行的最大列数
orientation     设置布局方向 


Spinner控件
Spinner是现实列表框的控件,Spinner控件通过下拉选项的方式可以达到节省屏幕空间,又能从多个选项中进行选


择的目的。
常用属性:
Prompt 列表框选项的提示
entries 使用数组资源设置下拉框的内容


Switch控件
Switch是Android4.0提供的控件,功能相当于CheckBox,weight用户提供了更加友好的操作体验
textOn  被选择时的文本
textOff  不被选择时的文本
checked: true:被选择
示例代码:
<Switch
android:text="电玩"
android:textOn="on"
android:textOff="off"
/>






Activity类
Activity类用户管理一个屏幕,该类通过Java代码制定res/layout中的xml文件作为屏幕的显示内容。
Activity类位于android.app包下,该类继承树:
Object->Context->ContextWrapper->ContextThemeWrapper->Activity


Activity类的常用方法
1.setContentView(int resId)
作用:设置Activity显示的布局
2.onCreate(Bundle savedInstanceState)
作用:该方法在Activity的实例被Android系统创建后第一个被调用。通常在该方法中设置屏幕显示的布局、初始


化数据、设置控件被点击的事件响应代码。
3.View.findViewById(int resId)
作用:在serContentView()设置的布局文件中查找控件标签,以此来创建该控件的Java对象。
参数:resId:xml布局文件中控件的值
返回View类型的对象
提示:必须先执行setContentView(),设置Activity的布局文件,然后执行findViewById,从布局文件中查找控件
4.void finish()
关闭当前的Activity


TextView类的常用方法
1.public Editable getText()
作用:返回Editable对象
提示:通过Editable对象的toString(),可以获得TextView的text属性值
2.public void setText(String text)
作用:设置text的值
3.public void setVisibility(int visiblity)
作用:设置可见性:View.GONE 不可见并且不占屏幕位置
4.public void setTextSize(float size)
作用:设置字号,单位:px
5.public void setTextColor(int color)
作用:设置字体颜色
6.public void setBackground(int color)
作用:设置背景颜色
7.public void setGravity()
作用:设置内部字体对齐方式
8.public void setError(Charsequence text)
作用:显示错误信息
示例:
tv.setError("出错啦");


ImageView类的常用方法
1.public void setImageResource(int resId);
作用:设置ImageView显示的图片


RadioButton类的常用方法
1.Boolean isChecked();
作用:返回该控件是否被选中,若选中则返回值为true,否则为false
2.public void setChecked(Boolean checked)
作用:设置复选框控件是否打钩
3.public void setOnClickListener(OnClickListener I)
作用:注册控件单击事件


CheckBox类的常用方法
1.Boolean isChecked();
作用:返回该控件是否被选中
2.public void setChecked(Boolean checked)
作用:设置复选框控件是否打钩
3.public void setOnCheckedChangeListener(OnCheckedChangeListener listener)
作用:注册复选框控件选择/未选择发生改变的事件


OnCheckedChangeListener接口
概述:该接口负责监听CheckBox等控件的选中状态
常用方法:
void onCheckedChanged(Compound buttonView,boolean isChexked);
作用:监听空间选中状态的变化
参数说明:
(1)buttonView:被点击的控件对象
(2)isChecked:若控件处于选中状态,值为true,否则为false


RadioGroup类的相关方法
常用方法:
public void onCheckedChanged(RadioGroup group,int CheckId)
作用:响应该控件内的CheckBox控件的选择发生改变的事件
参数1group:当前的RadioGroup控件对象
参数2:打钩控件的索引
说明:该方法与CheckBox控件的事件同名,但位于不同的包下。


Toast
Toast类用于显示字符串,在开发过程中测试时可以用来代替日志输出调试信息,也常用于给用户简短的提示
常用方法:
1.makeText(Context context,Charsequence msg,int duration);
说明:第三个参数是显示消息的持续时间,单位是毫秒,有两个预定义的常量值
Toast.LENGTH_LONG:持续3-4秒
Toast.LENGTH_SHORT:持续2-3秒


ProgressBar是UI中非常实用的控件,类名:ProgressBar,用于动态显示某个比较耗时的操作的进度,可避免因操


作时间长,降低用户体验。
XMl属性
max                            设置进度条的最大值
progress                       设置已完成的进度值
secondaryProgress              设置第二进度条
progressDrawable               设置进度条的轨道的绘制方式
progressBarStyle               设置进度条样式
progressBarStyleHorizontal     水平进度条样式
progressBarStyleLarge          大进度条样式
progressBarStyleSmall          小进度条样式


progressBar的Style有如下值:
horizontal                     水平进度条
inverse                        不断跳跃,旋转的进度条
large                          大进度条
large.inverse                  不断跳跃、旋转的进度条
small                          小进度条
small.Inverse                  不断跳跃、旋转的小进度条
以上Style属性值前面都要加上如下的前缀
@android:style/Widget.ProgressBar.


SeekBar控件
拖动条控件,允许用户通过拖动滑块来改变值。
SeekBar是ProgressBar的间接子类,因此SeekBar的属性参见ProgressBar属性列表
OnSeekBarChangeListener接口
该接口负责监听SeekBar的滑动
常用方法:
1.void onProgressChanged(SeekBar seekBar,int progress,bool fromUser)
参数:当前的SeekBar对象
参数:滑块的进度值
参数:用户是否拖动了滑块
2.void onStartTrackingTouch(SeekBar seekBar)
作用:开始移动滑块时,触发本方法执行,滑块移动中本方法不再被触发
3.void onStopTrackingTouch(SeekBar seekBar)
作用:结束移动滑块时,触发本方法
 
Android事件处理机制
一、匿名内部类实现OnCLickListener接口
实现机制
通过匿名内部类实现OnCLick接口
适用于代码没有复用性的地方


二、内部类实现OnCLickListener接口
实现机制
在Activity类中定义内部OnCLickListener接口
适用于监听器具有复用性,并且项目较大时,方便代码的管理


三、Activity类实现OnCLickListener接口
适用于按钮较多,但每个按钮的响应代码较短


四、外部类实现OnCLickListener接口
适用于监听器具有复用价值。有利于代码的混淆。


Intent类
Intent类是Android组件间的桥梁。该类负责启动组件,在组件之间传递数据
创建Intent对象
方式一:Intent intent=new Intent(起始组件的对象,目标组件类.class)
方式二:Intent intent=new Intent()
intent.setClass(起始组件的对象,目标组件类.class)
方式三:获取上一个Activity传递过来的intent对象
        Intent intent=getIntent();
常用方法:
1.putExtra(key,value);
作用:一键值对形式在intent对象那中保存数据
2.putExtra(key ,(Seriazable()obhect))
作用:若存放的是对象,则要间对象序列化在存放数据
3.getIntExtra(key ,int DefaultValue)
作用:获取存放在intent对象中的键为key的int类型的数据。若获取不到,则附一个默认值
3.getDoubleExtra(key,doubleValue)
作用:获取存放在intent对象中的键为key的double类型的数据。若获取不到,则附一个默认值
4.getString(key)
5.getSerilizable(key)
.....


获取目标Activity的返回值
概述:当从本Activity跳转至目标Activity,有时需要目标Activity返回一些结果,这是需要调用Activity中的相


关方法进行处理
相关方法:
1.public void startActivityForResult(Intent intent,int requestCode);
作用:启动目标Activity,并要求目标Activity返回处理结果
参数一:requestCode:该数据称为请求码,又能与目标Activity返回结果识别启动的位置
说明:有可能丛原ACtivity中的多个地方启动目标Activity,因此请求码用来识别启动的位置
2.onActivityResult(int requestCode, int resultCode, Intent data);
3.setResult(int ResultCode,Intent intent);在目标Activity中


Bundle类
概述:Bundle类用于Activity之间的数据传递,以及在Activity状态切换时用于保存Activity的数据
Bundle通过键值对的方式存取数据。查看Intent类的源码发现:Intent类中有一个名为mExtras的成员变量,该变


量的类型是Bundle
Intent类中的putExtra方法实质上是将数据放在了mExtras对象中
Intent类将Bundle对象的存取数据进行了包装,简化了数据存取的操作
常用方法:
1.public void clear()
作用:清除此Bundle中的所有数据
2.getString getString(String key)
作用:返回指定key的字符串
3.public void putString(String key,String value)
作用:存放键为key的字符串值 
4.public void remove(String key)
作用:移除指定key的值
5.public void putXXX(String key,xxx value)
作用:存放基本类型数据的值
6.public void putSerializable(key, Object value)
作用:存放(序列化之后)对象
7.public void putxxxArray(key, array Value)
作用:存放元素是基本类型的数组




Intent类中相关方法
1.public void putExtras(Bundle bundle)
作用:将bundle对象保存在Intent对象中
2.public Bundle getExtras()
作用:从Intent对象中获取Bundle对象




保存Activity数据的回调方法
onSaveInstanceState(Bundle outState)
outState.putString(key,value);
恢复的时候从savedInstanceState中拿出来
恢复方法
onRestoreInstanceState(Bundle savedInstanceState)


Intent进阶
Android的组件设计启动,体现了弱耦合的关系,各组件之间的通过Intent传递数据和每个组件之间都最大程度的


保持独立性。某个组件的修改,不会影响其他组件。避免了“牵一发,动全身”的现象出现
Intent类的成员变量
1.mComponent:ConponentName类型,指定组件间跳转的原组件和目标组件的包名,用于显式意图
2.mAction:String :表示启动的动作
3.mCategory:String:表示启动组件的类别
4.mData:该参数是Uri类型,存放操作的数据,如访问网址,打电话等
Uri类 Uri.parse(String strUri);
Uri的结构
scheme://host:port/path------协议名://主机名:端口号/数据的路径和值
5.mType
格式:大类型/小类型
   mType= "audio/mp3"


跨应用启动另外的Activity只能使用隐式意图


隐式意图总结:
1.同一个Intent Filter可以有多个category
2.category除DEFAULT外都是或的关系
3.若data和type属性要同时设置,则应调用setDataAndType()


ListView控件
一、概述:
Android中,列表行控件是数据源为数组或集合的控件
列表类型的控件有ListView,GridView,Gallery,Spinner
列表型控件支持适配器模式显示数据
二、AdapterView类
(一)概述
AdapterView是ViewGroup的子类,由一个适配器和绑定到适配器的数据集组合而成。当需要在Android的View中显


示数组或集合数据时,AdapterView是非常有用的。
ListView、GridView、Gallery和Spinner是AdapterView的子类,这些View的数据源是数组或集合,并且用一种特


定的方式来显示这些数据
AdapterView对象有两个主要的功能
1.用数据填充视图
2.处理用户的操作事件
(二)AdapterView的继承图
Object-java.lang
 View-android.view
  ViewGroup-android.view
   AdapterView<T>-android.widget
    AbsListView-android.widget
     GridView-android.widget
     ListView-android.widget
      ExpandableListView-android.widget
   AbsSpinner-android.widget
    Gallery-android.widget
    Spinner-android.widget


提示
1.AdapterView的addView不被支持
2.AdapterView需要一个Adapter对象为其提供item
(三)、BaseAdapter类
(一)概述
AdapterView通过Adapter(适配器类)象AdapterView的子类视图填充数据,BaseAdapter是所有适配器的基类。该类


是抽象类。
(二)适配器的继承树图
Object-java.lang
 BaseAdapter-android.widget
  ArrayAdapter<T>-android.widget
  CursorAdapter-android.widget
  SimpleAdapter-android.widget
(三)常用方法
1.public View getView(int position,View convertView,ViewGroup)
作用:创建并返回列表项,包括列表项的显示样式和数据,Android根据getView返回的对象绘制列表项
说明:
参数1:position当前列表项在列表的索引值
参数2:convertView当前列表项的View对象
参数3:parent列表项的父容器对象-列表对象
提示:该方法是抽象方法
2.public long getItemId(int position)
作用:返回当前列表项的索引值
参数position:当前列表项的索引值
提示:该方法是抽象方法
3.public Object getItem(int position)
作用:返回当前列表项对象
参数:position当前列表项的索引值
提示:该方法是抽象方法
4.public int getCount()
作用:返回列表对象总数,Android系统根据getCount()返回的值绘制指定数量的列表项
提示:该方法是抽象方法
说明:返回数组的总长度,该数组的长度也就是列表项的个数
四、ListView控件
(一)概述
ListView是Android应用程序中使用频率最高的控件。该控件使用垂直列表的方式显示多个选项,特别适合于手机


这种屏幕较小的设备
ListView控件的特点:每个列表独占一行,每行的布局都相同,数据和布局分离,支持数据来自适配器,ListView
只负责布局。
说明:
ListView是AdapterView的间接子类,支持适配器填充数据
ListView就是一个容器,可以包含Item(Child)
(二)常用属性:
XML属性                          说明
choiceMode                     设置ListView的选择方式,有三个值
                                1.none:默认方式
                                2.SingleChoice:单选
                                3.multipleChoice:复选
divider                        设置列表项的分隔条,分隔条可以是颜色值亦可以是图片
dividerHeight                  分隔线的高度值
entries                        设置显示的内容,该内容是字符串数组
(三)常用方法
1.Object getItemAtPosition(int position)
作用:获得当前列表项
参数position:当前列表项的索引值 
2.void setChioceMode(int choiceMode)
作用:设置列表的选择方式
参数choiceMode有以下三个可选值:
ListView.CHOICE_MODE_NONE
ListView.CHOICE_MODE_SINGLE
ListView.CHOICE_MODE_MULTIPLE
(四)ListView的使用步骤
1.创建布局文件,在该布局文件中声明ListView控件
2.创建第二个布局文件,在该文件中为ListView的Item设置显示样式
3.在Activity中实例化ListView
4.获取数据集,即创建需要在ListView中显示的数据
5.创建适配器对象
6.设置ListView对象与步骤5创建的适配器相关联
说明:
Android的AdapterView采用MVC模式显示、处理数据,其中以上的1,2是View层,负责设置显示的样式,4是


Module层,创建需要显示的数据,5是控制层,用于将数据显示在View中,并负责对数据的增删改的操作。
五、View.inflate()
public static View inflate(Context context,int resource,ViewGroup root)
作用:将一个布局文件实例化为一个View类型的Java对象
参数context:当前的Activity对象
参数resource:布局文件的id值
参数root:该布局需要方式在哪个容器对象中。若无则设置为null。


OnItemClick接口
(一)概述
OnItemClick接口负责监听列表项点击事件
(二)常用方法
void OnItemClick(AdapterView<?>parent,View view,int position,long id)
作用:监听用户点击列表项的事件
说明:
参数parent:当前列表对象,如ListView对象
参数view:被点击的列表项对象
参数position:被点击的view在适配器中的索引值
参数id:被点击的列表项在列表中的索引值
position与id之相同


OnItemLongClick接口
(一)概述
OnItemLongClick接口负责监听用户长安列表项的事件
(二)常用方法
public boolean onItemLongClick(AdapterView<?>parent,View view,int position,long id)
作用:监听用户长按列表项事件
返回:返回true表示本方法处理了长按事件,该事件不会分发给其他控件处理
      返回false,则本次长按事件换回分发给其他控件处理。
说明:长按是指触摸控件的时间超过0.5秒


SimpleAdapter
一(概述)
SimpleAdapter是BaseAdapter的子类。用该适配器可定义表现丰富的信息,例如在ListView列表项中显示带文字和


图片的信息
二构造方法
SimpleAdapter(Context context,List<? extenes Map<String,?>>data,int resource,String[]from,int []to)
参数说明:
1.第一个参数context:上下文参数,该参数与ArrayAdapter类的构造方法的第一个参数相同。
2.第二个参数data:一个List类型的集合,该集合的元素是Map类型,改map集合的键是String类型,值是任意类型


,每个map对象都存放一个列表项的信息
3.第三个参数resource:是布局文件的资源索引值,该布局控制列表项的显示样式
4.第四个参数from:一个字符串类型的数组,该数组存放着所有键名,就是存放列表项的Map对象出现的键。
5.第五个参数to:存放列表项的布局文件中出现的所有控件的资源索引值


ArrayAdapter类:数组适配器类,该类负责将数组或集合的数据按指定布局方式显示,通过与ListView等控件相关


联,在列表类型的控件按指定布局样式显示数组或集合的数据
说明:
1.ArrayAdapter的内部的数据一维数组或list集合
2.其返回的item中必须包含一个TextView控件,数组中的每个元素将被绑定到TextView控件上显示
(二)创建ArrayAdapter对象
ArrayAdapter<T>(Context context,int layoutRes,int textViewId,T[]data)
参数context:上下文对象
参数layoutRes:item界面对应的layout布局文件
参数TextViewId:item中包含的TextView的id
参数data:需要显示的数据集,可以是数组,也可以是集合
ArrayAdapter<T>(Context context,int layoutRes,T[] data)
参数context:上下文对象
参数layoutRes:item界面对应的layout布局,且该布局的根标签应当是TextView或TextView的子类
参数data:需要显示的数据集
ArrayAdapter.createFromResource(Context context,int arrayRes,int layoutRes)
参数context:上下文对象
参数arrayRes:数组资源
参数layoutRes:item界面对应的layout布局,且该布局的根标签应当是TextView或TextView的子类对象


Spinner控件
(一)概述
Spinner是显示列表框的控件。Spinner是AdapterView的间接子类,所以它也是个容器型的View,该控件可以通过


适配器对象来显示数据,基改View的每个列表项可以用布局来设置,布局中可以包含若干控件
(二)常用属性
entries                   使用数组资源设置下拉列表框的内容
spinnerMode               下拉列表的风格,有以下两种:
                           1.对话框风格 dialog2.下拉列表风格dropdown
prompt                    Spinner下拉列表的提示标题,该属性使用时注意以下两点:
                           1.该标题的文本必须在strings.xml中定义为字符资源,然后再prompt中使用
                           2.只有spinnerMode属性值是dialog时,prompt才会起作用


(三)常用方法
setOnItemSelectedListener(OnItemSelectedListener listener)
作用:Spinner列表项选择发生改变的响应事件,参数是OnItemSelectedListener接口的一个实例
说明:
OnItemSelectedListener接口,负责监听列表项发生改变的事件,该接口中定义了两个方法:
void onItemSelected(AdapterView<?> parent,View view,int position,long id)
参数parent:列表对象
参数view:列表项对象
参数position:列表项在适配器中的索引值,位置值从零开始计算
参数id:列表项的索引值。一般情况下,第三第四个参数的值是一致的。
void nothingSelected(AdapterView<?>parent)
作用:未发生选择时,触发本方法
参数parent:当前列表对象
(四)相关方法
void setDropDownViewResource(int Resource)
作用:ArrayAdapter类中的方法,用于设置列表下拉后的布局
参数resource:布局文件的资源索引值
说明:
1.Android为下拉选框提供默认的布局,也可根据业务需求自定义布局。
2.与Spinner绑定的ArrayAdapter要用以下的方式创建:
ArrayAdapter<CharSequence>adapterMonths=ArrayAdapter.createFromResource


(this,R.array.months,android.R.layout.simple_item)
参数context:上下文对象
参数:下拉列表中显示的数据
参数:下拉列表的布局


GridView组件
(一)概述
GridView控件称为网格列表,在Android中的使用频率较高,该控件可按多行多列显示信息,表现能力很强。


(二)常用属性
属性名                   Java的方法                   作用
columnWidth              setColumnWidth (int)         设置列宽度
gravity                  setGravity(int)            设置对齐方式
horizontalSpacing        setHorizontalSpacing(int)    设置各元素之间的水平间距
numColumns               setNumColumns(int)           设置列数
stretchMode              setStretchMode(int)          设置拉升模式
verticalSpacing          setVerticalSpacing(int)      设置各元素间的处置间距
其中,stretchMode有以下可选的值
NO_STRETCH                        不拉升
STRETCH_SPACING                 仅拉伸元素之间的间距
STRETCH_SPACING_UNIFORM          表格元素本身、元素之间一起拉升伸
STRETCH_COLUMN_WIDTH             仅拉伸表格元素本身
(三)常用方法
1.public void setAdapter(Adapter adapter)
作用:设置与适配器对象相关联
说明:
参数adapter适配器对象,如ArrayAdapter,BaseAdapter等
2.public void setOnItemClickListener(Context context)
作用:设置列表项单击事件
说明:context是一个上下文对象
3.public boolean setItemLongClickListener(Context context)
作用:设置列表项的长按事件
参数context:上下文对象


Gallery控件
(一)概述
Gallery控件与spinner类相似,都是AbsSpinner类的子类。它们之间的区别在于:Spinner显示的是一个垂直列表选


择框,而Gallery显示的是一个水平列表选择框,并且Gallery允许用户水平拖动列表框
ListView是垂直列表,Gallery可以理解为是水平列表
(二)常用属性
XML属性         相关方法                        说明
Gravity          setGravity(int)             设置对齐方式
Spacing          setSpacing(int)           设置列表项之间的间距
unselectedAlpha  setunselectedAlpha(float)   设置为选中的列表的透明度
(三)重要接口、方法
1.OnItemClickListener接口:监听列表项单击事件。该接口定义了如下方法
2.void onItemClick(AdapterView<?>parent,View view,int position,long id)
作用:响应用户单击列表项的事件
参数说明:
parent:当前的Gallery对象
view:被单击的列表项
position:被单击的列表项在适配器中的位置(索引值)
id:被单击的列表项在列表中所在列的索引值
3.void setOnItemClickListener(OnItemClickListener listener)
作用:设置响应用户单击事件的方法
参数说明:listener实现了OnItemClickListener


对话框控件
一、概述
对话框是UI设计中常用的控件,在Windows操作系统中,对话框可分为模式对话框和非模式对话框。模式对话框在


使用时,项目中其他UI是不允许操作的,如保存文件对话框。非模式对话框允许操作其他的UI
Android的对话框模式是非模式对话框,但可以设置为模式对话框。
Android提供了丰富的对话框功能,并且允许自定义对话框。以下介绍其中应用最为广泛的,功能最为丰富的


AlertDialog控件。
1.带消息和多个按钮的对话框
2.带列表和按钮的对话框
3.带单选列表项和按钮的对话框
4.带复选列表项和按钮的对话框
二、常用方法
1.public void show()
作用:启动并显示对话框
2.public void dismiss();
作用:取消对话框
3.public void setCancelable(boolean cancelable)
作用:设置是否允许返回键关闭对话框
参数值为true,允许返回键关闭对话框
三、内部类
Builder类是AlertDialog类的内部类,用于创建对话框
(一)常用属性
AlertDialog.Builder类中常用的属性
XML属性                        说明
icon                           对话框图标
title                          对话框标题
message                        对话框中显示的消息文本
(二)常用方法
1.Builder setPositiveButton(Charsequence text,final OnClickListener listener)
作用:为对话框创建带有确定意义的按钮并返回AlertDialog.Builder类的对象
参数text:按钮的标题
参数listener:单击事件的接口的实现类对象
提示:
OnCLickListener接口所在包是:android.content.DaiLogInterface。
SetPositiveButton()创建的按钮代表具有确定意义的按钮,如标题为OK、确定等
2.public Builder setNegativeButton(CharSequence text,final OnClickListener listener)
作用:创建具有否定、cancel标题的按钮,并返回一个AlertDialog.Builder对象。
提示:Android的一个对话框最多可以创建三个按钮
3.Builder setNeutralButton(CharSequence text,final OnClickListener listener)
作用:创建具有忽略意义的按钮,并返回一个AlertDialog.Builder对象
4.public Builder setIcon(int resId)
作用:为对话框设置图标,参数是图标的资源索引值
5.public Builder setTitle(int resId)
  public Builder setTitle(Charsequence text)
作用:设置对话框标题,参数可以是字符串,也可以是资源中定义的字符串
6.public Builder setMessage(int resId)
  public Builder setMessage(Charsequence text)
作用:设置对话框中显示的消息,参数可以是字符串,也可以是资源中定义的字符串
7.public Builder setCacncelable(boolean cancleable)
作用:设置对话框模式为模式对话框,并且不允许Back键关闭对话框
8.public Builder setView(View view)
作用:设置view代表的布局为对话框的内容
9.AlertDialog create()
作用:创建并返回AlertDialog类型的对话框对象
四、标准对话框
(一)直接new
//以下创建一个带有按钮的对话框并显示该对话框
new AlertDialog.Builder(this).setIcon(R.drawable.Icon)
.setMessage("hello world")
.setTitle("Dialog")
.setPositiveButton("Confirm",null)
.show();
说明:以上new了一个对话框对象,参数this是当前Activity对象。创建之后,可以立即使用setIcon、setTitle、


setMessage等方法设置对话框的图标、标题、按钮等,最后要调用show()放法创建对话框并显示。
(二)创建并保存在对象中
Builder builder=AlertDialog.Builder(this);
builder.setIcon(R.drawable.Icon);
builder.setMessage("hello world");
builder.setTitle("Dialog");
builder.setPositiveButton("Confirm",null);
AlertDialog dialog=builder.create();
dialog.show();
说明:
第一行的Builder实质上就是AlertDialog.Builder
第五行设置按钮的第二个参数是null,表明该对话框的这个按钮事件没有监听事件的功能,即这个按钮只是摆个样


子。该处可以写成匿名内部类。
(五)自定义对话框
(一)概述
自定义对话框允许用XML文件设置的布局作为对话框的显示内容和显示样式
(二)实现步骤
步骤1.定义用于对话框的内容、显示样式的布局文件
步骤2.用布局解析器解析步骤1的XML文件为一个View对象
步骤3.创建对话框对象,并调用addView()设置步骤2的View对象为对话框的显示内容、样式。
(三)示例
步骤1、在res/layout下创建input_dialog.xml文件.
步骤2、解析步骤1中定义的布局文件为一个View对象。示例代码:
LayoutInflater  inflater=LayoutInflater.from(this);
view=inflater.inflater(R.layout.input_dialog,null);
步骤3、通过view.findViewById()实例化该布局文件中用于输入数据的控件对象。示例代码:
EditText etInput=(EditText)view.findViewById(R.id.etInput);
步骤4、创建对话框对象,并将步骤2中的View对象设置为对话框的显示内容和样式。示例代码:
Builder builder=new AlertDialog.Builder(this);
builder.setView(view);
AlertDialog dialog=builder.create();
builder.show();
六、DialogInterface接口
(一)概述
该接口是对话框接口,定义了与对话框按钮相关的常量
(二)常用的常量
以下是该接口中常用的常用:
public static final int Button_POSITIVE=-1;
public static final int BUTTON_NEGATIVE=-2;
public static final int BUTTON_NEUTRAL=-3;
这三个常量分别代表setPositiveButton、setNegativeButton、setNeutralButton这三个按钮在对话框中的索引值
(三)内部接口
OnClickListener();
作用:监听用户单击对话框中的按钮事件
该接口定义了一个方法
void onClick(DialogInterface dialog,int which)
作用:监听用户单击对话框按钮的事件
说明:第一个参数Dialog:当前的对话框对象
第二个参数which:被单击按钮的索引值
七、列表对话框
(一)概述
AlertDialog提供了多种风格的对话框,列表对话框其中一种
重要方法:
setItems(Charsequence[]items,final onClickListener listerner)
作用:创建并显示列表对话框,并返回AlertDailog.Builder类的对象。
第一个参数Items:存放菜单中个菜单项标题的数组。
第二个参数listener:菜单项单击事件


ListView进阶
(一)ListView的运行机制
1.使用match_parent定义ListView的高度和宽度属性
   使用ListView控件的高度和宽度要避免使用wrap_content,否则会导致BaseAdapter.getView重复调用N次。尽量


使用match_parent或固定值设置height或width。
2.缓存列表项
   ListView控件在设计上采用了只创建并显示当前屏幕中的列表项的布局对象(该布局对象由


BaseAdapter.getView方法的convertView参数保存)。例如:一屏显示是个列表项(包括部分显示在屏幕上的列表


项),则只创建十个convertView,ListView会反复使用这十个convertView显示进入当前列表项的内容。
在向上滚屏时,当第一个convertView移出屏幕,该convertView将从屏幕下边出现。同理,在向下滚屏时,若屏幕


最下边的convertView移除屏幕,该convertView从最上边进入屏幕。
提示:一屏不一定显示是个列表项,具体多少根据列表项布局的高度和设备的高度而定。
因此,在BaseAdapter.getView中,不用每次创建布局对象,而是采取每次判断convertView是否为空,若为空,则


创建布局对象。若convertView不为空,说明当前屏幕所需的所有布局对象均以创建好,此时将保存的布局对象取


出,然后显示新的数据。
那么,布局对象中包含的各个控件如何与当前的convertView建立对应关系呢?
当然可以每次通过findViewById()方法获取布局中的控件,但由于findViewById()需要在xml文件中遍历查找控件


,所以这样做做效率不高。
高效率的做法是将每次convertView的所有控件也保存起来,以后取出来显示新数据即可。下面是两个View类中的


方法。
(二)View.setTag()与View.getTag()
1.setTag(Object obj)
作用:将obj对象的地址保存在当前View对象的mTag成员变量中。
2.Object getTag()
作用:从当前View对象中mTag成员变量中取出保存的对象,返回Object类型
 用以上两个方法将当前的convertView中的所有控件保存在一个对象中,然后将该对象与当前的convertView相关


联。


线程通信与网络客户端编程
一、Handler类
(一)概述
在Android中Handler类可用于在线程间收发消息。
例如:handler在工作线程中发送消息,该消息发送至消息队列中,等待处理。在主线程中Handler从消息队列中接


收消息,并根据消息中的信息决定如何更新UI。
每个Handler实例都会绑定到创建它的线程中。
Handler可以发送消息或Runnable值某个线程的消息队列中。
(二)构造方法
1.public Handler Handler();
无参构造方法
2.Handler(Looper looper)
作用:带参构造方法,用于创建Handler对象。将自定义的用于管理消息队列的looper对象放在Handler.mLooper成


员变量中。
参数looper:自定义的管理消息队列的对象。
3.Handler(Callback callback)
作用:带参构造方法,创建Handler对象
参数:callback:自定义的用于处理消息的对象,该对象必须实现Handler.Callback接口。
说明:
1)Callback接口中声明了handleMessage()方法,程序员在该方法中编写处理消息的代码。
2)callback保存在Handler.mCallback成员变量中。在handler处理消息时将调用mCallBack中封装的代码。
4.Handler(Looper looper,CallBack callback)
作用:带参构造方法,创建Handler对象
参数:参见2和3中关于looper和callback的说明
(三)常用方法
1.sendEmptyMessage(int what)
作用:从work thread(工作线程)向主线程发送空消息
参数:当多个线程向主线程发送消息,what用于区别不同的线程
2.sendMessage(Message msg)
作用:从workThread向主线程发送消息
参数msg:存放消息的数据对象
3.handleMessage(Message msg)
作用:接收并处理从work thread发送的消息
参数msg:sendMessage发送过来的消息对象
4.public final Boolean android.os.Handler.post(Runnable r)
作用:将一个实现了Runnable的任务对象发送中目标线程的消息队列中。
二、线程通信进阶:
1.Android系统提供了一个Looper类的对象(循环队列)用来管理消息队列,各线程通过Handler类的Send***Message


命令将消息发送至消息队列,Loop而再将消息队列中的消息依次交给主线程处理。
2.Handler在创建时必须关联到一个Looper对象,如果未明确关联到某个looper,则默认关联到其创建时所在线程


的looper,因此Handler发送的Message对象都发送至Looper管理的消息队列中。
3.Looper与UIThread相关联,因此Looper将消息队列中取出的Message交给UI线程执行。
4.Handler及时消息的发送者,也是消息的处理者。
提示:默认情况下,工作线程中没有消息队列和Looper对象。


三、Message对象
(一)概述
Message类用于存放消息中的数据,该类通常与Handler类配合使用
(二)常用属性
1.int arg1:存放一个int类型的数据
2.int arg2:存放一个int类型的数据
3.int what:存放一个int类型的数据,该数据表示信息的类型,用来区别其他消息
4.Object obj:存放任意类型的对象
(三)常用方法
1.public Message()
作用:无参构造方法,创建Message对象
2.public static Message ontain()
从全局中返回一个新的Message实例。在大多数情况下这样可以避免分配新的对象。
说明:
在Java中,创建和销毁对象是比较消耗资源的。如果在应用中需要频繁创建销毁某个类型的对象,这样会产生很多


临时对象,当失去引用的临时对象较多时,虚拟机会进行垃圾回收(GC),CPU在进行GC是会导致应用程序的运行得不


到响应,从而导致应用的响应性降低。
资源池就是用来解决这个问题的,当需要使用对象的时候,从资源池中获取,资源池负责维护对象的生命周期。
Android的资源池中存放一定数量的同样类型的对象,当程序需要使用时,可以从资等待源池中获取,使用完成,


收回资源池等待下一次被使用。
示例:从资源池中获取Message对象
Message msg=Message.obtainMessage();
提示:若之前没有创建过Message,则创建给对象。Android系统会在适当时候回收该对象,方便下次调用。


四、Looper类
(一)概述
Android应用程序是消息驱动的,Android系统提供了消息循环机制。Android通过Looper、Handler来实现消息循环


机制,Android消息循环是针对线程的(每个线程都可以有自己的消息队列和消息循环)。
Android系统中Looper负责管理线程的消息队列(Message queue)个消息循环。
(二)重要方法
1.public static Looper.prepare();
作用:创建Loop而对象和MessageQueue(消息队列)对象。并将Looper对象与当前线程关联起来。
2.public static Looper.getMainLooper();
作用:获得主线程的Looper对象。
3.public static Looper.myLooper();
作用:获得当前工作线程的Looper对象。
4.public static Looper.loop();
作用:进入消息循环,Looper对象不断地从消息队列中获取信息交给与其关联的线程执行这些消息。
(三)Looper运行机制
Looper负责管理线程的消息队列和消息循环,Looper不能用new来实例化,而是要用Looper.prepare()实例化。
Android中每个线程都可以(但不是必须)跟着一个Looper,Looper可以帮助线程维护一个消息队列,每个线程可以存


在一个消息对列和一个消息循环(Looper),特定线程的消息只能分发给本线程,不能进行进行跨线程通讯。但是创


建的工作线程是没有消息循环和消息队列的,如果想让该线程具有消息对列和消息循环,需要在线程中首先调用


Looper.prepare()来创建消息队列,然后调用Looper.loop()进入消息循环。如下例所示:
Looper.prepare();//创建消息队列
myLooper=Looper.myLooper();//获得当前线程中的Looper对象
Looper.loop();//进入当前线程的消息循环
一个Activity中可以创建多个工作线程,如果这些线程把它们的消息放入主线程消息队列,那么该消息就会在主线


程中处理了。以为主线程一般负责界面的更新操作,所以这种方式可以很好的实现Android界面更新。
其他线程通过Handler对象将消息放入主线程的消息队列。只要Handler对象由主线程的Looper创建,那么调用


Handler的sendMessage等方法,会把消息放入主线程的消息队列。并且在主线程中调用Handler的handleMessage方


法来处理消息。
不管是主线程还是工作线程,只要有Looper的线程,别的线程就可以向这个线程的消息队列中发送消息和计划任务


,然后做相应的处理。
Handler对象在创建时,可以再构造方法中带参数,也可以不带参数。若用无参构造方法创建,则Handler在所在的


线程中工作。
若用带参的构造方法创建,则按参数在指定的线程中工作。
四、Android中的网络客户端编程
(一)概述
Android中的HTTP编程与Javase中的HTTP编程的基本相同,区别在于:
1.Android4要求所有的网络读写操作必须放在工作线程中执行。
2.更新UI的代码在UI线程中完成。


一、共享首选项-SharedPreferences
(一)概述
有些应用需要保存配置信息,如是否打开音效开关、登录时是否保存上次输入的用户名、密码等。Android对这类


应用提供了SharedPreferences(共享首选项),共享首选项适合数据量少、数据已键值对的方式保存的应用。
(二)常用类/接口
1.SharedPreferences接口
作用:该接口定义了共享首选项操作的方法和一个重要的内部接口:Editor
2.Editor接口
作用:该接口定义了存储、删除数据的方法。
(三)常用方法
1.context.getSharedPreferences(String fileName,int mode)
作用:创建SharedPreference接口的实现类的对象
第一个参数fileName:指定共享项数据保存、读取的文件名。该文件存放在data/data/packageName/Shared_prefs


文件夹下。通过eclipse中的DDMS视图中的file-explorer视图可以找到当前项目中的以上文件夹。默认文件名:类


名.xml。
第二个参数mode:共享首选项文件的存取权限。通过以下常量设置:
MODE_WORLD_PRIVATE :私有属性,只有本项目才能存取第一个参数指定的.xml文件。
MODE_WORLD_READABLE:允许其他项目读取本项目中的xml文件内容
MODE_WORLD_WRITEABLE:允许其他项目向本项目中的xml文件写数据
2.共享首选项的文件存储的相关方法
(1)Editor.putInt(String key,int value);
作用:存放键名为key的int类型的数据
(2)Editor.putFloat(String key,String value)
作用:存放键名为key的float行数据
。。。。。
(3)Editor.remove(String key)
移除键名为key的键值对
(8)Editor.commit();
作用:提交修改,保存结果
提示:只有执行了本方法,以上的put方法存储才能真正有效。
3.共享首选项的文件读取的相关方法(以下方法均从属于SharedPreference接口的实现类)
(1)int getInt(String key,int defValue)
作用:获取键名是key的int类型的数据,若没有key,则可以设置一个默认值:defValue.
(2)Boolean getBoolean(String key,Boolean defValue)
作用:获取键名是key的Boolean类型的数据,若没有key,则可以设置一个默认值:defValue
(3)long getLong(String key,float defValue)
作用:获取键名是key的long类型的数据,若没有key,则可以设置一个默认值:defValue
(四)共享首选项的使用步骤
1、保存数据步骤
步骤1-实例化共享首选项对象
SharedPreferences sp=getSharedPreferences("profile",MPDE_PRIVATE);
步骤2-创建编辑对象
Editor editor=sp.edit();
步骤3-添加数据
editor.putXXX();
步骤4-保存数据
Editor.commit();
2、读取数据步骤
步骤1-实例化首选项对象
SharedPreferences sp=getSharedPreferences("profile",MODE_PRIVATE);
步骤2-读取数据
Object value=sp.getXXX();


AndroidIO编程
(一)概述
当需要存取复杂的、大量的数据是需要IO流操作。Android在Context类中提供了存取文件的方法。
(二)常用方法
1.InputStream openFileInput(String fileName)
作用:读取指定文件名的文件
参数fileName:当前项目下data/data/projectPackage/files文件夹下的fileName文件
2.OutputStream openFileOutput(String fileName,int mode)
作用:存储数据至指定文件名,其中第二个参数有以下四个常量值:
(1)MODE_PRIVATE :设置文件属性为私有,即只能被当前项目读写
(2)MODE_APPEND:以添加方式打开文件,并向文件中添加数据
(3)MODE_WORLD_READABLE:该文件可被其他项目读取
(4)MODE_WORLD_WRITEABLE:该文件可被其他项目写入
3.File getFileDir()
作用:创建并返回文件的默认存储目录(data/data/包名/files)
示例:获取当前项目的默认文件路径并在日志窗口输出
File file=getFilesDir();
sysout(file.getAbsolutelyPath());
4.File getCacheDir()
作用:创建并返回默认的缓存目录(data/data/包名/cache)
示例:获取默认的缓存目录,并在日志窗口中输出
File cache=getCacheDir();
sysout(cache.getAbsolutelyPath());
5.File getDatabasePath(String dbName)
作用:返回指定数据库文件的保存路径(data/data/包名/databases/dbName)
File db=getDatabasePath("user.db")
sysout(db.getAbsolutelyPath());
6.File getDir(String dir ,int mode)
作用:创建并返回指定名称的目录(data/data/包名/app_dir)
示例:获取指定名称的路径并输出
File dir=getDir("abc",MODE_PRIVATE);
sysout(dir.getAbsolutelyPath());
7.InputStream getAsserts.open();
作用:获取执行assert目录中文件的输入流
示例:从项目中的assert文件夹下读取1.jpg
InputStream is=getAsserts().open("1.jpg");
8.File getExternalCacheDir()
作用:创建并获取程序在sdcard中的缓存目录/mnt/sdcard/Android/data/包名/cache
示例:获取项目在SD卡的缓存目录并输出
File cache=getExternalCacheDir();
sysout(cache.getAbsolutePath());
9.File getExternalFilesDir(type)
作用:创建并获取本程序中指定类型的文件,在sdcard中的目录(mnt/sdcard/Android/data/包名/files/目录名



示例:
File musics=getExternalFilesDir(Environment.DIRECTORY_MUSIC);
sysout(musics.getAbsolutePath());
(三)Environment类
1.概述
提供访问环境变量的类
2.静态方法
1).getDataDirectory()
作用:返回data目录
2).getRootDirectory()
作用:返回system目录
3).getDownloadCacheDirectory()
作用:返回cache目录
4).getExternalStorageDirectory()
作用:返回sdcard根目录
5)getExternalStoragePublicDirectory()
作用:返回sdcard中指定类型文件的公共存储目录
6).getExternalStorageState()
作用:返回当前的sdcard状态
3.常量
DIRECTORY_MUSIC  音乐存放的标准目录
DIRECTORY_MOVIES 电影存放的标准目录
DIRECTORY_DOWNLOADS 存放下载文件的目录
MEDIA_MOUNTED        存储媒体是否已挂载,并且是否具有读写权限
MEDIA_UNMOUNTED      存储媒体无法挂载


三、从资源中获取图片
(一)概述
许多情况下,图片资源从网络、SD卡登出获取,并在程序中显示,因此涉及到图片的加载。Android提供了相关的


API可方便地处理图片的读取以及读取中的优化操作。
(二)BitmapFactory类
该类是一个工具类,提供了大量操作Bitmap对象的方法
(三)加载图片称为内存中Bitmap的对象
1.public static Bitmap decodeByteArray(byte[]data,int offset,int length)
作用:从字节数加载一个位图对象
参数data:存放图片的字节数组
参数offset:偏移量,从数组的offset起始位置加载图片
参数length:从数组中加载数据的长度
2.public static Bitmap decodeFile(String pathName)
作用:从文件加载位图对象
参数pathName:文件的路径
3.public static Bitmap decodeResource(Resource res,int id)
作用:从资源加载位图对象
参数res:Resources类的对象
参数id:图片的资源索引值
4.public static Bitmap decodeStream(InputStream is)
作用:从输入流加载位图对象


SQLite数据库
(一)概述
SQLite是一款轻型的数据库,其设计目标是嵌入式,目前已经在很多嵌入式产品中使用。
SQLite占用资源非常低,在嵌入式设备中,可能只需要几百k的内存就够了
SQLite能够支持Windows/Linux/Unix等主流的操作系统,同时能够跟很多程序语言相结合,比如C#,PHP,Java等


,还有ODBC接口,与MySQL等开源数据库相比,SQLite的执行效率比他们都高。
Android和IOS使用的数据库都是SQLite.
(二)SQLiteDatabase类
1.概述
该类提供了对SQLite数据库的增删改查的操作
2.常用方法
1.execSQL(String sql)
作用:用该方法并结合SQL语句对数据执行增删改操作
参数sql:SQL命令的字符串
2.execSQL(String sql,String[]args)
作用:执行SQL语句中的数据库的增删改操作
参数args:字符串数组,当第一个参数有占位符时,第二个参数用实际数据填充占位符。若没有占位符,则args的


值设置为null。
3.long insert(TABLE_NAME,String nullColumnHack,ContentValues contentValues);
作用:添加记录
参数TABLE_NAME:表名
参数nullColumnHack:若插入的数据是空行,则本参数必须设置为null
参数contentValues:Map类型的数据,每组键-值对代表一列及其该列的数据。可以存放多个键值对数据,代表需


要插入的一行数据。
示例:向当前数据库的 person 表插入一行记录,该行包括字段 name 和 phone 的数据,
代码如下: 
ContentValures values=new ContentValues();//创建可存操作键-值对的对象 
values.put(“name”,”张三”);//存放姓名数据 
values.put(“phone”,”11315577889”);//存放电话数据 
//实例化SQLiteDatabase对象 
SQLiteDatabase db= this.getWritableDatabase(); 
db.insert(“person”,null,values);//插入values 中保存的数据 
4.int delete(TABLE_NAME,String where,String []whereValue)
作用:删除记录。
参数TABLE_NAME:表名
参数where:删除的条件,相当于SQL语句中的where部分的SQL命令
参数whereValue:符合where的数据。
示例:
delete("person","personId=?",new String[]{"1"});
5.int update(TABLE_NAME,contentValues,String where,String[]where)
作用:更新记录
参数TABLE_NAME:表名
参数contentValue:Map类型的数据,每组键值对代表一列及其该列的的数据
参数where:更新的条件,相当于SQL中where部分的SQL命令
参数whereValue:符合参数where的数据。该值是String{}类型的数组
示例:更新当前数据库的person表中,personId=1的记录
ContentValues values=new ContentValues();
values.put("name","李四");
values.put("phone","13133313135");
SQLiteDatabase db=this.getWritableDatabase();
db.update("person",values,"personId=?",new String[]{"1"});
6.Cursor rawQuery(String sql,String []selectionArgs)
作用:执行待占位符的SQL查询,返回的结果存放在Cursor对象中
参数sql:查询的SQL命令
参数selectionArgs:查询的条件数据
提示:(1)若SQL中没有占位符,则第二个参数为null
      (2)对数据表进行变更操作时,使用execSQL,对数据表进行查询时,使用rawQuery方法
7.Cursor query(table,projection,selection,selectionArgs,groupby,having,orderby)
cursor:返回值类型,返回查询结果游标对象
table:String,要查询的列名
selection:String,查询条件
selectionArgs:String[] 为selection 中的?补值的数组。 
groupby : String,分组列的列名。 
having:String,分组在查询的条件。 
orderby:String 排序列的列名。 
8.Context.openOrCreateDatabase(String dbname,int mode)
作用:打开数据库,若数据库未创建则创建数据库
参数mode:访问权限,有以下常量选择:
1.MODE_PRIVATE   不允许其他应用程序访问本数据库
2.MODE_WORLD_READABLE 允许其他应用程序读本数据库
3.MODE_WORLD_WRITABLE  允许其他应用程序写本数据库
4.MODE_APPEND  若数据库存在,则允许向数据库中添加数据


ContentValue类
1.概述 
contentValues类包装了HashMap类,该类用于存取键值对,每一个键值对表示一列和该列的数据。
2.常用方法:
(1)ContentValues()
作用:无参构造方法,创建一个内部成员变量为HashMap<String,Object>的对象。给成员变量名为mvalues.
2.void put(String key,Object value)
作用:向成员变量中存放键值对数据
提示:value可以是Java的所有基本数据类型、数组、对象
3.Object get(String key)
作用:获取键名为key对应的值
4.XXX getAsXXX(String key)
作用:返回XXX类型的值
提示:XXX可以是所有基本类型的包装类。如Integer,还有ByteArray等


SQLLiteOpenHelper类
1.概述:
SQLiteOpenHelper类是Android提供的用于操作SQLite数据库的工具类,该工具类能方便地创建数据库,表以及管


理数据库的版本
2.常用方法:
1.synchronized SQLiteDatabase getReadableDatabase();
作用:以读的方式打开数据库对应的SQLiteDatabase类的对象
2.synchronized SQLiteDatabase getWriteableDatabase();
作用:以写方式创建或打开数据库对用的SQLiteDatabase类的对象
3.abstract onCreate(SQLiteDatabase db)
作用:首次创建数据库时,回调该方法。
4.abstract onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion)
作用:数据库版本更新时,回调本方法
5.synchronized void close()
作用:关闭所有打开的SQLiteDatabase对象


Cursor类
1.概述
Cursor类存放查询的结果集,并提供了对结果集中记录进行访问的方法
2.常用方法
(1)move(int offset)
作用:将指针向上(或向下)移动offset个记录。若offset值为正数则向下移动,若为负数则向上移动。
(2)Boolean moveToFirst()
作用:指针移至结果集的第一个记录。若移动成功则返回true,否则返回false。
(3)Boolean moveToLast()
作用:指针移至结果集的最后一个记录。若移动成功则返回 true,否则返回 false。 
(4)Boolean moveToNext();
作用:指针向后移动一条记录,若移动成功则返回true,否则返回false
(5)Boolean moveToPrevious
作用:指针向后移动一条记录,若移动成功则返回true,否则返回false
(6)isLast();
作用:若指针在Cursor结果集的最后一条记录,则返回true,否则返回false
(7)isAfterLast();
作用:若指针在Cursor结果集的最后一条记录之后,则返回true,否则返回false
(8)isFirst();
作用:若指针在 Cursor结果集的第一条记录,则返回 true,否则返回 false。 
(9)isBeforeFirst(); 作用:若指针在Cursor结果集的第一条记录之前则返回true,否则返回false
(10)isClose();
作用:Cursor对象是否关闭,若关闭则返回true,否则返回false
(11)int getColumnIndex(String columnName)
作用:获得指定列的索引值
参数columnName:指定列的列名
示例:
int  index=cursor.getColumnIndex("name");
(12)String getString(int columnIndex)
参数columnIndex:指定列的索引值


一、概述
Notification是Android中一个重要的系统服务,Notification显示通知信息在手机状态栏,手机状态栏位于屏幕


最上方,那是通常显示手机当前的网络状态、电池状态、时间、短信等。Notification代表的是一种具有全局效果


的通知,Notification对象要通过NotificationManager(通知管理器类)的对象来发送。
二、Notification类
1.概述
Notification类用于存放通知标题、内容、图标以及发送的目标对象
2.常用属性
1).icon:通知的图标,示例代码
Notification notif=new Notification();
notif.icon=R.drawable.ic_launcher;
说明:第一行创建通知对象,第二行设置通知对象的icon图标,该图标用了Android默认的图标,也可以是其他图



2).tickerText:通知标题,该标题显示在窗口的状态栏中
示例代码:notif.tickerText="通知来啦";
3).flags:设置通知状态的标志值,有如下可选常量值:
FLAG_AUTO_CANCEL :在通知栏点击此通知后被清除
FLAG_INSISTENT:重复发出声音,直到用户响应此通知
FLAG_ONGOING_EVENT :将此通知放大通知栏的“OnGoing”即“正在运行”组中
FLAG_NO_CLEAR:禁止手动清除此通知
4).defaults:设置通知的默认属性,默认属性包括声音提示,震动提示,闪光提示等
DEFAULT_SOUND :默认声音
DRFAULT_VIRBATE:默认震动
DEFAULT_LIGHTS:默认闪光灯
ALL:使用默认声音,默认闪光灯和默认震动
5).public int contentIntent:存放一个PendingIntent类型的对象
6).public int contentView:存放一个RemoteViews类型的对象。使用该对象可以在状态栏显示如下载进度这类


的效果
3.创建通知对象
通知对象可以入以上所示创建,再设置对象的图标、标题等属性,也可以按如下方法创建
Notification notification=new Notifiication(R.drawable.icon,"通知来啦",System.currentMills());
4.常用方法:
public void setLatestEventInfo(Context context,String title,String content,PendingIntent pi)
作用:蛇蛇点击通知的响应事件
参数context:当前的Activity对象
参数title:通知的标题,该标题不是上述的窗口状态栏的标题
参数content:通知的详细内容
NotificationManager类
1.概述
NotificationManager类是通知管理器对象,用于发送、取消通知
2.常用方法:
1.notify(int id,Notification notification)
作用:发送一个通知
参数id:通知的id值,用于区别其他通知
参数notification:一个已经创建的Notification对象
2.cancel(int );
作用:关闭指定索引值的通知。
示例:notifyManager.cancel(100);


PendingIntent类
一.概述
1.PendingIntent用于描述Intent及其最终的行为
2,PendingIntent对象可以递交给其他应用程序,然后继续处理。这样可稍后才处理PendingIntent中描述的Intent


及其最终行为。
二.常用方法:
1.public static PendingIntent getActivity(Context context,int requestCode,Intent intent,int flags)
作用:从系统取得一个用于启动目标(intent中设置)Activity的PendingIntent对象
参数context:当前组件的对象
参数requestCode:请求码,用0即可
参数intent:Intent对象,用于指定通知的目标组件
参数flags:设置通知的类型,有两个常用的可选值:
1)FLAG_CANCEL_CURRENT:设定在提取PendingIntent时,先关闭之前的PendingIntent实例,这样得到的


PendingIntent就是新的了
2)FLAG_UPDATE_CURRENT:设置新的Intent更新之前的PendingIntent中的Intent对象数据,例如更新Intent中的


Extras.
提示:本应用中设置flags值为0即可
2.public static PendingIntent getService(Context context,int requestCode,Intent intent,int flags



作用:从系统中取得一个用于启动目标Service中的PendingIntent对象
3.public static PendingIntent getBroadCast(Context context,int requestCode,Intent intent,int flags)
作用:从系统中取得一个用于启动BroadcastReceiver的Intent广播的PendingIntent对象


Service概述
1.Service是Android的四大组件之一
2.Service本质上是后台运行的可执行程序,他没有Activity那样的用户界面
3.Service通常不予用户交互,不能自己启动、运行在后台
4.Service主要应用于长时间的后台服务以及周期性的后台监控,如:
(1)播放多媒体的时候启动了其他Activity,此时程序要在后台继续播放
(2)检测SD卡上大文件的变化
(3)在后台记录手机当前的地理信息位置的改变
(4)在后台完成下载大文件等等
5.Service具有更高的进程优先级,在Android中进程有五个优先级别,Service位于第三个级别
6.Service具有全局唯一性。同一时间系统内只能存在一个Service实例
7.Service必须要在项目清单中注册才能使用,这一点与Activity相同
8.Android服务分为系统服务与应用服务
1)系统服务:Android提供了大量的系统Service,如:MediaService用于媒体录制、播放的系统服务
2)应用服务由开发者自己定义
二、启动、停止、绑定Service的相关方法
1.public ComponentName startService(Intent service)
作用:启动指定的Service
参数service:Intent对象,在该意图对象中指定启动的目标Service。启动方法有显式意图和隐式意图两种
说明:
1)startService()在ContextWrapper类中定义,该类的父类是Context
2)ContextWrapper类是Activity的间接父类和Service的直接父类
示例代码
Intent intent=new Intent(启动方组件的对象,目标Service.class)
startService(intent);
2.public boolean stopServices(Intent service)
作用:停止指定的service
说明:stopService方法是在ContextWrapper类中定义
3.public final stopSelf()
作用:在Service内部停止Service。
说明:stopSelf方法的执行不会会带哦Service中的onDestroy方法
4.bindService(Intent intent,ServiceConnection conn,int flags)
作用:与Intent指定的目标Service绑定
(1)参数intent:启动intent对象中指定的目标Service
(2)参数Conn:是一个实现了ServiceConnection接口的对象,该对象用于监听访问者与Service之间的绑定情况


。当绑定成功时,将调用ServiceConnection对象的onServiceConnected方法
(3参数flags:指定绑定时是否自动创建Service。值为0只不自动创建Service,当只是BIND_AUTO_CREATE常量(


值为1)时,自动创建Service。
5.ServiceConnection接口
作用:用于监听访问者与Service之间的连接情况,该接口定义了两个方法:
(1)onServiceConnected(ComponentName name,IBinder service)
作用:绑定成功时触发本方法
参数name:被绑定的Service的一个实例
参数Service:通过被绑定的Service类中的onBind方法返回一个IBind类型的对象。
(2)onServiceDisconnected(ComponentName name)
作用:绑定出现异常、应用程序出现崩溃时触发本方法
6.UnBindService(ServiceCoonnection conn)
作用:解除与Conn相关联的Service的绑定
参数Conn:是一个实现了ServiceConnection接口的对象
说明:unbindService执行后,系统会回调Service的onDestroy()方法。


Service的生命周期
startService()启动服务的执行流程
1.其他组件(例如Activity)调用startService();
2.服务被创建后,回调onCreate(),执行初始化操作
3.onStartCommand()方法被触发,服务处于运行状态
4.当执行stopService()后,将结束SErvice对象,同时onDestroy()方法被触发
提示:
如果Service还没有运行,则Android先调用onCreate()然后调用onStartCommand();
如果Service已经运行,则只调用onStartCommand(),所以一个Service的onStartCommand方法可能被重复滴啊用多


次,但onCreate方法只调用一次。
bindService()绑定的执行流程
onCreate()->onBind()->onUnbind->onDestroy()
1.若Service未启动,则创建Service,回调onCreate(),若Service已启动,则跳过本步骤。
2.onBind()被触发,并返回一个IBinder的实现类对象,该对象将在绑定的组件中被获得
3.onUnbind()在在unbindService()方法执行后触发
4.onDestroy()在Service被关闭是触发,在onDestroy方法中释放战友的系统资源,如结束Service中的线程,注销


各种监听器,注销广播接收者等。


再绑定的执行流程
Service在绑定后,可以解除绑定后,再次绑定。但前提是首次绑定时,该Service已存在,基:只有在单纯绑定的


情况下,解除绑定,才能再次绑定。若是绑定的同时启动Service,则解除绑定时,该Service将被关闭
执行流程:onBind()->onUnbind()->onRebind()


进程的优先级
(一)概述
Android规定,进程的优先级分为以下五个级别
1.Active Process
2.Visible Process
3.Started Service Process
4.BackGround Process
5.Empty Process


Active Process
前台进程是包含(与用户交互的)控件的那种应用程序。这些是Android通过回收资源来极力保护的进程,Active 


Process包括:
(1)处于active状态的Activity,他们运行在前台来处理用户的响应事件。
(2)Activity Service或者正在执行onReceive事件处理函数的Broadcast Receiver
(3)进程中包含正在与用户交互的activity绑定的service
(4)进程中包含执行了startForeground()的Service
(5)进程中包含了正在执行的onCreate,onStartCommand()或onDestroy方法的Service.


Visible Process
可见但不活动的进程是那些拥有"可见Activity"的进程。可见Activity是那些在屏幕上可见,比不是在前台或不响


应用户事件的Activity。这种情况发生在当一个Activity被部分遮盖的时候。可见进程只在极端的情况下,才会被


杀死保证Active Process的运行。包括以下情况:
(1)可见的Activity,但处于onPause()状态
(2)被可见Activity绑定的Service


Service Process
进程中包含已经启动的Service。Service以动态的方式持续运行但没有可见的界面。因为Service不直接和用户交


互,它们拥有比Visible Process较低的优先级。它们还是可以被认为是前台进程,不会被杀死


Background Process
进程中的Activity不可见和进程中没有启动任何的Service,这些进程都可以看作是后台进程。在系统中,拥有大


量的后台进程,在内存资源紧张时,Android按照后看见先杀掉的原则杀掉后台进程以获取资源给前台进程。


Empty Process
当一个进程被杀掉,进程保留,变成空进程
空进程中所有的组件都被关闭掉,但为了改善整个系统的性能,Android会在内存中保留那些已经走完生命周期的


应用程序。Android维护这些缓存来改善应用程序重新启动的时间。但这些进程在资源需要的时候常常被杀掉。


Service的应用场景
在开发Android应用项目中,若将耗时操作放在Activity的线程中(如播放音乐),将可能出现以下情况:
因接电话操作,使得应用程序成为后台进程(Activity被完全遮盖)或成为空进程(应用程序的所有Activity被关


闭)。虽然这是进程中的线程仍然在工作,如播放音乐,但空进程或后台进程在系统内存匮乏时,容易被系统彻底


杀掉,这样线程也将被停止。
为避免这种问题出现,将应用程序中的耗时操作放在Service中进行,由于Service的进程优先级为第三季,要高于


第四级、第五级的后台进程和空进程,将大大降低耗时操作被系统杀掉的几率。


Service的绑定原理
(一)概述
1.一个Activity与一个Service只能绑定一次
2.一个Activity可以同时绑定到多个Service
3.一个Service亦可以同时被多个Activity绑定
4.当绑定到一个Service,且将flag设置为BIND_AUTO_CREATE时,如果该Service为创建,则先创


建Service(onCreate),然后再绑定,如果Service已经被创建,则直接绑定
5.如果Service被多个Activity绑定,只有当所有的客户端都解除绑定时才能被destroy
6.Binder类用于客户端与服务端的通信,Binder的意思是别针,可以理解为用Binder将服务端与客户端"别"在一起



(二)绑定组件时数据传值分析
以下代码展示绑定的Service的类结构
public class TargetService extends Service{
private int mCount;
private int inc(){
mCount++;
return mCount;
}
public class InfoBind extends BInder{
public int count(){
return inc();
}
}
public IBinder onBind(Intent arg0){
InfoBind bind=new InfoBind();
return bind;
}
}
说明:
以上代码中的InfoBind是TargetService的一个内部类,该类只是示范,类名不一定非是InfoBind,该类是Binder


类的子类。而Binder类实现了IBinder接口。因此在onBind方法中可以返回InfoBind对象。
当然,可以在onBind方法的return命令后面直接写new IBinder(),机返回接口的一个实现类的对象,但要实现


接口所有声明的方法。
Android框架提供了Binder类,该类实现了IBInder接口中的方法,由于这些方法是被系统调用,应用开发时无需调


用。因此,以上的InfoBinder类通过继承Binder,间接实现了IBinder接口,则onBInd方法允许返回InfoBind对象
实际开发中通常采用以上方式返回一个对象。该对象中可以自定义与业务需求相关的方法,这些方法可以返回当前


Service的一些数据。
onBind()方法返回的对新爱国将在onServiceConnected()方法的第二个参数service获得,基service中存放了


onBind()放回的对象的地址。
(三)bindService与startService对比
1.通过多次调用startService,每次都触发Service类中的onStartCommand(),并用Intent对象向Service传递不同


的数据,从而达到控制Service。但这种方式不太方便。
2.通过绑定的方式,使用onBind传给ServiceConnection的IBinder控制Service。这种方式比较便捷,实际开发中


推荐使用这种方式。
(四)关于onServiceDisconnected方法的调用
1.当ACtivity与Service绑定时,若出现进程崩溃,则onServiceDisconnected方法将被触发
2.当进程被终止时,将触发onServiceDisconnected方法
3.onServiceDisconnected方法有Android系统调用,不要程序触发,不要在此方法中编写业务逻辑代码。


隐式意图启动Service
1.使用隐式意图可以启动另外一个应用程序的服务,从而实现跨进程启动服务
2.在项目的清单文件中注册Service时,通过添加Intent-filter,允许设备中其他应用程序通过隐式意图来启动本


程序中的Service
提示:
若不想让其他应用程序启动本应用的Service,则不要在Service标签中声明Intent-filter。


BroadcastReceiver
BroadReceiver顾名思义就是广播接收者,用于接收来自系统和应用中的广播。
Android系统中,广播的应用非常广泛,例如:开机完成后会产生一条广播,接收到这条广播就能实现开机启动服


务的功能;当网络状态改变时系统会产生一条广播,接收到这条广播就能及时地做出提示和保存数据等操作;当电


池量改变时,系统会产生一条广播,接收到这条广播告知用户及时保存进度,等等。
Android中的广播机制设计的非常出色,很多事情原本需要开发者亲自操作的,只需等待广播告知自己就可以了,


大大减少了开发的工作量和开发周期。
Android系统的广播模拟广播电台的广播机制,首先由一方发送广播,其次定义一个BroadcastReceiver对象,该对


象用来接收发送的广播
Android用字符串模拟电台的频率,当出现一个广播时,同时在Intent对象中设置Action字符串,该字符串可看作


是该广播的频率。
广播接收者需要Activity和Service那样在项目清单中注册,注册的方式与intent.action的字符串值相同。这样发


送和接收者通过Action属性就处在同一频段上了。
BroadcastReceiver是抽象类。


注册BroadcastReceiver
注册BroadcastReceiver有两种方式
1.在项目清单文件中注册
示例代码:
<receiver android:name=".ReceiverAndroid">
<intent-filter>
<action android:name="liuke.RECEIVE_ANDROID"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
提示:
在项目清单中注册的广播时常驻型的。当应用关闭后,如有广播消息传来,Receiver也会被系统调用而自动执行。
2.Java代码中注册
MyReceiver receiver=new MyReceiver();//创建一个自定义的MyReceiver类的一个对象
IntentFilter filter=new IntentFilter();
filter.addAction("liuke.mybroadcast");
regeisterReceiver(receiver,filter);
说明:
1.以上代码的第2,3行相当于<intent-filter>标签的功能,创建过滤器并设置过滤条件
2.第4行是注册广播接收者
提示:
1.registerReceiver是android.content.ContextWrapper类中的方法,Activity和Service都继承了


ContextWrapper,所以可以直接调用。在实际应用中,若在Activity或Service中注册了一个BroadcastReceiver,


当这个Activity或Service被销毁时如果没有解除注册,系统会报一个异常,提示是否忘记解除注册了。所以,建


议在onStop、onDestroy等生命周期方法中将代码注册的广播解除注册,如下代码所示
protected void onStop(){
super.onStop();
unregiter();
}
private void unregister(){
if(MyReceiver!=null){
unregisterReceiver(mReceiverJava);
mReceiverJava=null;
}
}
2.代码注册方式与项目清单中注册不同,它不是常驻型的,即广播岁组件的生命周期。


常用方法:
1.Boolean isOrderedBroadcast()
作用:若是有序广播则返回true,若是无序广播则返回false
2.absortBroadcast();
作用:终止广播,优先级低的广播接收者将无法得到当前的广播
3.setResultExtras(Bundle bundle)
作用:修改数据并发送给优先级低的接收者
示例代码:
Bundle bundle=new Bundle();
bundle.putString("msg","第二个广播接收者接到了广播")
setResultExtras(bundle);
以上代码将字符串一键值对的形式保存在Bundle对象中,并通过setResultExtras方法发送给优先级低的广播接收


者。
void setResultData(String data)
作用:重载的方法
参数data:发送给优先级低的接收者的字符串
4.int getResultCode();
作用:返回前一个接收者返回结果码
5.String getResultCode();
Bundle getResultExtras(boolean markMap)
作用:获取优先级高的接收者发送的数据
参数markMap:值为true时,当上一个将广播接收者的setResultExtras参数为null,则getResultExtras获取的


Bundle对象是一个有地址但内容为空的集合
markMap值为false时,则getResultExtras获取的对象是null。
6.public abstract void onReceive(Context context,Intent intent)
作用:该方法必须有子类实现,当接收到广播时将回调本方法。
参数context:发送广播的组件对象
参数intent:发送广播的组件对象发送过来的Intent对象。该题图对象可封装传递过来的数据
提示:onReceive方法中不能执行超过10秒的耗时操作,否则将出现异常。


四、相关方法:
1.public void sendBroadcast(Intent intent)
作用:发送广播。
说明:
该方法是android.content.ContextWrapper类中的方法,带一个Intent类型的参数
2.public Intent registerReceiver(BroadcastReceiver receiver,Intentfilter filter)
作用:注册广播接收者
参数receiver:被注册的广播接收者对象
参数filter:封装action的过滤器对象
3.public void unregisterReceiver(BroadcastReceiver receiver)
作用:取消广播接收者的注册
提示:registerReceiver()和UNregisterReceiver()均是用于Java代码注册广播接收者。


IntentFilter类
1.概述:
IntentFilter类用于代码注册广播接收者,该类的作用相当于项目清单文件中的<Intent-filter>
2.常用方法:
public final void addAction(String action)
作用:向过滤器对象添加action属性
参数action:该属性相当于清单文件中<intent-filter>标签中的<action>子标签


有序广播
1.概述
Android提供了两种发送广播的方式,一种是发送无序广播,第二种是有序广播。两种广播的特点是:
无序广播的效率较高,所有符合条件的广播接收者都能接收到广播。
有序广播:接收广播有先有后,先后次序通过设置优先级来区别。在项目清单文件中通过以下代码完成优先级的设


定:
<intent-filter anrdoid:priprity="10">
以上设置了优先级为10.那么比10小的广播接收者将在当前广播接收者之后接收发到的有序广播。
有序广播的另一个特点是优先级高的广播接收者可以修改发送广播中的数据,并可以传递给优先级低的接收者。优


先级高的接收者可以终止优先级低的接收者发送,即终止广播。
2.常用属性:
1).Priority属性:
作用:该属性设置广播的优先级别,在项目清单中注册receiver时定义。取值范围-1000——1000,实际的值可以


超过该范围。
2).示例代码:
<receiver android:name=".FirstReceiver">
<intent-filter android:priority="20">
<action android:name="liuke.Receiver">
</intent-filter>
3.常用权限
1)android.permission.RECEIVE_SMS
作用:申请接收短信的权限
示例代码:
<uses-permission>
android:name="android.permission.RECEIVE_SMS"
</uses-permission>
2)android.permission.PROCESS_OUTGOING_CALLS
作用:申请播出电话的权限
示例代码:
<uses-permission>
android:name="android.permission.PROCESS_OUTGOING_CALLS"
</uses-permission>
3)android.permission.RECEIVE_BOOT_COMPLETED
作用:设置开机自动启动权限
示例代码:
<uses-permission>
android:name="android.permission.RECEIVE_BOOT_COMPLETED"
</uses-permission>
4.发送有序广播
context对象的sendOrderedBroadcast(intent,permission)
5.接收有序广播
1)优先级高的接收器先接受
2)相同优先级,动态注册的接收器先接收
3)相同优先级的静态注册的接收器,先注册的先接收


常用方法:
1.Boolean isOrderedBroadcast()
作用:若是有序广播则返回true,若是无序广播则返回false
2.absortBroadcast();
作用:终止广播,优先级低的广播接收者将无法得到当前的广播
3.setResultExtras(Bundle bundle)
作用:修改数据并发送给优先级低的接收者
示例代码:
Bundle bundle=new Bundle();
bundle.putString("msg","第二个广播接收者接到了广播")
setResultExtras(bundle);
以上代码将字符串一键值对的形式保存在Bundle对象中,并通过setResultExtras方法发送给优先级低的广播接收


者。
void setResultData(String data)
作用:重载的方法
参数data:发送给优先级低的接收者的字符串
4.int getResultCode();
作用:返回前一个接收者返回结果码
5.String getResultCode();
Bundle getResultExtras(boolean markMap)
作用:获取优先级高的接收者发送的数据
参数markMap:值为true时,当上一个将广播接收者的setResultExtras参数为null,则getResultExtras获取的


Bundle对象是一个有地址但内容为空的集合
markMap值为false时,则getResultExtras获取的对象是null。
6.public abstract void onReceive(Context context,Intent intent)
作用:该方法必须有子类实现,当接收到广播时将回调本方法。
参数context:发送广播的组件对象
参数intent:发送广播的组件对象发送过来的Intent对象。该题图对象可封装传递过来的数据
提示:onReceive方法中不能执行超过10秒的耗时操作,否则将出现异常。


粘滞广播
1.概述:
粘滞广播:发出的广播会一直滞留(等待),以便有人注册这则广播消息后能够尽快的收到这条广播。其他功能与


sendBroadcast相同。
提示:
使用sendStickyBroadcast发送广播,需要获得BROADCAT_STICKY permission,如果没有这个permission则会抛出


异常。
2.广播的发送与移除
1)发送:context对象的sendStickyBroadcast(inttent)
2)移除:context对象的removeStickyBroadcast(intent)


ContentProvider
一、概述
ContentProvider-内容提供器,是应用程序之间共享数据的接口,Android系统将这种机制应用到方方面面。比如


:联系人提供器专为不同应用程序提供联系人数据
ContentProvider是Android四大组件之一,Android提供了四种数据存取技术。这四种技术都能由ContentProvider


提供的方法按统一的代码格式存取,即以一致性的方法操作多样性的数据源。
ContentProvider机制可支持在多个应用中存储和阅读数据。这是跨应用共享数据的重要方式。
Android提供了预定义的ContentProvider用于方便操作内存卡和SD可上存储的音频、视频图片和私人通讯录等。
ContentProvider是一个抽象类,必须继承,由子类实现该类中的抽象方法。
ContentProvider类中定义了insert(),delete(),update(),query()等抽象方法用于外部应用程序操作数据提供增


删改查的操作。
ContentProvider类中定义了供外部应用操作数据的地址:Uri
外部应用程序通过ContentResolver类,按Uri的地址操作ContentProvider暴露的数据。
二、系统预定义ContentProvider的使用步骤
步骤1:获取系统预定义的Uri
步骤2:在应用程序中获取ContentProvider类的对象,调用该类的增删改查的方法
通过步骤一获取的系统预定义的uri地址操作数据
提示:contentResovler类相当于操作数据的中间件,该类中提供了增删改查等方法用来操作ContentProvider所暴


露的数据。
三、ContentProvider类的抽象方法
1.public Cursor query(Uri uri,String []projection,String selection,String []selectionArgs,String 


sortOrder)
作用:查询指定数据地址的数据源,返回的Cursor类型的结果集。
参数Uri:采标被操作数据的地址
参数projection:查询表中指定列,若是所有列的都查询,则写为null
参数selection:查询条件(SQL字符串),若没有条件,则写为null;
参数selectionArgs:若上一个参数(查询条件)中有占位符,则本参数提供与占位符对应的数据。
参数sortOrder:排序方式,null表示默认的排序方式(升序)
2.public String getType(Uri uri)
作用:返回当前Uri代表的数据的MIME类型
3.public Boolean onCreate()
作用:在ContentProvider对象创建后第一个调用的方法
4.public Uri insert(Uri uri,ContentValues values)
作用:根据Uri的地址,向指定文件或数据库中插入values中的数据。并返回该记录的_id值,该列是主键并且是自


动增长的标识列
5.public int delete(Uri uri,String selection,String[] selectionArgs)
作用:删除Uri中指定条件的数据
参数selection:指定条件的SQL字符串
参数selectionArgs:若selection的条件中有占位符,则本参数提供填充占位符的数据
返回值:返回删除的行数
6.public int update(Uri uri,ContentValues values,String selection,String []selectionArgs)
作用:根据Uri,按selection指定的条件将数据修改为values
参数selectionArgs:若selection的条件中有占位符,则本参数提供填充占位符的数据
返回值:返回修改的行数
四、Uri
(一)概述
Uri是Uniform Resource Identifier的简称,Web的资源,如HTML文档等都用一个通用资源标识符来定位
(二)Uri的结构
Uri的结构类似于网址,如下:
scheme://authority/path
1.scheme协议:Android规定:在数据共享时,协议名必须是content。
2.authority授权:唯一标识ContentProvider的字符串,该字符串在Android应用程序中必须唯一
与网站类似,每个ContentProvider都会使用字符串注册自己,该字符串类似于网站的域名没在Android中称为授权


,该授权必须唯一,ContentProvider以该字符串作为向外部提供数据访问的基础Uri。
3.路径(或资源索引值):通过索引值查找指定的资源。
content://com.ityw.myContentProvider/books
表示该ContentProvider提供了操作若干书籍的地址,这里
content://是android操作数据的scheme
com.ityw.myProvider是authority
books表示一个存放书籍的集合
content://com.ityw.myProvider/books/#20
表示数据集合中索引值是20的一本书
五、MIME
(一)概述
MIME的英文全称是"Multipurpose Internet Mail Extensions"多用途互联网邮件扩张,他是一个互联网标准,在


1992年最早应用于电子邮件系统,后来应用到浏览器。服务器将MIME标志符放入传送的数据中来告诉浏览器使用哪


些插件读取相关文件。
MIME类型:设定某种扩展名的文件用一种应用程序来打开,当该扩展名被访问的时候,Android会自动使用指定应


用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。
MIME包含两部分:类型和子类型,中间有/分隔,以下是主要的MIME类型
text/html
text/css
images/jpeg
application/pdf
application/vnd.ms-excel
如果供应商具有专有的数据格式,那么子类型名称将以vnd开头,例如:
application/vnd.ms-excel
如果是非专用的数据格式,则无需vnd开头
application/pdf
(二)Android的MIME
Android遵循类似的约定来定义MIME类型。Android类型中的vnd表示这些类型和子类型具有非标准的、供应商专用


的格式
为确保唯一性,Android的MIME使用了类型/子类型的格式
Android使用两种格式分别表示多条记录和单条记录
1.单挑记录的MIME格式类似于以下格式
vnd.android.cursor.item/vnd.companyname.contenttype
提示:
单条记录的主类型必须是vnd.android.cursor.item,子类型若是自定义的专用类型则必须是vnd开头,后面的字符


串自行定义。
2.多条记录的MIME格式类似于以下格式:
vnd.android.cursor.dir/vnd.com[anyname.contenttype
提示:
多条记录的主类型必须是vnd.android .cursor.dir,子类型若是自定义自定义的专用类型则必须是vnd来头,后面


的字符串自行定义。
说明:
1)MIME类型在你Android中使用非常广泛,尤其在Intent中,系统通过MIME类型决定调用响应的Activity处理数据
2)MIME类型通过ContentProvider的Uri得出
六、ContentResolver类
(一)概述
ContentResovler类相当于操作数据的中间件,该类中提供了与ContentProvider类中相同的增删改查的方法。在外


部操作ContentProvider所暴露的数据。
只要获得了ContentProvider类中定义的Uri,就能调用ContentProvider类中的同名方法操作ContentProvider所暴


露的数据。
(二)常用方法
1.public Uri insert(Uri uri,ContentValues values)
作用:根据Uri提供的地址,向指定数据源(数据库、文件等)插入values中的数据。
说明:
Uri是ContentProvider类在项目清单文件中注册时的authority属性的值。
2.public int insert(Uri uri,String selection selection,String[] selectionArgs)
作用:根据Uri提供的地址,调用ContentProvider类中的同名方法,在指定数据库(或文件)中删除selection中


指定条件的记录。
3.public int update(Uri uri,ContentValues values,String selection,String [] selectionArgs)
作用:根据Uri提供的地址,调用ContentProvider类中的同名方法,在指定数据库(或文件)中按selection指定


的条件将数据修改为values中的值
4.public Cursor query(Uri uri,String[]projection,String selection,String[]selectionArgs,String 


sortOrder)
作用:根据Uri提供的地址,调用ContentProvider类中的同名方法,在指定数据库中查询出所有匹配selection的


数据,其中projection是要查询列名表,指定查询的数据列。
(三)获取ContentResolver对象
ContentResolver ContentResolver=this.getContentResolver();
说明:this是当前组件对象,例如:Activity类的对象。
七、通过预定义的Uri操作多媒体数据
(一)概述
Android为应用程序操作常见的数据提供了预定义的Uri,如视频、音频、图片、文件、数据库等。
Android中的以上数据可能存放在内存卡中,也可能存放在SD卡。并且很可能存放在不同文件夹中。通过Uri首先可


以指定要访问的是哪种类型的数据,其次指定访问的数据是在内存卡还是在SD卡,最后通过条件查找符合条件的数


据。至于那个文件夹则无需考虑。
以上访问数据的方式提供了对不同类型的数据一致性的操作,有效地简化了编程
(二)操作图片数据
1.访问SD卡图片的Uri
android.provider.MeadiaStore.Images.Media.EXTERNAL_CONTENT_URI
2.访问内存卡中的图片Uri
android.provider.MediaStrore.Images.Media.INTERNAL_CONTENT_URI
3.MediaStore类
MediaStore类是Android多媒体开发常用类,该类位于android.provider包下,该类中定义了Images、Audio、


Video等内部类,用于表示图片、音频和视频。
4.Images类
Images类是MediaStore类的内部类,用于表示图片数据。该类中定义了一组常量用于表示图片的属性。
5.Images.Media的常量
1)Images.Media._ID:图片的id值,该值由系统创建
2)Images.Media.DISPLAY_NAME:图片的显示名
3)Images.Media.DESCRIPTION:图片的详细描述
。。。。
6.Thumbnails
Thumbnails类用于获取系统中的视频或图片的缩略图。该类提供了以下方法获取缩略图:
public static Bitmap getThumbnail(ContentResolver cr,long origId,int kind,BitmapFactory.Options 


options)
作用:获取指定id的缩略图
参数-cr:ContentResolver对象
参数origId:图片的Id值
参数-kind:缩略图的类型,有两个常量:
Thumbnails.MICRO_KIND:最小类型
Thumbnails.MINI_KIND:迷你类型
参数:options:BitmapFactory.Options类型用于预防图片过大造成内存溢出,若不考虑溢出问题,则此处可设置


为null。
(三)操作音频数据
1.访问SD卡音频的Uri
android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI
2.访问内存卡音频的Uri
android.provider.MediaStore.Audio.Media.IMTERNAL_CONTENT_URI
3.Audio.Media的常量
1)Audio.Media._ID:音频的id值,该值由系统创建
2)Audio.Media.DISPLAY_NAME:音频的显示名
。。。。
(四)操作视频数据
1.访问SD卡视频的Uri
android.priovider.MediaStore.Video.Media.EXTERNAL_CONTENT_URI
2.访问内存卡视频的Uri
android.provider.MediaStore.Video.Media.INTERNAL_CONTENT_URI
3.Video.Media类的常量
1)Video.Media._ID:视频的id
2)Video.Media.ALBUM:视频所在的专辑
。。。
八、解决模拟器中文乱码问题
在Android模拟器中,默认情况下使用ISO-8859-1对中文进行编码/译码,而Windows系统默认的编码是GBK。
从模拟器的SD卡读到的数据是按Windows的GBK解码的,所以会出现乱码问题
因此在程序中要将获取的中文字符串先编码为ISO8859-1的字节数组,然后该字节数组解码为GBK。示例代码:
String title=c.getString(c.getColumnIndex(Audio.Media.TITLE));
title=new String(title.getBytes("iso8859-1"),"GBK");

















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值