Android基礎(chǔ)小結(jié)

Activity

創(chuàng)建:自定義類繼承Activity ?重寫 onCreate 方法

注冊:需要在 AndroidManifest.xml 中注冊 Activity

跳轉(zhuǎn):

顯示意圖跳轉(zhuǎn):(一般打開自己的Activity)

創(chuàng)建兩個類 為FirstActivity 和 SecondActivity 并在清單中聲明 不用配置意圖過濾器

label 為應(yīng)用名字 icon 為圖標(biāo) ?application 中的label 應(yīng)用界面中應(yīng)用名字 icon應(yīng)用設(shè)置界面的圖標(biāo)

通過Intent 帶參構(gòu)造函數(shù) Intent intent = new Intent(this,SecondActivity.class)

若打開其他應(yīng)用的 需要 new Intent(); intent.setClassName("包名","全類名") 并在清單文件中聲明 exported為 true

Intent 可以攜帶八種基本數(shù)據(jù)類型:boolean byte char short int float double long String 以及他們的數(shù)組形式

隱式意圖跳轉(zhuǎn):(一般讓其他應(yīng)用打開自己的Activity)

將第二個Activity在清單文件中 注冊 設(shè)置 意圖過濾器 intent-filter action"域名倒寫" ?category 配置為category.DEFAULT 系統(tǒng)默認(rèn)

Intent intent = new Intent();

intent.setAction(必須和清單文件中的action一樣);

intent.setDate(Uri.parse("itheima"+xxx))(與清單文件data scheme 內(nèi)容相同)

媒體類型 mimeType"父類型/子類型" intent.setType("父類型/子類型") 若既有data也有type 要intent.setDataAndType(data,type)

或者 intent.setAction(Intent.ACTION_CALL) intent.setDate(Uri.parse("tel:"+110);設(shè)置一個動作 攜帶數(shù)據(jù)

startActivity(intent);

生命周期:

foreground 前臺狀態(tài) ?執(zhí)行onResume(刷新數(shù)據(jù))后 onstart()

paused 暫停狀態(tài) ? ? ?若有透明應(yīng)用覆蓋或者有對話框應(yīng)用 覆蓋的時候onPause 恢復(fù)的時候onResume

stopped 停止?fàn)顟B(tài) ? ? onStop(停止刷新界面) 不可見而且不可以操作 按home鍵之后

simple 銷毀狀態(tài)onDestroy(釋放資源)

onCreate

界面的初始化 setcontentView ?findviewbyid

數(shù)據(jù)的初始化 文件/數(shù)據(jù)庫/網(wǎng)絡(luò)/其它的組件/sp

開啟其它的組件(開啟服務(wù),注冊廣播接收者)

動態(tài)注冊廣播接收者(onCreate注冊 onDestroy注銷 onstart注冊的onStop注銷 onResume注冊 onPause注銷)

onstart

onResume 刷新界面

onPause ? ?停止刷新界面

onStop

onDestroy 釋放資源 數(shù)據(jù)庫的鏈接 cursor sqlitedatabase bind的服務(wù) 廣播接收者注銷 退出線程

onRestart

創(chuàng)建 onCreate onstart onResume 按返回鍵后 onPause onStop onDestroy

按Home鍵 onPause onStop按home鍵返回 onRestart onstart onResume

startActivityForResult(intent,requestCode); (開啟另外一個Activity)

onActivityResult(int requestCode, int resultCode, Intent data);

setResult(resultCode, intent data); finish(); (返回數(shù)據(jù)的activity)

屏幕旋轉(zhuǎn)時生命周期:

onPause onStop onDestroy onCreate onstart onResum

1.默認(rèn):Activity會銷毀 屏幕旋轉(zhuǎn)后會創(chuàng)建新的Activity

2.寫死屏幕方向 ?在清單文件中screenOrientation landscape 水平 portrait 豎直

3.configChanges orientation|screenSize 隨著方向改變 不會銷毀生命周期

重寫onConfigurationChanged 屏幕旋轉(zhuǎn)生命周期方法 處理相關(guān)業(yè)務(wù)邏輯

Activity任務(wù)棧(啟動模式):

standard 默認(rèn)情況 只要調(diào)用startActivity就會創(chuàng)建新的實例

singleTop 棧頂只有一個實例 如果當(dāng)前的activity在任務(wù)棧的棧頂那么 不會創(chuàng)建新的實例 除此之外 不會影響實例的創(chuàng)建

