《疯狂Android讲义》笔记
第二章 android应用的界面编程
2.1 开发自定义的View
继承View基类的子类,然后重写View中的方法。
onFinishInflate(): 当应用从XML布局文件加载该组件并利用它来构建界面之后,该方法将会被回调。
onMeasure(int,int): 调用该方法来检测View组件及它所包含的所有子组件的大小。
onLayout(boolean,int,int,int,int): 当该组件需要分配其子组件的位置、大小时,该方法就会被会回调。
onSizeChanged(int,int,int,int): 当该组件的大小被改变时回调该方法。
onDraw(Canvas): 当该组件将要绘制它的内容时回调该方法进行绘制。
onKeyDown(int,KeyEvent): 当某个键被按下时触发该方法。
onKeyUp(int,KeyEvent): 当松开某个键时触发该方法。
onTrackballEvent(MoyionEvent):当轨迹球事件时触发该方法。
onTouchEvent(MotionEvent): 当发生触摸屏事件时触发该方法。
onWindowFocusChanged(boolean): 当该组件得到、失去焦点时触发该方法。
onAttachedToWindow(): 当把该组件放入某个窗口时触发该方法。
onDetachedFromWindow(): 当把该组件从某个窗口上分离时触发该方法。
onWindowVisibilityChanged(int): 当包含改组件的窗口的可见性发生改变时触发该方法。
2.3 UI组件 textView及其子类
- 实例:不同颜色、字体、带连接的文本(使用textview xml属性)
- 实例:圆角边框。渐变背景的textview(使用xml文件当成drawable 写入background)
- 实例:利用单选按钮、复选框获取用户信息(RadioButton、CheckBox )
- 实例:动态改变布局(ToggleButton 、 Switch)
- 时钟(AnalogClock、DigitalClock)
- AnalogClock模拟时钟,DigitalClock显示数字时钟
- 计时器(Chronometer)
- setBase(long) 设置计时器的起始时间
- setFormat(String) 设置显示时间额格式
- start()
- stop()
- setOnChronometerTickListener() 当计时器改变时触发该监听器。
2.4 UI组件 imageView及其子类
子类:
- ImageButton
- ZoomButton:可以代表放大缩小按钮
- ZoomControls:
QuickContactBadge:关联联系人
//一个ImageView现实另一个Image的局部图片
Bitmap bitmao = bitmaoDrawable.getBitmao();
image2.setImageBitmap(Bitmap.createBitmap(bitmap,x,y,120,120));
image2.setAlpha(alpha);
2.5 UI组件:AdapterView及子类
- Adapter常用实现类:
- ArrayAdapter:
- SimpleAdapter:
- SimpleCursorAdapter:
- BaseAdapter:
ListView(列表视图)
ArrayAdapter<String> adapter2 = new ArrayAdapter<String>(this,R.layout.checked_item,arr2);
list2.setAdapter(adapter2);
//创建ArrayAdapter需要指定的参数
//context、textViewResourceId(代表一个TextView,指定布局)、数组或list(指定内容数据)
- 使用SimpleAdapter创建ListView
- AutoCompleteTextView,MutiAutoCompleteTextView(自动完成文本框)
- gridview(网格视图)
- sinner 下拉框
AdapterViewFlipper
2.6 UI组件,ProgressBar及其子类
- 进度条
- 环形进度条(不能显示进度) 和 水平进度条
- 显示在标题上的进度条
显示在标题上的进度条
//设置窗口特征 : 启用显示进度的进度条
requestWindoeFeature(Window.FEATURE_PROGRESS); //设置窗口特征: 启用不显示进度的进度条
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
//调用Activity的 setProgressBarVisibility(boolean) 或者 setProgressBarIndeterminateVisibility(boolean)即可控制进度条的显示和隐藏
- 拖动条(seekBar) (继承了ProgresBar)
星级评分条(RatingBar):通过星星来表示进度
2.7 UI组件,ViewAnimator及其子类
- ViewSwitcher:代表视图切换组件
- ImageSwitcher(图片切换器)
- 为ImageSwitcher提供一个ViewFactory,viewFactory生成的View组件必须是ImageView
- 切换图片时 只要调用ImageSwitcher的setImageDrawable , setImageResource, setImageURI方法更换图片
2.7.4到第三章之间先跳过把
***
第三章android的事件处理
3.2基于监听的事件处理
android为不同的界面组件提供了不同的监听器接口,比如View
- View.OnClickListener:单击事件的事件监听器必须实现的接口。
- View.OnCreateContextMenuListener:创建上下文菜单时间的时间监听器必须实现的接口。
- View.OnFocusChangeListener:焦点改变事件的事件监听器必须实现的接口。
- View.OnKeyListener:按键时间监听器必须实现的接口。
- View.OnLongClickListener:长单击时间的事件监听器必须实现的接口。
- View.OnTouchListener:触摸屏事件的事件监听器必须实现的接口。
3.4响应系统设置的事件
//调用Activity的如下方法来获取系统的Configuration对象
Configuration cfg = getResource().getConfiguration();
//然后使用Configuration对象的属性来获取系统配置
在Activity中重写 onConfigurationChanged来响应系统设置更改。
3.5handler消息的传递机制
- 主UI线程中系统已经初始化了一个Looper对象,因此程序直接创建Handler即可
- 自己启动的子线程,必须创建一个Looper对象并启动它
- 调用Looper的prepare()方法为当前线程创建Looper对象
- 调用Looper的loop()方法来启动Looper
3.6异步任务 asynctask
在新线程中更新UI组件方法
- 使用Hanlder
- Activity.runOnUiThread(Runnable)
- View.post(Runnable)
- View.postDelayed(Runnable,long)
使用AsyncTask:
- 创建AsyncTask子类
- 实现doInBackground(Params...):后台线程要完成的任务
- 实现obPregressUpdate(Progress... values):在doInBackground()方法中调用publisjProgressUpdate()方法更新任务进度,将会触发该方法。
- onPreExecute():该方法在执行后台耗时操作钱被调用,一般用于完成初始化准备工作。
- onPostExecute(Result result):当doInBackground()完成后,会自动调用obPostExecute()
- 使用AsyncTask的实例execute(Params...params)开始耗时任务。
第四章 深入了解Activity与Fragment
Activity:
- LauncherActivity
- ExpandableListActivity
- preferenceActivity 配合PreferenceFragment
启动关闭Activity
- startActivity(Intent intent) ;startActivityForResult(Intent intent,int requestCode)
- finish() ; finishActivity(int requestCode)
- startActivityForResult()启动的Activity应该 调用setResult返回结果,当前activity重写OnActivityResult接收结果
使用Bundle在Activity之间交换数据
- Intent
- putExtras(Bundle data) ; getExtras()
- putExtra(String name,xxx value) ; getXxxExtra(String name)
- Bundle
- putXxx(String key,Xxx data) ; getXxx(String key)
- putSerializable(String key,Serializable data) ; getSerializable(String key , Serializable data)
生命周期与加载模式
- 生命周期
- onCreate()
- onStart()
- onRestart()
- onResume()
- onPause()
- onStop()
- onDestory()
- 加载模式 (配置Activity时指定android:launchMode属性)
- standard:默认。为目标Activity创建新的实例,并将实例添加到当前Task栈中。
- singleTop:若启动目标Activity已经位于Task栈顶,系统不会创建新的实例,否则与standard模式相同
- singleTask :
- 若目标Activity不存在,则创建并加入栈顶
- 若目标Activity已经位于栈顶,则与singleTop相同
- 若目标Activity存在,且不位于栈顶,则将该activity上的其他activity都移出栈
- singleInstance 在所有Task中只会创建一个目标Activity
fragment
回调:
- onCreate():初始化必要组件
- onCreateView():返回一个该Fragment所显示的View
- onPause(): 当用户离开
- onAttach():当该Fragment被添加、显示到Activity时,回调
- onDetach():当该Fragment从它所属的Activity中被删除时回调
与Activity通信:
- 将Fragment添加到Activity
- 在布局文件中使用 元素添加Fragment,在该元素中的android:name属性中知道Fragment实现类
- 通过FragmentTransaction对象的add()方法添加Fragment
- 互相获取
- 在Fragment中调用getActivity()方法获取它所在的Activity
- 在Activity中 调用FragmentManager 对象的findFragmentById()或findFragmentByTag()方法获取指定的Fragment。
- 传递数据
- Activity向Fragment传递数据:创建Bundle 调用fragment 的setArguments()方法将Bundle传给Fragment
- Fragment向Activity传递数据:Activity实现Fragment的内部回调接口
- 事务 FragmentTransaction
- 代表Activity对Fragment执行的多个改变
- 包含调用多个add()、remove()、replace()最后调用commit()提交。
跳过第六章
第七章图形与图像处理
Bitmap
- createBitmap(Bitmap source, int x,int y, int width , int height): 从源位图source的制定坐标点(x,y)开始挖取宽width,高height的 bitmap对象。
- createScaledBitmap(Bitmap src,int dstWidth,int dstHeight,boolean filter):对源位图进行缩放,缩放成宽dstWidth,高dstHeight的新位图
- createBitma(Bitmap source,int x,int y,int width,int height,Matrix m,boolean filter):从源位图的指定坐标开始挖取指定宽高的bitmap对象,并进行Matrix变换
- boolean isRecycled();返回Bitmap对象是否已被回收
- void recycle()强制Bitmap对象立即回收自己。
BitmapFactory :提供大量方法来解析、创建Bitmap对象
- decodeByteArray(bytr[] data, int offset , int length):从指定字符数组的offset位置 将长度为length的字节数据解析成Bitmap
- decodeFile(String pathName):从指定文件创建Bitmap
- decodeFileDescriptor(FileDescriptor fd):从FileDescriptor对应文件创建Bitmap
- decodeResource(Resources res,int id):用于根据给定资源ID创建Bitmap
- decodeStream(InputStream is):从输入流中创建Bitmap
绘图
重写View的onDraw(Canvas canvas)方法
canvas:举几个方法
- drawArc(RectF oval,float startAngle, float sweepAngle,boolean useCenter,Paint paint) 绘制弧
- drawBitmap(Bitmap bitmap,Rect src ,Rect dst,Paint paint) :在指定点绘制从源位图的区域
- drawText(String text,int start,int end,Paint paint):绘制字符串
- clipRect(float left,float right,float bottom):剪切一个矩形区域
- rotate(float degress,float px,float py):旋转
Paint:画笔
- setARGB(int a,int r,int g,int b)/setColor(int color)
- setPathEffect(PathEffect effect):设置绘制路径时的路径效果
- setStyle(Paint , Join join):设置画笔转弯处的链接风格
图形特效处理
Matrix控制变换
- setTranslate(float dx,float dy):控制Matrix进行平移
- setSkew(float kx,float ky,float px,float py):控制Matrix以px,py为轴心倾斜。
- setSkew(float kx,float ky):倾斜
- setRotate(float degress):旋转
- setScale(float sx , float sy):缩放
使用 Shader 填充Paint,它本身是个抽象类,提供了如下实现类
- BitmapShader:使用位图平铺的渲染效果
- LinearGradient:使用线性渐变来填充图形
- RadialGradient:使用圆形渐变来填充图形
- SweepGradient:使用角度渐变来填充图形
- ComposeShader:使用组合渲染来填充图形
逐帧动画
使用xml定义AnimationDrawable
<animation-list xmlns:android="...." android:oneshot="true">
<item android:drawable="res_name" android:duration="10" >
<item android:drawable="res_name" android:duration="10" >
...
</animation-list>
将AnimationDrawable设置为View的背景
view.setBackgroundResource(R.anim.animationDrawable);
anim = (AnimationDrawable)view.getBackground();
使用start() 开始动画,使用stop:停止动画
补间Tween动画
- 包括如下几个子类
- AlphaAnimation :透明度
- ScaleAnimation: 缩放
- TranslateAnimation:位移
- RotateAnimation:旋转
- 使用AnimationUtils工具类加载
使用属性动画
- 创建ValueAnimator或ObjectAnimator
- 为Animator对象设置属性
- (可选)监听动画事件
- 若有多个动画,使用AnimatorSet组合动画
- 使用start()启动动画
第八章数据存储与io
SharedPreferences轻量储存
获取SharedPreferences
通过Context提供的getSharedPreferences(String name,int mode);
mode的值有:
Context.MODE_PRIVATE:指定数据只能被本应用读写
Context.MODE_WORLD_READABLE:指定数据能被其他应用读
Context.MODE_WORLD_WRITEABLE:指定数据能被其他应用读写
获得储存的数据
SharedPreferences.getXXX(String key,xxx defValue)
编辑数据,通过Editor对象(SharedPreferences.edit())
SharedPreferences.Editor clear():清空数据
SharedPreferences.Editor putXXX(String key,xxx value):存入数据
SharedPreferences.Editor remove(String key) :删除指定数据
boolean commit():编辑完后提交
file存储
SQLite数据库
手势
GestureDetector代表一个手势检测器
GestureDetector.OnGestureListener:
- boolean onDown(MotionEvent e):按下
- boolean onFling(MotionEvent e1,MotionEvent e2,float velocityX,float velocityY):滑动,velocityX、velocityY代表滑动的速度
- void onLongPress(MotionEvent e):长按
- boolean onScroll(MotoinEvent e1,MotionEvent e2,float distanceX,float distanceY):滚动
- void onShowPress(MotionEvent e):按下
- boolean onSingleTapUp(MotionEvent e):轻击
使用GestureLibrary代表手势库,来添加和检测手势
第九章 使用contentprovider
使用contentptovider、ContentResolver实现数据交换
- 定义自己的ContentProvider,继承ContentProvider基类
- 在AndroidManifest.xml 中注册
实现以下方法
public boolean onCreate();
public Uri insert(Uri uri,ContentValues values);
public int delete(Uri uri,String selection,String[] selectionArgs);
public int update(Uri uri,ContentValues values,String selection,String[] selectionArgs);
public Cursor query(Uri uri,String[] projection ,String selection,String[] selectionArgs,String sortOrder);
public String getType(Uri uri)
- 通过Context.getContentResolver()获取ContentResolver对象
通过ContentResolver对象的对应方法来对ContentProvider数据进行增删改查操作
- 通过ContentProvider来监听ContentProvider数据的改变
- ContentProvider数据发生改变时程序就调用了 getContent().getContentResolver().notifyChange(uri,null)
- 然后就会触发监听器的 onChange(boolean selfChange)方法
- 使用 getContentResolver().registerContentOBserver(Uri.parse("Content://sms"),true,new Smsobserver(new Handle()));
第十章 service和broadcastReceiver
service
生命周期
IBinder onBinder(Intent intent):Ibinder用于通信;
void onCreate()
void onDestroy()
void StartCommand(Intent intent,int flags,int startId):每次调用startService(intent)都会回调
boolean onUnbind(Intent intent):当Service上所有绑定的对象都断开连接时都会回调
- 启动停止方式:
- 通过 content的startService(intent) ,stopService(intent)
- 通过 content的bindService(), unbindService()
- 与Service通信
- 在service中自定义个IBinder对象,该对象处理通信
- 在activity中通过bindService(Intent service,ServiceConnection conn,int flags)启动service,在 ServiceConnection对象的回调onServiceConnected(ConponentName name,Ibinder service)中获取IBinder对象
intentService
特点:
- 会创建单独的worker线程处理所有的intent请求
- worker线程处理OngandleIntent(),无须处理多线程
- 所有请求处理完会自动停止
- 默认实现OnBind()返回null
- 默认实现onStartCommand(),将请求intent添加到队列
跨进程调用service(AIDL Service)
- 创建AIDL文件
- 定义完AIDL接口后,会自动生成一个接口,该接口内包含一个Stub内部类,该类实现了Ibinder、ICat两个接口,而其中Stub将会作为远程Service的回调类 ,作为service的onBind()的返回值
电话管理器(TelephonyManager)
获取TelephonyManager
TelephonyManager tManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
- 获取网络和SIM卡信息(各种 getXXX() 方法)
监听手机来电
PhoneStateLister listener = new PhoneStateLister(){...};
tManager.listener(listener,PhoneStateLister.LISTEN_CALL_STATE);
短信管理器(SmsManager)
SmsManager sManager = SmsManager.getDefault();
PendingIntent pi = PendingIntent.getActivity(context,0,new Intent(),0);
//发送短信
sManager.sendTextMessage(number.toString,null,contentString,pi,null);
AudioManager
AudioManager aManager = (AudioManager)getSystemService(Service.AUDIO_SERVICE);
//调节音乐 增大音量
aManager.adjustStreamVolume(AudioManager.STREAM_MUSIC,AudioManager.ADJUST_RAISE,AudioManager.FLAG_SHOW_UI);
//降低 音乐 音量
aManager.adjustStreamVolume(AudioManager.STREAM_MUSIC,AudioManager.ADJUST_LOWER,AudioManager.FLAG_SHOW_UI);
//根据 isChecked确定是否静音
aManager.setStreamMute(AudioManager.STREAM_MUSIC,isChecked);
- setMicrophoneMute(boolean on):设置麦克风静音
- setMode(int mode):设置声音模式
- setRingerMode(int ringerMode):电话铃声模式
- setSpeakphoneOn(boolean on):是否打开扩音器
- setStreamMute:
- setStreamVolume(int streamType.int index,int flags):直接设置手机的制定类型的音量值
Vibrator震动器
AlarmManager
本质是一个全局定时器
BroadcastReceiver
第十一章多媒体
- 加载并创建
- sttic MediaPlayer create(Context context,Uri uri):从指定Uri装载音频文件,并返回新创建的MediaPlayer
- static MediaPlayer create(Context context , int resid):从resid资源ID对应的资源文件中装载音频文件,并返回新创建的MediaPlayer对象
- 控制播放方法
- start()
- stop()
- pause()
- prepare(),开始去装载指定的音频文件
- reset()
- 装载音频方法:
- setDataSource(String path):指定装载path路径所代表的文件
- setDataSource(FileDescriptor fd,long offset ,long length)
- setDataSource(FileDescriptor fd)
- setDataSource(Context context,Uri uri)
- 事件监听器
- setOnCompletionListener(MediaPlayer.OnCompletionListener listener):监听播放完成
- setOnErrorListener(MediaPlayer.OnErrorListener listener):监听播放错误
- setOnPreparedListener(MediaPlayer.OnPreparedListener listener):当调用prepare()时调用
- setOnSeekCompleteListener(MediaPlayer.OnSeekCompleteListener listener):当调用seek()方法时触发
使用SoundPool播放音效
- SoundPool(int maxStreams,int streamType,int srcQuality):第一个参数指定支持多少个声音,第二个参数指定声音类型,第三个参数指定声音品质
- load(Context context,int resId,int priority):从resid所对应的资源加载声音
- load(FileDescriptor fd,long offset,long length,int priority):加载fd对应的文件offset开始,长度为length
- load(String path,int priority)
int play(int soundID,float leftVolume,float rightVolume,int priority,int loop,float rate):播放声音
SoundPool soundPool = new SoundPool(10,AudioManager.STREAM_SYSTEM,5);
HashMap<Integer,Integer> soundMap = new HashMap<Integer ,Inreger>();
soundMap.put(1,soundPool.load(this,R.raw.bomb),1);
soundMap.put(2,soundPool.load(this,R.raw.shot),1);
soundPool.play(soundMap.get(1),1,1,0,0,1);
- 创建MediaRecorder对象
- setAudioSource()设置声音来源,一般传入MediaRecorder.AudioSource.MIC录制来自麦克风的声音
- setOutputFormat()设置录制的音频文件格式
- setAudioEncoder()、setAudioEncodingBitRate(int bitRate)、setAudioSamplingRate(int samplingRate)设置录制声音的编码格式、编码位率、采样率
- setOutputFile(String path)设置录制的 音频文件的保存位置
- prepare():准备录制
- start():开始录制
- stop():停止录制,并调用release()方法释放资源。
接上,在调用setAudioSource(int audio_source)方法时再调用setVideoSource(int video_source)设置图像来源
- 调用 setVideoEncoder()、setVideoEncodingBitRate(int bitRate)、setVideoFrameRate,设置所录制的视频编码格式,编码位率,每秒多少帧
- setPreviewDisplay(Surface sv):使用SurfaceView预览
使用camera拍照
第12章opengl与3d应用开发
跳过
第13章网络应用
ServerSocket 与 Socket
使用URL访问网络资源
使用URLConnection提交请求
- 调用URL对象openConnection()方法来调用URLConnection对象
- setRequestProperty():设置通用请求属性
- connect():建立实际的连接
- getInputStream():读取URL响应
- setDoOutput()、setDoInput()发送POST请求需要
- getOutputStream():获取输出流
使用HttpURLConnection
URLConnection的子类
- int getResponseCode():获取服务器的响应代码
- String getResponseMessage():获取服务器的响应消息
- String getRequestMethod():获取发送请求的方法
- void setRequestMethod(String method):设置发送请求的方法
使用HttpClient
httpClient会自动维护与服务器之间Session状态
- 创建HttpClient对象
- 创建HttpGet对象发送GET请求;创建HttpPost对象发送POST请求。
- HttpGet、HttpPost都可以使用setParams()添加请求参数;HttpPost可以使用SetEntity()设置请求参数
- 调用execute()发送请求,返回一个HttpResponse
调用HttpResponse的getAllHeaders()、getHeaders()等方法可以获取服务器的响应头;调用HttpResponse的getEntity()可以获取HttpEntity对象,该对象包装了服务器的响应内容
HttpClient httpClient = new DefaultHttpClient();
HttpGet get = new HttpGet("http://xx.xxx.xx/xx.jsp");
HttpResponse httpResponse = httpClient.excute(get);
HttpEntity entity = httpResponse.getEntity();
BufferedReader br = new BufferedReader(new InputStreamReader(entity.getContent));
....
HttpPost post = new HttpPost("Http://xx.xxx.xx/xx.jsp");
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("name",name)); params.add(new BasicNameValuePair("pass",pass));
post.setEbtity(new UrlEncodeFromEntity(params,HTTP.UTF_8));
HttpResponse response = httpClient.excute(post);
if(response.getStatusLine().getStatusCode() == 200){
...
}
使用WebView视图
- void goBack()
- void goForward()
- void loadUrl(String url)
- boolean zoomIn()
- boolean zoomOut()
- loadData(String data,String mimeType,String encoding):加载显示HTML代码
- loadDataWithBaseURL(String baseUrl,String data,String mimeTyep,String encoding)
- 使用WebView中的JavaScript调用Android方法
- 调用WebView关联的WevSettings的setJavaScriptEnabled(true)启用 JavaScript调用功能
- 调用WebView的addJavascriptInterface(Object object,String name)方法将object对象暴露给JavaScript
- 在JavaScript脚本中通过刚才暴露的name对象调用Android的方法