接口interface
interface是一些功能的集合,但它只定义了对象必须实现的成员,而不包含成员的实现代码,成员的具体代码由实现接口的类提供。Android对接口的使用场景主要有三类:事件监听器接口、对象序列化结构、线程类相关接口。
事件监听器接口
这类接口名称一般以Listener或者CallBack结尾,监听器定义了事件触发时应该进行的操作方法,具体操作步骤需要自定义实现。常见的监听器接口有:
1、点击监听器,如OnClickListener、OnLongClickListener、OnCheckedChangeListener、OnItemClickListener、OnItemLongClickListener、OnItemSelectedListener等等,详见《 Android开发笔记(四十三)点击事件》;以及OnSeekBarChangeListener,详见《 Android开发笔记(五十八)铃声与震动》;
2、UI监听器,如AnimationListener、OnPageChangeListener、TextWatcher,详见《 Android开发笔记(四十四)动态UI事件》;
3、浏览器交互监听器,如WebViewClient、WebChromeClient、DownloadListener,详见《 Android开发笔记(六十四)网页加载与HTML5框架》;
4、手机信号监听器,如LocationListener、PhoneStateListener,详见《 Android开发笔记(四十六)手机相关事件》;
5、摄像头监听器,如AutoFocusCallback、ShutterCallback、PictureCallback、OnZoomChangeListener,详见《 Android开发笔记(五十六)摄像头拍照》;
6、媒体录制与播放监听器,如OnErrorListener、OnInfoListener、OnPreparedListener、OnCompletionListener、OnSeekCompleteListener、OnVideoSizeChangedListener,详见《 Android开发笔记(五十七)录像录音与播放》;
对象序列化接口
这类接口主要有Parcelable和Serializable两种结构定义,对象序列化接口的详细介绍参见《 Android开发笔记(二十七)对象序列化》。
线程类相关接口
这类接口定义了线程可定制的操作方法,主要包括以下三种接口:
1、Runnable接口,用于定义一系列连续处理的事务,详见《 Android开发笔记(四十七)Runnable接口实现多线程》;
2、ThreadFactory接口,用于定义线程池中的线程工厂方法,详见《 Android开发笔记(七十六)线程池管理》;
3、UncaughtExceptionHandler接口,用于定义线程遇到未知异常时的处理方法,详见《 Android开发笔记(七十八)异常容错处理》;
抽象类abtract class
抽象类是一个包含抽象方法的类,不过是否包含抽象方法这不是必要条件,只要类名被abtract修饰即可认为是抽象类。所谓抽象方法,其实与接口中的方法类似,都是只定义了成员方法,但不包括成员的实现代码,具体代码由抽象类的派生类来实现。抽象类与普通类的区别主要有三点:
1、抽象方法必须为public或者protected,因为如果为private,则不能被子类继承,就无法实现该方法;
2、抽象类与接口一样都不能直接实例化对象;
3、由抽象类派生出的子类必须实现父类的抽象方法,否则该子类也必须定义为抽象类;
Android对抽象类的使用场景主要有三类:部分基础控件、适配器、自定义处理对象。
部分基础控件
此种抽象类主要是一些聚合了其他控件主要功能的类,包括:
1、复合按钮CompoundButton,其实它并未定义抽象方法,仅仅是个中间层的基类。CompoundButton的派生类包括RadioButton、CheckBox、Switch等等,详见《 Android开发笔记(三十七)按钮类控件》;
2、适配视图AdapterView,它与适配器联合使用,实现列表展示的效果。AdapterView的派生类包括Spinner、ListView、GridView等等,详见《 Android开发笔记(三十八)列表类视图》;
3、基础动画Animation,它也没有定义抽象方法,但定义了一个空方法applyTransformation,每个派生类都要重写该方法,以实现具体的动画效果。Animation的派生类包括AlphaAnimation、RotateAnimation、ScaleAnimation、TranslateAnimation等等,详见《 Android开发笔记(十五)淡入淡出动画》、《 Android开发笔记(十六)秋千摇摆动画》;
适配器
适配器在实际使用时都要派生重写,所以sdk里的适配器类都是抽象类或接口,包括:
1、列表适配器,如ListAdapter、SpinnerAdapter、BaseAdapter等等,详见《 Android开发笔记(三十八)列表类视图》;
2、页面适配器,如PagerAdapter、FragmentPagerAdapter、FragmentStatePagerAdapter等等,详见《 Android开发笔记(二十一)横幅轮播页Banner》;
自定义处理对象
在该情况中,抽象类里的个别方法需要开发者来实现,具体的类包括:
1、SQLite操作类SQLiteOpenHelper,需要开发者实现onCreate和onUpgrade方法,详见《 Android开发笔记(三十)SQLite数据库基础操作》;
2、异步任务处理AsyncTask,需要开发者实现doInBackground方法,详见《 Android开发笔记(四十九)异步任务处理AsyncTask》;
内部类
Java允许在类中再定义类,这种在其它类内部定义的类就叫做内部类。内部类有四种,分别是类中内部类、方法内部类、参数内部类和静态嵌套类,其中Android开发中常用的是类中内部类和参数内部类两种。
类中内部类
类中内部类在类内部定义,它与上级类的成员方法平级;之所以单独形成一个内部类,是因为类中的功能可以单独管理;但它又不新建一个java文件,是因为内部类与上级类存在一定程度的耦合。内部类有如下特点:
1、内部类可以访问上级类的所有成员(包括变量和方法),当然包括私有成员;
2、内部类中的this指的是内部类本身,如果要用上级类的实例对象,得使用“上级类的类名.this”获取;
Android开发中常见的类中内部类主要有以下几种:
1、各种建造者Builder,用于对象参数的统一建造,避免在运行过程中发生参数值变更;
2、各种布局参数LayoutParams,用于布局参数的赋值与获取;
参数内部类
参数内部类又叫匿名内部类,它在方法调用时,以临时定义类的形式传入参数位,因为是临时定义,所以没有指定具体的类名。匿名内部类主要用于代码行很少的自定义类,在实际开发中,常见的匿名内部类多是由OnClickListener或者Runnable派生出来。
下面是基于OnClickListener的匿名内部类代码例子:
vh.txtLineOne.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent(mContext, GangpeiDetailActivity.class);
((Activity) mContext).startActivity(intent);
}
});
下面是基于Runnable的匿名内部类代码例子:
//通过Handler来确保init方法的执行在主线程中
handler.post(new Runnable() {
public void run() {
//调用客户端setContactInfo方法
webView.loadUrl("javascript:setContactInfo('" + getJsonStr() + "')");
}
});
下面是一个自定义动画的匿名内部类代码例子:
Animation animation = new Animation() {
protected void applyTransformation(float interpolatedTime, Transformation t) {
tv_content.setHeight((int) (startValue + deltaValue * interpolatedTime));
}
};
animation.setDuration(durationMillis);
tv_content.startAnimation(animation);
点此查看Android开发笔记的完整目录