(一系列調(diào)用的最后一個頁面 為了避免在這個頁面上再創(chuàng)建新的實例可以配置為singleTop)

singleTask 一個任務(wù)棧中只有一個實例 如果這個activity在棧頂 再次調(diào)用startactivity不會創(chuàng)建新的 實例 如果不在棧頂 并且實例存在

會把活著的實例上面的所有activity銷毀 把這個對象露出來 (應(yīng)用 的主界面可以配置為singleTask)

singleInstance 獨占一個任務(wù)棧 這個任務(wù)棧中只有一個實例 而且整個手機只有一個實例(慎用 打電 話的界面可以配置為singleInstance)

fragment

1.fragment入門

①創(chuàng)建一個java類 繼承Fragment重寫oncreateView方法

fragment 也會對應(yīng)一個布局文件 ?這個布局文件可以通過傳入的LayoutInflater加載到界面上 作為oncreateview的返回值

②在布局文件中聲明相應(yīng)的fragment節(jié)點

注意在聲明fragment節(jié)點時 ?fragment首字母小寫 ?name 必須制定 內(nèi)容是要顯示的Fragment的全類名

2.動態(tài)替換fragment(常用)

1.創(chuàng)建FirstFramment和second類繼承 重寫 oncreateView 創(chuàng)建布局 更改最小版本為11

在onCreateView 中 inflater.inflate(R.layout.first,null); ?將返回值作為方法的返回值

2.在Activity布局文件中 創(chuàng)建 ViewGroup(LinearLayout)為fragment容器 id為fragment_container

3在activity當(dāng)中 找到控件 獲取getfragmentManager 通過 fragmentManager 開啟事物 fragmentTransaction

4.通過事務(wù)調(diào)用.replace();傳入 android.R.id.content,new First 或者 R.id.fragment_container ?再提交.commit

5.getWindManager.GetDefaultDisplay().getWidth /getHeight 如果寬大于高 是橫屏 加載第二個 否則加載第一個

3.兼容低版本的寫法(classMainActivityextendsFragmentActivity)

所有的跟fragement相關(guān)的api Fragment FragmentManager v4包中獲取FragmentManager

要使用getSupportFragmentManager 這個方法在 FragmantActivity中才有

FragmentTransaction 都要使用android.support.v4包中的相關(guān)類

3.fragment的生命周期

oncreate 當(dāng)fragment被創(chuàng)建的時候 調(diào)用oncreate oncreateView 在這個方法當(dāng)中加載fragment的布局文件

onpause onStop 處理界面需要顯示的東西 狀態(tài)的保存

ondestory 資源的釋放

4.fragment之間的通信

1.新建LeftF與rigntF 重寫..創(chuàng)建布局文件 在LeftF添加按鈕(調(diào)用方法) 在rightF添加一個TextView 在主界面中 創(chuàng)建兩個線性布局 權(quán)重為1 寬度為0 高速為m并指定id

2.編寫 onCreateView中的返回值 在Activity中g(shù)etFramentManageer() 再開啟事務(wù).beginTranssaction 調(diào)用兩次replace .commit

3.(在Activity中 創(chuàng)建按鈕點擊 彈吐司方法(這里不適宜點擊事件的第四種寫法)) 在leftF中 view.find 設(shè)置點擊事件 彈吐司

4.在rightF中 view.find找到text控件 創(chuàng)建修改文字方法 給控件傳文字 ?在Activity中的.replace 中添加 第三個屬性為標(biāo)簽 ?在leftF中g(shù)etFM.gFBt(標(biāo)簽)得到對象后 調(diào)用修改文字的方法

Service

特點:

Service 在 Android 中是一種長生命周期的組件轿衔,它不實現(xiàn)任何用戶界面,是一個沒有界面的 Activity

Service 和其他組件一樣,都是運行在主線程中苍息,因此不能用它來做耗時的操作 如果要執(zhí)行耗時操作 需要 在里邊開一個子線程 new Thread(){}.start();

進(jìn)程特點: 哪個進(jìn)程被關(guān)閉是由安卓系統(tǒng)衡量對用戶相對的重要程度,更容易殺死看不到界面的進(jìn)程,試圖維持每個進(jìn)程盡可能的活著,有重要性層級結(jié)構(gòu).

Foreground process 前臺進(jìn)程 有Activity正在與用戶交互 service在執(zhí)行生命周期方法 廣播接收者在執(zhí)行onreceiver 優(yōu)先級最高

visible preocess 可視進(jìn)程 有一個Activity處于可見但不可操作的狀態(tài) 比如有個透明應(yīng)用蓋在上面 處于onPause狀態(tài)

