android 开机启动服务。
下面參考其它博客的文章:android BraodcastReceiver
BroadcastReceiver初識:
廣播接收者(BroadcastReceiver)用于接收廣播Intent,廣播Intent的發(fā)送是通過調(diào)用Context.sendBroadcast()、Context.sendOrderedBroadcast()來實(shí)現(xiàn)的。通常一個(gè)廣播Intent可以被訂閱了此Intent的多個(gè)廣播接收者所接收,這個(gè)特性跟JMS中的Topic消息接收者類似。要實(shí)現(xiàn)一個(gè)廣播接收者方法如下:
第一步:繼承BroadcastReceiver,并重寫onReceive()方法。
public class IncomingSMSReceiver extends BroadcastReceiver {
?? ?@Override public void onReceive(Context context, Intent intent) {
?? ?}
}
第二步:訂閱感興趣的廣播Intent,訂閱方法有兩種:
第一種:使用代碼進(jìn)行訂閱
IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
IncomingSMSReceiver receiver = new IncomingSMSReceiver();
registerReceiver(receiver, filter);
第二種:在AndroidManifest.xml文件中的<application>節(jié)點(diǎn)里進(jìn)行訂閱:
<receiver android:name=".IncomingSMSReceiver">
??? <intent-filter>
???????? <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
??? </intent-filter>
</receiver>
廣播類型:
廣播被分為兩種不同的類型:“普通廣播(Normal broadcasts)”和“有序廣播(Ordered broadcasts)”。普通廣播是完全異步的,可以在同一時(shí)刻(邏輯上)被所有接收者接收到,消息傳遞的效率比較高,但缺點(diǎn)是:接收者不能將處理結(jié)果傳遞給下一個(gè)接收者,并且無法終止廣播Intent的傳播;然而有序廣播是按照接收者聲明的優(yōu)先級別,被接收者依次接收廣播。如:A的級別高于B,B的級別高于C,那么,廣播先傳給A,再傳給B,最后傳給C 。優(yōu)先級別聲明在intent-filter元素的android:priority屬性中,數(shù)越大優(yōu)先級別越高,取值范圍:-1000到1000,優(yōu)先級別也可以調(diào)用IntentFilter對象的setPriority()進(jìn)行設(shè)置 。有序廣播的接收者可以終止廣播Intent的傳播,廣播Intent的傳播一旦終止,后面的接收者就無法接收到廣播。另外,有序廣播的接收者可以將數(shù)據(jù)傳遞給下一個(gè)接收者,如:A得到廣播后,可以往它的結(jié)果對象中存入數(shù)據(jù),當(dāng)廣播傳給B時(shí),B可以從A的結(jié)果對象中得到A存入的數(shù)據(jù)。
Context.sendBroadcast()
?? 發(fā)送的是普通廣播,所有訂閱者都有機(jī)會獲得并進(jìn)行處理。
Context.sendOrderedBroadcast()
?? 發(fā)送的是有序廣播,系統(tǒng)會根據(jù)接收者聲明的優(yōu)先級別按順序逐個(gè)執(zhí)行接收者,前面的接收者有權(quán)終止廣播(BroadcastReceiver.abortBroadcast()),如果廣播被前面的接收者終止,后面的接收者就再也無法獲取到廣播。對于有序廣播,前面的接收者可以將數(shù)據(jù)通過setResultExtras(Bundle)方法存放進(jìn)結(jié)果對象,然后傳給下一個(gè)接收者,下一個(gè)接收者通過代碼:Bundle bundle = getResultExtras(true))可以獲取上一個(gè)接收者存入在結(jié)果對象中的數(shù)據(jù)。
系統(tǒng)收到短信,發(fā)出的廣播屬于有序廣播。如果想阻止用戶收到短信,可以通過設(shè)置優(yōu)先級,讓你們自定義的接收者先獲取到廣播,然后終止廣播,這樣用戶就接收不到短信了。
廣播接收者的響應(yīng):
在Android中,每次廣播消息到來時(shí)都會創(chuàng)建BroadcastReceiver實(shí)例并執(zhí)行onReceive() 方法, onReceive() 方法執(zhí)行完后,BroadcastReceiver 的實(shí)例就會被銷毀。當(dāng)onReceive() 方法在10秒內(nèi)沒有執(zhí)行完畢,Android會認(rèn)為該程序無響應(yīng)。所以在BroadcastReceiver里不能做一些比較耗時(shí)的操作,否側(cè)會彈出ANR(Application No Response)的對話框。如果需要完成一項(xiàng)比較耗時(shí)的工作,應(yīng)該通過發(fā)送Intent給Service,由Service來完成。這里不能使用子線程來解決,因?yàn)锽roadcastReceiver的生命周期很短,子線程可能還沒有結(jié)束BroadcastReceiver就先結(jié)束了。BroadcastReceiver一旦結(jié)束,此時(shí)BroadcastReceiver的所在進(jìn)程很容易在系統(tǒng)需要內(nèi)存時(shí)被優(yōu)先殺死,因?yàn)樗鼘儆诳者M(jìn)程(沒有任何活動組件的進(jìn)程)。如果它的宿主進(jìn)程被殺死,那么正在工作的子線程也會被殺死。所以采用子線程來解決是不可靠的。
public class IncomingSMSReceiver extends BroadcastReceiver {
?? ?@Override?
??? public void onReceive(Context context, Intent intent) {
??????????? //發(fā)送Intent啟動服務(wù),由服務(wù)來完成比較耗時(shí)的操作
??????????? Intent service = new Intent(context, XxxService.class);
??????????? context.startService(service);
?? ?}
}
常用廣播Intent:
除了短信到來廣播Intent,Android還有很多廣播Intent,如:開機(jī)啟動、電池電量變化、時(shí)間已經(jīng)改變等廣播Intent。
?接收電池電量變化廣播Intent ,在AndroidManifest.xml文件中的<application>節(jié)點(diǎn)里訂閱此Intent:
<receiver android:name=".IncomingSMSReceiver">
??? <intent-filter>
???????? <action android:name="android.intent.action.BATTERY_CHANGED"/>
??? </intent-filter>
</receiver>
?接收開機(jī)啟動廣播Intent,在AndroidManifest.xml文件中的<application>節(jié)點(diǎn)里訂閱此Intent:
<receiver android:name=".IncomingSMSReceiver">
??? <intent-filter>
???????? <action android:name="android.intent.action.BOOT_COMPLETED"/>
??? </intent-filter>
</receiver>
并且要進(jìn)行權(quán)限聲明:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
廣播接收者生命周期
?廣播接收者的生命周期是非常短暫的,在接收到廣播的時(shí)候創(chuàng)建,onReceive()方法結(jié)束之后銷毀
?廣播接收者中不要做一些耗時(shí)的工作,否則會彈出Application?No?Response錯誤對話框
?最好也不要在廣播接收者中創(chuàng)建子線程做耗時(shí)的工作,因?yàn)閺V播接收者被銷毀后進(jìn)程就成為了空進(jìn)程,很容易被系統(tǒng)殺掉
?耗時(shí)的較長的工作最好放在服務(wù)中完成!!!
分享于大家。
轉(zhuǎn)載于:https://www.cnblogs.com/wuwa/archive/2013/05/23/6191669.html
總結(jié)
以上是生活随笔為你收集整理的android 开机启动服务。的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Oracle数据文件的备份与恢复
- 下一篇: Write operations are