BroadcastReceiver廣播接收者
系統(tǒng)的一些事件取董,比如來電,來短信咬扇,等等甲葬,會發(fā)廣播廊勃;可監(jiān)聽這些廣播懈贺,并進行一些處理;
Android3.2以后坡垫,為了安全起見梭灿,對于剛安裝的應(yīng)用,需要通過點擊進入應(yīng)用(界面冰悠,用戶確認之后)堡妒,接收者才能起作用;
以后即使沒有啟動其界面溉卓,也能接收到廣播皮迟;
1、定義廣播接收者
1)定義類繼承BroadcastReceiver桑寨,重寫onReceive方法
2)清單文件中聲明伏尼,需要在其中配置指定接收廣播的類型;
3)當接收到匹配廣播之后就會執(zhí)行onReceive方法尉尾;
4)有序廣播中爆阶,如果要控制多個接收者之間的順序,可在配置priority屬性沙咏,系統(tǒng)默認為0辨图,值越大,優(yōu)先級越高肢藐;
5)BroadcastReceiver除了在清單文件中聲明故河,也可以在代碼中聲明,使用registerReceiver方法注冊Receiver吆豹;
2鱼的、廣播的分類
1)普通廣播:
普通廣播不可中斷杉女,不能互相傳遞數(shù)據(jù);
2)有序廣播:
廣播可中斷鸳吸,通過調(diào)用abortBroadcast()方法熏挎;
接收者之間可以傳遞數(shù)據(jù);
3晌砾、廣播接收者的注冊方式
4大組件中坎拐,只有廣播接收者是一個非常特殊的組件,其他3大組件都需要在清單文件中注冊养匈;
廣播接收者哼勇,有2中注冊方式:清單文件與代碼方式,區(qū)別:
1)清單文件注冊廣播接收者呕乎,只要應(yīng)用程序被部署到手機上积担,就立刻生效,不管進程是否處于運行狀態(tài)猬仁;
2)代碼方式帝璧,如果代碼運行了,廣播接收者才生效湿刽,如果代碼運行結(jié)束的烁,廣播接收者,就失效诈闺;
這屬于動態(tài)注冊廣播渴庆,臨時用一下,用的時候雅镊,register襟雷,不用時unregister;
代碼方式示例:
4仁烹、發(fā)送廣播
1)發(fā)送普通廣播
①耸弄、使用sendBroadcast()方法可發(fā)送普通廣播;
②晃危、通過Intent確定廣播類型叙赚,可攜帶數(shù)據(jù),所有接收者都可以接收到數(shù)據(jù)僚饭,數(shù)據(jù)不能被修改震叮,不會中斷;
接收者無序(試驗測試鳍鸵,是按照安裝順序來接收的);
③苇瓣、廣播時,可設(shè)置接收者權(quán)限偿乖,僅當接收者含有權(quán)限才能接收击罪;
④哲嘲、接收者的也可設(shè)置發(fā)送方權(quán)限,只接受含有相應(yīng)權(quán)限應(yīng)用的廣播媳禁;
發(fā)送者:
Intent intent = newIntent("com.itheima.broadcast.TEST");//指定動作眠副;接收者,需要配置intent filter才能接受到此廣播
intent.setFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);//包含未啟動的過的應(yīng)用(也可以收到廣播)竣稽,默認為不包含
intent.putExtra("data", "這是來著廣播發(fā)送者發(fā)來的賀電");//廣播發(fā)送者intent中的數(shù)據(jù)囱怕,接收者,修改不了
sendBroadcast(intent, null);//發(fā)送無序廣播毫别,異步獲取數(shù)據(jù)娃弓,不可中斷,接收者之間不可傳數(shù)據(jù)
接收者:
public class AReceiver extendsBroadcastReceiver {
publicvoid onReceive(Context context, Intent intent) {
System.out.println("AReceiver:" +intent.getStringExtra("data"));
}
}
注意:
如果要在廣播接收者中打開Activity岛宦,需要設(shè)置一下Intent.FLAG_ACTIVITY_NEW_TASK台丛,因為廣播接收者是沒有Activity任務(wù)棧的
所以需要加上這個標記,方能在廣播接收者中打開Activity砾肺,如:
2)發(fā)送有序廣播
a.sendOrderedBroadcast()發(fā)送有序廣播挽霉;
b.通過Intent確定廣播類型,攜帶數(shù)據(jù),Intent的數(shù)據(jù)同樣修改無效债沮;
c.跟普通廣播一樣炼吴,也可以設(shè)置相應(yīng)的權(quán)限;
d.接收者可在定義android:priority定義優(yōu)先級疫衩,數(shù)字越大,優(yōu)先級越高荣德;
e.有序廣播會被接收者逐個接收闷煤,中途可以中斷,或添加涮瞻、修改數(shù)據(jù)鲤拿;
f.可以指定一個自己的廣播接收者,這個接收者將最后一個收到廣播、不會被中斷署咽、不需要任何權(quán)限近顷、不需要配置;
g.可以指定一個Handler用來在自己的接收者中進行線程通信宁否;
發(fā)送者:
接收者AReceive:
接收者BReceive:代碼及配置與上類似窒升,只是優(yōu)先級比A的低
5、廣播的生命周期
a.廣播接收者的生命周期非常短暫的慕匠,在接收到廣播的時候創(chuàng)建饱须,onReceive()方法結(jié)束之后銷毀;
b.廣播接收者中不要做一些耗時的工作台谊,否則會彈出Application No Response錯誤對話框蓉媳;
c.最好也不要在廣播接收者中創(chuàng)建子線程做耗時的工作譬挚,因為廣播接收者被銷毀后進程就成為了空進程,很容易被系統(tǒng)殺掉酪呻;
d.耗時的較長的工作最好放在服務(wù)中完成减宣;