Service preocess 服務(wù)進(jìn)程 后臺運行著用startService開啟的服務(wù) 沒有組件屬于前兩種情況

Background process 后臺進(jìn)程 有Activity 處于onStop但是沒有銷毀 沒有其他組件屬于前三種情況 后來進(jìn)程比較多

哪個先殺死 用LRU算法 最近使用的最后殺 最少使用最先殺

Empty process 空進(jìn)程

開啟方式:

startService:

startService(Intent) 通過這種方式開啟的服務(wù) 執(zhí)行的聲明周期方法: 第一次調(diào)用startService的時候 onCreate()->onStartCommand

再次調(diào)用startService ->onstartCommand

想停止用startservice開啟的服務(wù) stopService(intent); stopService 執(zhí)行之后 service會走 onDestroy()方法 執(zhí)行之后service銷毀 再次調(diào)用stopService沒有反應(yīng)

如果在activity中通過startService方法開啟一個服務(wù) 當(dāng)activity退出的時候service不會銷毀 依然在后 臺運行

只有手動調(diào)用stopService 或者在應(yīng)用管理器中關(guān)閉service 服務(wù)才會銷毀

通過startservice可以提高應(yīng)用的優(yōu)先級

bindService:(可以調(diào)用接口中的方法)

① bindService ?unbindService

② bindservice之后 生命周期 ?onCreate->onBind 多次調(diào)用bindService onBind只會執(zhí)行一次

③ activity退出的時候 必須解除跟service的綁定 ?在ondestroy 的時候調(diào)用 unbindService

④ unbindService多次調(diào)用會拋異常 只能調(diào)用一次

⑤ bindservice的時候傳入第二個參數(shù) 是ServiceConnection ?只有當(dāng) onBind方法返回不為空的時候 才會調(diào)用 onServiceConnected

可以將返回值 service 強轉(zhuǎn)為 MyBinder 類型(這個類是自己寫的 是 onBind的返回值類) 通過這個對象可以調(diào)用接口中的方法

AIDL:

讓其它應(yīng)用可以調(diào)用當(dāng)前應(yīng)用service中的方法

RPC remote procedure call 遠(yuǎn)程過程調(diào)用 ?AIDL 解決就是rpc的問題

IPC inter process communication 進(jìn)程間通信 每一個android應(yīng)用都運行在獨立的進(jìn)程中 所以 應(yīng)用之間的通信就是進(jìn)程間通信

Activity intent BroadCastReceiver 通過onReceive方法 可以處理其他應(yīng)用發(fā)來的廣播 通過Intent 攜帶數(shù)據(jù)

AIDL實現(xiàn)的過程 :

提供遠(yuǎn)程服務(wù)方法的應(yīng)用 :

① 創(chuàng)建一個Service 重寫onBind方法 在onBinder中返回一個Binder對象 需要遠(yuǎn)程調(diào)用的放發(fā)放到 這個Binder對象中

②在清單文件中聲明對應(yīng)的service 需要添加一個intent-filter 可以通過隱式意圖調(diào)用service

③ 創(chuàng)建一個接口 需要暴露給其它應(yīng)用調(diào)用的方法都聲明在這個接口中

④把接口文件的擴展名修改為 .aidl 需要注意 aidl文件不支持public 關(guān)鍵字

⑤修改service的代碼 讓MyBinder繼承Stub

遠(yuǎn)程調(diào)用服務(wù)的應(yīng)用

①用過隱式意圖以及bindService方式 開啟遠(yuǎn)程的服務(wù)

② 創(chuàng)建ServiceConnection的實現(xiàn)類

③在當(dāng)前應(yīng)用中創(chuàng)建一個目錄 目錄結(jié)構(gòu)跟提供遠(yuǎn)程服務(wù)的應(yīng)用aidl所在目錄結(jié)構(gòu)保持一致, 把aidl文 件copy過來 如果沒有問題 會在gen目錄下生成一個 Iservice.java文件 包名跟aidl文件的包名一致

④在onserviceConnected方法中 通過?把當(dāng)前的Ibinder對象轉(zhuǎn)化成遠(yuǎn)程服務(wù)中的接口類型 最終通過這個對象實現(xiàn)調(diào)用遠(yuǎn)程方法

LRU 剛用過的最后回收 最早用過的最先回收

BroadcastRecevier

特點:一對多 單向傳遞消息 不需要在清單文件中注冊(動態(tài)注冊)

