配置文件中的broadcast receiver
<receiver android:name="XXX">
<intent-filter>
</intent-filter>
</receiver>
在配置文件中完成聲明后,即使應(yīng)用當(dāng)前并未運(yùn)行,只要有匹配的broadcast intent的發(fā)來,broadcast receiver就會(huì)接收。收到intent后,onReceiver(...)就會(huì)運(yùn)行,然后broadcast receiver被銷毀。
發(fā)送broadcast intent
1.創(chuàng)建intent,intent中定義動(dòng)作action;
2.sendBrocast(Intent)。
動(dòng)態(tài)broadcast receiver
使用
1.在代碼中注冊receiver,調(diào)用registerReceiver(BroadcastReceiver,IntentFilter);
注意:IntentFilter可調(diào)用addCategory(String)、addAction(String)和addDataPath(String)等方法達(dá)到和在xml中配置intent-filter同樣的效果。
2.取消注冊,調(diào)用unregisterReceiver(BroadcastReceiver,IntentFilter)。
注意:這兩個(gè)方法是對應(yīng)的,有注冊就一定要取消注冊。
接收范圍
一般來說,broadcast receiver是可以被系統(tǒng)中的任何應(yīng)用監(jiān)聽和觸發(fā)的。
將其限制在應(yīng)用內(nèi)部內(nèi)使用:
1.receiver聲明在配置文件中,在receiver標(biāo)簽上添加android:exported="false";
2.創(chuàng)建并使用私有權(quán)限。
創(chuàng)建并使用私有權(quán)限
創(chuàng)建私有權(quán)限:
在配置文件中使用<permission>標(biāo)簽:
1.權(quán)限名;
2.protectionLevel:確定私有權(quán)限使用方式,僅限于內(nèi)部應(yīng)用使用權(quán)限通常用signature。
eg:<permission android:name="權(quán)限名"
android:protectionLevel="signature"/>
使用:
1.在配置文件中聲明使用私有權(quán)限,eg:<uses-permission android:name="權(quán)限名"/>;
2.發(fā)送帶有權(quán)限的broadcast:調(diào)用sendBroadcast(...,權(quán)限名);
3.接收:調(diào)用registerReceiver(...,權(quán)限名,...)。
protectionLevel屬性值:

