《瘋狂Android講義》筆記
第二章 android應用的界面編程
2.1 開發自定義的View
繼承View基類的子類,而後重寫View中的方法。android
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及其子類
子類:git
- ImageButton
- ZoomButton:能夠表明放大縮小按鈕
- ZoomControls:
QuickContactBadge:關聯聯繫人web
//一個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(列表視圖)sql
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):經過星星來表示進度canvas
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 ../>元素添加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的方法