開發(fā)過程:

①寫一個類繼承BroadcastReceiver

②重寫onReceive方法

③清單文件注冊(有的時候不能這么搞,需要通過代碼動態(tài)注冊) 動態(tài)的要求控件活著 才能接收到廣播

④可選 有的廣播接收者需要權(quán)限 如果需要權(quán)限還得在清單文件中聲明權(quán)限

有序廣播和無序廣播的區(qū)別:

有序廣播可以被中斷 ?有序廣播的內(nèi)容可以被修改 ?abordBroadCast(); 如果調(diào)用這個方法之后 廣播 中斷了說明是有序廣播

接收有序廣播的時候 聲明priority可以確定接收等級 范圍是0-1000

publicvoidsend(Viewv){

Intentintent=newIntent();

intent.setAction("com.it.sendrice");

//收到廣播時需要的權(quán)限

StringreceiverPermission=null;

//作為最終的廣播接受者

BroadcastReceiverresultReceiver=newFinalReceiver();

//最終的廣播接收者 傳null在主線程處理

Handlerscheduler=null;

//數(shù)據(jù)

StringinitialData="皇帝發(fā)放賑災(zāi)糧 每人一百斤";

sendOrderedBroadcast(intent,receiverPermission,resultReceiver,scheduler,Activity.RESULT_OK,initialData,null);

}

無序廣播不能被中斷 ?無序廣播內(nèi)容不可以修改 ? ? abordBroadCast(); 如果調(diào)用之后報紅色日志

publicvoidsendbroadcast(Viewv){

Intentintent=newIntent();

intent.setAction("com.it.broadcast");? //接收廣播程序中注冊的action與這個相同

intent.putExtra("key","hello");

sendBroadcast(intent);

}

廣播攜帶的數(shù)據(jù)類型:Boolean ? ? Bundle ? ? byte ? ? char ? ?CharSequce ? double ? ? float ? ? int ? ? long ? ?short ? ?string ? Serializable ? ?Parcelable 和其數(shù)組

動態(tài)注冊廣播接收者:通過在activity 或者 service中調(diào)用 registerReceiver方法 注冊廣播接收者

BroadcastReceiverreceiver=newScreenLightRecriver();//這個類為自己創(chuàng)建的

//意圖過濾器

IntentFilterfilter=newIntentFilter();

//意圖過濾器添加ACTION

filter.addAction("android.intent.action.SCREEN_OFF");

filter.addAction("android.intent.action.SCREEN_ON");

//動態(tài)注冊一個廣播

registerReceiver(receiver,filter);

動態(tài)注冊的廣播接收者:只有調(diào)用了注冊的方法之后才能夠收到廣播 靜態(tài)注冊廣播接受者 在清單文件中聲明一個receiver節(jié)點

除了一些特殊的廣播接收者必須通過 動態(tài)方式注冊 只要在清單文件中聲明了對應(yīng)的receiver 不管應(yīng)用是否在運行都可以收到廣播

動態(tài)注冊的廣播接收者通過當(dāng)前Activity銷毀的時候需要注銷掉

contentprovider/ contentresolver

內(nèi)容提供者,內(nèi)容解析者

意義:跨應(yīng)用提供數(shù)據(jù) 讓其他應(yīng)用訪問本應(yīng)用數(shù)據(jù)庫中的內(nèi)容

實現(xiàn)步驟:

① 創(chuàng)建一個類 繼承ContentProvider 重寫里面方法

② 在清單文件中注冊相應(yīng)provider ?必須指定authorities 屬性 還要添加一個屬性 exported = true

③ 在provider中處理uri匹配相關(guān)內(nèi)容

創(chuàng)建URI匹配器 在provider 中搞靜態(tài)代碼塊 在static代碼塊中添加 uri匹配的規(guī)則

根據(jù)業(yè)務(wù)邏輯 在不同的數(shù)據(jù)庫操作方法中 處理uri匹配的流程

④ 其他應(yīng)用訪問contentprovider方法

獲得contentresolver內(nèi)容解析者對象 getContentResolver

通過contentresolver調(diào)用 增刪改查 方法訪問contentprovider

需要注意 uri 要以content://開頭 ?具體的路徑 要跟contentprovider中 定義的uri匹配規(guī)則匹配上

contentObserver內(nèi)容觀察者:

在數(shù)據(jù)內(nèi)容發(fā)生改變的地方通過contentResolver發(fā)送數(shù)據(jù)變化的通知 notifyChange