receiver與長時(shí)運(yùn)行任務(wù)
在receiver中進(jìn)行耗時(shí)操作:
1.將耗時(shí)操作交到Service中處理,通過broadcast receiver啟動(dòng)Service;
2.使用BroadcastReceiver.goAsync(),該方法返回一個(gè)BroadcastReceiver.PendingResult對象,使用該對象提供結(jié)果。存在不支持舊設(shè)備和不靈活的缺點(diǎn)。
網(wǎng)頁瀏覽
1.使用隱式Intent啟動(dòng)系統(tǒng)瀏覽器,并在其中打開URL指向的網(wǎng)頁;
2.使用WebView。
WebView的使用
1.布局中添加WebView控件;
2.配置WebView設(shè)置:
① 調(diào)用getSetting()獲得WebSettings實(shí)例;
② 調(diào)用方法完成設(shè)置,如WebSettings.setJavaScriptEnabled(true)啟用JavaScript;
3.配置WebViewClient,通過setWebViewClient(WebViewClient)去覆蓋里面要實(shí)現(xiàn)的方法,其中shouldOverrideUrlLoading(...),返回true,表示W(wǎng)ebView不處理傳入的url,交由默認(rèn)的WebViewClient也就是系統(tǒng)瀏覽器處理,返回false,表示交由WebView處理;
4.要在2.完成之后才進(jìn)行,調(diào)用loadUrl(String url)加載網(wǎng)頁(當(dāng)然3.中的shouldOverrideUrlLoading(...)返回true的話,這個(gè)方法等于不起作用了)。
自定義View和觸摸事件
分類
- 簡單視圖:可以有復(fù)雜的內(nèi)部,不包含子視圖,基本都執(zhí)行定制繪制;
- 聚合視圖:由一些其它視圖對象組成。通常管理者子視圖,但不負(fù)責(zé)執(zhí)行定制繪制,圖形繪制任務(wù)都交給了各個(gè)子視圖。
步驟
- 選擇超類。簡單視圖,View就是空白畫布,而聚合視圖則應(yīng)該選擇好合適的布局類;
- 繼承選定的超類,并至少覆蓋一個(gè)超類構(gòu)造方法,或者在自定義的構(gòu)造方法里,調(diào)用超類的構(gòu)造方法;
- 覆蓋其它關(guān)鍵方法,以定制視圖行為。
注意:在布局文件使用android.view和android.widget包之外的自定義View的時(shí)候,必須使用全路徑類名,這樣布局inflater才能找到自定義View來解析。
處理觸摸事件
一般設(shè)置觸摸事件監(jiān)聽器:
public void setOnTouchListener(View.OnTouchListener l)
而自定義View可以直接覆蓋:
public boolean onTouchEvent(MotionEvent event)
MotionEvent可以用來描述包括位置和動(dòng)作的觸摸事件,MotionEvent對象調(diào)用getAction()獲得動(dòng)作值。通常是以下四個(gè)動(dòng)作:
- ACTION_DOWN:用戶手指觸摸到屏幕;
- ACTION_MOVE:用戶在屏幕上移動(dòng)手指;
- ACTION_UP:用戶手指離開屏幕;
- ACTION_CANCEL:父View攔截了觸摸事件。
onDraw(...)內(nèi)的圖形繪制
自定義View覆蓋:
protected void onDraw(Canvas canvas)
- Canvas類具有需要的所有繪制操作。其方法可指定繪制的位置和圖形,例如線條、圓形、矩形等;
- Paint類決定如何進(jìn)行繪制操作。其方法可指定繪制圖形的特征,例如是否填充圖形,使用什么字體進(jìn)行繪制等。
使用SQLite本地?cái)?shù)據(jù)庫
Android內(nèi)置了操作SQLite的Java前端,該前端的SQLiteDatabase類負(fù)責(zé)提供Cursor實(shí)例形式的結(jié)果集。
Android提供了一個(gè)SQLiteOpenHelper幫助類,里面封裝了一些存儲應(yīng)用數(shù)據(jù)的常用數(shù)據(jù)庫操作,如創(chuàng)建、打開以及更新數(shù)據(jù)庫等。
實(shí)現(xiàn)SQLiteOpenHelper的子類需要覆蓋兩個(gè)方法:
- onCreate(SQLiteDatabase):為新建數(shù)據(jù)庫創(chuàng)建表結(jié)構(gòu);
- onUpgrade(SQLiteDatabase, int, int):執(zhí)行遷移代碼,實(shí)現(xiàn)不同版本間的數(shù)據(jù)庫結(jié)構(gòu)升級或轉(zhuǎn)換。
SQLiteOpenHelper類有兩個(gè)訪問SQLiteDatabase實(shí)例的方法:
- getWritableDatabase():需要可寫模式數(shù)據(jù)庫時(shí)使用;
- getReadableDatabase():需要只讀模式數(shù)據(jù)庫時(shí)使用。
一般來說,對于既定的SQLiteOpenHelper類實(shí)例,兩者的調(diào)用,返回的SQLiteOpenHelper類實(shí)例是一樣的,但在某些情況,如磁盤空間滿了,可能無法獲得可寫數(shù)據(jù)庫,只能獲得只讀數(shù)據(jù)庫。
查詢SQLiteDatabase可返回描述結(jié)果的|Cursor實(shí)例。Cursor將結(jié)果集看作一系列的數(shù)據(jù)行和數(shù)據(jù)列,但僅支持String以及基本數(shù)據(jù)類型的值。