在需要接受變化的地方 注冊一個內(nèi)容觀察者(可以在同一個應(yīng)用中 也可以是在不同的應(yīng)用中)

①寫一個類繼承ContentObserver 重寫onChange方法

②通過contentResolver 調(diào)用registerObserver方法注冊內(nèi)容觀察者

resolver.registerContentObserver(uri, false, new MyObserver(new Handler()) );

//第一個參數(shù) uri 把內(nèi)容觀察者注冊到這個uri上 如果有通知 說明這個uri對應(yīng)的 內(nèi)容發(fā)生改變 內(nèi)容觀察者就會收到通知

//第二個參數(shù) 路徑匹配的規(guī)則 如果傳入true 路徑前部分匹配上就可以收到通知 如 果傳false只有整個路徑都匹配上才能收到通知

//第三個參數(shù) 內(nèi)容觀察者

文件的存儲

SharedPrefenrences

可以保存的數(shù)據(jù)類型比較少 所以 用sp來保存一些簡單的配置信息boolean string int long float Set

①獲取sp的實例 getSharedPreferences("文件名",Mode_private);

②讀內(nèi)容 getXXXX(key,默認(rèn)值); 獲取 SharedPreferences的Editor edit(); editor.putXXXX(key,value); commit();提交 只有調(diào)用了這個方法 保存的內(nèi)容才會存到本地

保存位置為包名文件下 一個文件 保存格式為xml格式

上下文獲取(context)

上下文 描述了當(dāng)前應(yīng)用的環(huán)境

是一個接口 可以通過上下文訪問到跟當(dāng)前應(yīng)用相關(guān)的資源 資源包括系統(tǒng)的資源(getsystemservice

獲取系統(tǒng)的服務(wù) getwallpaper 獲取壁紙) 也包括應(yīng)用的私有的資源 ?getAssets 獲取assets目錄下的內(nèi)容

getResource() 獲取res目錄對應(yīng)的api 也可以做應(yīng)用級別的調(diào)用 開啟一個activity startActivity ?開啟服務(wù) startService

getFileDir 獲取與應(yīng)用相關(guān)的私有路徑getAbsolutePath()返回抽象路徑名的絕對路徑名字符串

getPackageManags 獲取應(yīng)用包管理器 getPackageName獲取應(yīng)用包名

//通過上下文獲取應(yīng)用相關(guān)的私有路徑 不要用寫死路徑的方式

//File file = new File(context.getFilesDir().getAbsolutePath()+"/info.txt");FileOutputStream fos = new FileOutputStream(file);

可以通過這行取代上邊兩行 FileOutputStream fos = context.openFileOutput("info2.txt", Context.MODE_PRIVATE);

//通過上下文的api 獲取到data/data/包名/files目錄下對應(yīng)文件的 輸入流

FileInputStream fis = context.openFileInput("info2.txt");

sd卡

API=Environment環(huán)境 getExternalStprageState 獲取外部存儲器的狀態(tài) MEDIA_MOUNTED 存在并且可讀寫

getExternalStorageDirectory 獲取sD卡的路徑

通過這個api就可以在存儲的時候 Environment.getExternalStorageDirectory(),"info2.txt"

數(shù)據(jù)庫

第一步: 創(chuàng)建一個類繼承 SQLiteOpenHelper ?并實現(xiàn)父類的構(gòu)造

第二步 ?從寫onCreate 方法 和onUpgrade 方法

第三步 ?在Activity中 創(chuàng)建MySQLOpenHelper對象( 注意 !!!! 至此并沒有創(chuàng)建數(shù)據(jù)庫)

第四部 ?調(diào)用 MySQLOpenHelper的getReadableDatabase或getWriteableDatabase方法獲 取SQLiteDataBase對象

增加 刪除 改變 使用 execSQL

查詢使用 rawQuery 得到curor 后遍歷

curor相關(guān)方法 moveToNext() 移動到下一行 ? ?getCount() 返回查詢到的結(jié)果一共有多少行

getColumnCount()返回一條結(jié)果中有多少列

getString(index), getInt(index) 根據(jù)列序號返回相應(yīng)記錄(序號從0開始)

或者 ? 使用封裝好的api ? ? ①insert方法 ? ? ? ? ? ? ? ?②delete方法 ? ? ? ? ? ? ? ?③update方法 ? ? ? ? ? ? ? ?④query方法

訪問網(wǎng)絡(luò)

獲取&提交數(shù)據(jù)

servlet 是運行在 Web 服務(wù)器中的小型 Java 程序狸臣。servlet 通常通過 HTTP(超文本傳輸 協(xié)議)接收和響應(yīng)來自 Web 客戶端的請求苛秕。

①創(chuàng)建一個類 繼承HttpServlet ②重寫兩個方法 doGet ?doPost 這兩個方法都接受相同的參數(shù)

http協(xié)議

HTTP城看,HyperText Transfer Protocol

超文本傳輸協(xié)議 目前使用的版本 1.1 ?每次鏈接之后可以保持鏈接不斷 ?直到所有數(shù)據(jù)加載完畢之后 再斷開鏈接

之前老版本 1.0 每次連接之后 必須斷開鏈接 內(nèi)容沒請求完 下次請求還需要創(chuàng)建新的tcp鏈接

http 請求 比如 在瀏覽器中輸入地址 回車 向服務(wù)端請求數(shù)據(jù) 這個操作就是一個http請求

響應(yīng) 服務(wù)端給瀏覽器返回數(shù)據(jù)就是http響應(yīng)

請求方式

常用的有兩種 ?put head trace delete

get ? ? ? ①url后面 url和具體的參數(shù)用? 不同的提交參數(shù)之間 &隔開 key=value

②get方式提交所有的參數(shù)都在地址欄中顯示 沒有post安全

③ 瀏覽器對地址欄接受參數(shù)的長度有限制 所以get方式不能提交大量數(shù)據(jù) (2k~8k) get方式提交參數(shù)的長 度<2k 的

post ? ?① 參數(shù)的提交是放到請求體中

② 比get方式更安全

③ 提交參數(shù)的長度不受限制 ?文件上傳這樣的操作一定要使用post

Handler原理

Handler ?Message ?MessageQueue ?Looper

①Looper 輪詢器 通過Looper去消息隊列取消息 當(dāng)主線程創(chuàng)建的時候 就會創(chuàng)建一個looper looper在new的時候 會創(chuàng)建一個MessageQueue 所以 一個線程對應(yīng)一個Looper一個Looper對應(yīng)一個MessageQueueLooper 創(chuàng)建之后 必須調(diào)用loop方法 loop方法中 有一個死循環(huán) 這個死循環(huán)會不斷去消息隊列里取 消息 取出消息之后 就會調(diào)用 handler的handlemessage方法處理消息

②MessageQueue 通過消息隊列 把消息進(jìn)行排序 排序的依據(jù)就是消息要執(zhí)行的時間

③Handler 用來發(fā)送消息 sendMessage->sendMessageAtTime(Message, long uptimeMillis) 第一個參數(shù) 要發(fā)送的消息 第二個參數(shù) 消息要執(zhí)行的而時間 ?這個時間就是消息在消息隊列中排序的依據(jù)sendMessage 最終會調(diào)用MessageQueue 的enqueueMessage方法 把消息放到消息隊列進(jìn)行排序 ? ? ?handler 處理消息 handlerMessage

需要記憶的 刻骨銘心的 ?聯(lián)網(wǎng)必須開線程 ?子線程不能更新UIANR 應(yīng)用沒有響應(yīng)

(① handler ?② runOnUIThread())

聯(lián)網(wǎng)① 需要權(quán)限 android.permission.INTERNET

② 用到的基類 HttpURLConnection ?URL url= new URL(String);

url.openConnection();

HttpURLConnection .setRequestMethod()設(shè)置請求方法

setConnectTimeOut 設(shè)置超時時間

getResponseCode 獲取響應(yīng)碼

getInputStream 獲取返回的輸入流

handler ?Message msg = Message.obtain(); 獲取消息

msg.obj 通過這個屬性攜帶數(shù)據(jù)

msg.what 通過這個int變量區(qū)分不同消息

handler.sendMessage(Message)

handler.sendEmptyMessage(int what); 發(fā)送空消息 runOnUIThread(Runnable );

Bitmap bm =BitmapFactory.decodestream(inputstream) ?從流解析一張圖片

BitmapFactory.decodefile(String path) 從路徑解析圖片

ImageView.setImageBitmap(Bitmap bm ) 給imageview設(shè)置圖片

使用httpurlconnection 把數(shù)據(jù)提交到服務(wù)器

get方式提交 跟直接獲取數(shù)據(jù)不提交參數(shù)的時候 區(qū)別很小 唯一有不同的地方是 參數(shù)要拼接到URL的后面 拼接的時候需要注意 如果有中文的參數(shù) 需要進(jìn)行URL編碼 URLencoder.encode();

post方式提交 需要設(shè)置請求頭 Content-Type Content-Length 請求的參數(shù)是通過請求體以流的方式提交到服務(wù)端的 打開輸出流 setDoOutput(true) 獲取輸出流 ?getOutputStream();

需要注意 請求的參數(shù)中如果包含中文內(nèi)容也需要進(jìn)行URL編碼

以httpclient方式把數(shù)據(jù)提交到服務(wù)器

①獲取HttpClient 接口 ?找到實現(xiàn)類 Default ?Simple ? Basic Base 找到 無參構(gòu)造函數(shù) DefaultHttpClient();

②通過請求獲取響應(yīng) ? execute(HttpRequest);->httpresponse

③HttpRequest也是接口 發(fā)現(xiàn)根據(jù)不同的請求方式有對應(yīng)的實現(xiàn)類 HttpGet HttpPost

多線程下載

①多下程下載的好處 可以突破服務(wù)端對單一線程的速度限制

②多線程下載的原理 2.1服務(wù)端得支持多線程讀取數(shù)據(jù) 可以通過Range頭來通知服務(wù)端 當(dāng)前線程請求的數(shù)據(jù)范圍 conn.setRequestProperty("Range", "bytes="+startIndex+"-"+endIndex);

range頭成功返回數(shù)據(jù) 響應(yīng)碼是206 2.2客戶端通過RandomAccessFile 進(jìn)行多線程寫 寫的時候調(diào)用RandomAccessFile的seek方法

不 同線程移動到不同的位置開始寫文件

①聯(lián)網(wǎng) 獲取要下載文件的大小 ②本地創(chuàng)建一個相同大小的文件 ③根據(jù)線程的數(shù)量和要下載文件的大小計算每個線程要下載的數(shù)據(jù)范圍

④開啟線程 聯(lián)網(wǎng) 拿著計算好的數(shù)據(jù)范圍到服務(wù)端請求數(shù)據(jù) ?響應(yīng)碼206 ⑤通過RandomAccessFile保存文件 調(diào)用seek方法

UI相關(guān)

listview

ListView 入門

這個控件是用垂直滾動的列表展示條目.由ListAdapter(列表適配器)提供條目.

1.在xml文件中添加ListView控件 添加id 找到控件 設(shè)置一個適配器 寫一個類 實現(xiàn)BaseAdapter(接口的抽象類) 重寫4個方法

2.getView方法 通過這個方法創(chuàng)建條目的界面 決定了每一個條目長成什么樣子 新建TextView 設(shè)置數(shù)據(jù)

ListView 優(yōu)化

1.getCount 方法決定要展示多少條目; convertview 為空表示目前沒有view對象被移出屏幕

2.判斷convertview== null 創(chuàng)建TextView對象展示條目 ?如果不為空 tv_text=()covertView ;

fastScrollEnabled 允許快速滾動

ListView展示數(shù)據(jù)的原理(MVC)

view 視圖 ? ?controller 控制器 ? model 數(shù)據(jù)模型

ListView ? ? baseAdapter ? ? ? ? Arraylist

TextView 文本展示

EditText 文本輸入框

Button 按鈕

Imageview 圖片

ImageButton 圖片按鈕

RadioGroup ?與單選按鈕有關(guān)

CheckBox ?勾選框booleanchecked?=cb.isChecked()if(checked)?{}else{} 可根據(jù)勾選狀態(tài)做響應(yīng)的操作

progressbar ?進(jìn)度條style="@android:style/Widget.ProgressBar.Horizontal"可設(shè)置為橫向的

seekbar可拖動的進(jìn)度條

AlertDialog 對話框

progressDialog ?進(jìn)度條

AutocompleteTextView ?自動補全的TextView

Menu 菜單

Surfaceview 視頻

VideoView 視頻

多媒體

圖片處理

通過Matrix 矩陣rotate 旋轉(zhuǎn)Translate 平移?Scale縮放

每次set后圖片都會恢復(fù) 如果想在set基礎(chǔ)上操作 需用post方法

大圖加載:

通過比較圖片分辨率和屏幕分辨率 如果圖片分辨率大 需要進(jìn)行壓縮,壓縮的大小就是 圖片分辨率和屏幕分辨率寬度和高度的比例

如果inJustDecodeBounds設(shè)置為true那么再調(diào)用BitmapFactory.decodeXXX方法的時候只會讀取圖片的寬度和高度

//取寬度和高度計算出來的比例的最大值 作為壓縮的大小

option.inSampleSize = Math.max(Math.round(heightIndex), Math.round(widthIndex));

option.inJustDecodeBounds = false;

創(chuàng)建圖片副本:

//通過BitmapFactory加載圖片

//創(chuàng)建出一張跟原圖一樣大的空白圖片 這個圖片可以修改 ?mutable

Bitmap bm = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), bitmap.getConfig());

//通過canvas畫圖canvas.drawBitmap(bitmap, matrix, paint);

音頻視頻的播放

MediaPlayer播放:

new MediaPlayer();

player.setDataSource("mnt/sdcard/xpg.mp3");//設(shè)置數(shù)據(jù)源

player.prepare();player.start();

Surfaceview播放

VideoView 播放

Vitamio播放動畫:導(dǎo)入開源項目

動畫

Animation and Graphics Overview 通過安卓提供的api讓ui動起來 也可以畫 2d或者3D動畫 3.0之后加入了屬性動畫

幀動畫 Drawable Animation

補間動畫view Animation

使用xml方式定義補間動畫 ①在res目錄下創(chuàng)建一個anim目錄 在里面聲明xml文件

②在代碼中使用animationUtils.loadAnimation加載需要注意 補間動畫/view動畫 不會改變控件的位置

屬性動畫property Animation (android 3.0之后加入)

屬性動畫 確實修改了控件的屬性 如果使用的屬性動畫 看到控件位置改變了 實際的位置也改變了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末潘飘,一起剝皮案震驚了整個濱河市乐严,隨后出現(xiàn)的幾起案子瘤袖,更是在濱河造成了極大的恐慌,老刑警劉巖昂验,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件捂敌,死亡現(xiàn)場離奇詭異,居然都是意外死亡既琴,警方通過查閱死者的電腦和手機黍匾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來呛梆,“玉大人锐涯,你說我怎么就攤上這事√钗铮” “怎么了纹腌?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長滞磺。 經(jīng)常有香客問我升薯,道長,這世上最難降的妖魔是什么击困? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任涎劈,我火速辦了婚禮,結(jié)果婚禮上阅茶,老公的妹妹穿的比我還像新娘蛛枚。我一直安慰自己,他們只是感情好脸哀,可當(dāng)我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布蹦浦。 她就那樣靜靜地躺著,像睡著了一般撞蜂。 火紅的嫁衣襯著肌膚如雪盲镶。 梳的紋絲不亂的頭發(fā)上侥袜,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天,我揣著相機與錄音溉贿,去河邊找鬼枫吧。 笑死,一個胖子當(dāng)著我的面吹牛宇色,可吹牛的內(nèi)容都是我干的由蘑。 我是一名探鬼主播,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼代兵,長吁一口氣:“原來是場噩夢啊……” “哼尼酿!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起植影,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤裳擎,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后思币,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鹿响,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年谷饿,在試婚紗的時候發(fā)現(xiàn)自己被綠了惶我。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡博投,死狀恐怖绸贡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情毅哗,我是刑警寧澤听怕,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站虑绵,受9級特大地震影響尿瞭,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜翅睛,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一声搁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧捕发,春花似錦疏旨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至霞玄,卻和暖如春骤铃,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背坷剧。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工惰爬, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人惫企。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓撕瞧,卻偏偏與公主長得像,于是被迫代替她去往敵國和親狞尔。 傳聞我的和親對象是個殘疾皇子丛版,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,756評論 25 707
  • 最近剛從舊公司離職,為面試在做準(zhǔn)備偏序,因為平時開發(fā)CV大法用得比較多页畦,很多基礎(chǔ)知識掌握得不是很牢靠以及很多工具框架只...
    黎清海閱讀 2,177評論 1 19
  • “我們到了一個略顯尷尬的年紀(jì)豫缨,不再那么年輕了卻也沒有足夠的成長;想依靠自己卻發(fā)現(xiàn)還差一點端朵;想要往前走卻發(fā)現(xiàn)前路漫漫...
    張果果灬閱讀 273評論 0 0
  • 一級標(biāo)題 二級標(biāo)題 三級標(biāo)題 正文:你好好芭,我在練習(xí)寫作。 方法一 方法二 策略一 鏈接 書寫的力量 圖片 引用 老...
    睿思客閱讀 185評論 0 1
  • 廢話 由于工作原因冲呢,經(jīng)常需要做服務(wù)端與客戶端的交互測試舍败,判斷分析問題點。話說這種問題看似簡單敬拓,實際過程中瓤湘,比較容易...
    舌尖上的大胖閱讀 306評論 0 1