當前位置:首頁 » 安卓系統 » android廣播

android廣播

發布時間: 2022-04-03 17:29:38

A. 安卓開發 如何關閉廣播

很牛逼的一個問題。廣播不是用來關閉的!動態注冊廣播接收器特點是當用來注冊的Activity關掉後,廣播也就失效了。我們可以通過兩種方式注冊BroadcastReceiver,一是在Activity啟動過程中通過代碼動態注冊,二是在AndroidManifest.xml文件中利用<receiver>標簽進行靜態注冊。對於第一種方法,我們需要養成一個良好的習慣:在Activity進入停止或者銷毀狀態的時候使用unregisterReceiver方法將注冊的BroadcastReceiver注銷掉。如果通過第二種方法注冊的BroadcastReceiver,是否需要通過代碼進行注銷呢?如果通過<receiver>標簽來注冊的BroadcastReceiver,那麼該對象的實例在onReceive被調用之後就會在任意時間內被銷毀。也就是說,我們並需要擔心靜態注冊的BroadcastReceiver的銷毀問題。靜態注冊無需擔憂廣播接收器是否被關閉,只要設備是開啟狀態,廣播接收器也是打開著的。也就是說哪怕app本身未啟動,該app訂閱的廣播在觸發時也會對它起作用。

B. Android 動態廣播 和 靜態廣播的區別

同一優先順序的廣播接收器,動態的要比靜態注冊的早。 動態注冊:即由代碼注冊的廣播接收器靜態注冊:即在 AndroidManifest.xml 中注冊的廣播接收器 優先順序: 當廣播為有序發送的時候,要按這個排序並順序發送。 sendBroadcast 發送的是無序廣播。sendOrderedBroadcast 發送的是有序廣播。 好了,現在尋找問題原因,在找原因前肯定有這樣的想法,一個有序隊列,既然允許有相同的優先順序存在,那麼在同優先順序內要不然有排序子因素,要不基就是按照某種操作可能影響順序。後者可能性很大。 打開源碼,順著 動態注冊廣播接受器 找,最後是 ActivityManagerService.java 這個文件找到了 registerReceiver 的實現。同地也看到,存儲的廣播接收器列表是 HashMap mRegisteredReceivers 這個變理。 裡面有一段代碼為: ReceiverList rl = (ReceiverList)mRegisteredReceivers.get(receiver.asBinder()); if (rl == null) { rl = new ReceiverList(this, callerApp, Binder.getCallingPid(), Binder.getCallingUid(), receiver); if (rl.app != null) { rl.app.receivers.add(rl); } else { try { receiver.asBinder().linkToDeath(rl, 0); } catch (RemoteException e) { return sticky; } rl.linkedToDeath = true; } mRegisteredReceivers.put(receiver.asBinder(), rl); } 在裡面查找有沒有這個 Receiver , 如果沒有 put 進去。 看到這里貌似沒有對廣播的順序做處理。是不是有別的地方做排序呢,找找成員變理,發現一個可疑的變數:final ArrayList mOrderedBroadcasts沒錯,感覺就應該是它了。 找找對它的操作,只有一處 mOrderedBroadcasts.set ,把代碼摘錄一下: BroadcastRecord r = new BroadcastRecord(intent, callerApp, callerPackage, callingPid, callingUid, requiredPermission, sticky, false); mOrderedBroadcasts.set(i, r);在這里放入了一個 BroadcastRecord 對像,而這個對像中主要的東西其實是 receivers向上跟蹤 int NT = receivers != null ? receivers.size() : 0; int it = 0; ResolveInfo curt = null; BroadcastFilter curr = null; while (it < NT && ir < NR) { if (curt == null) { curt = (ResolveInfo)receivers.get(it); } if (curr == null) { curr = registeredReceivers.get(ir); } if (curr.getPriority() >= curt.priority) { // Insert this broadcast record into the final list. receivers.add(it, curr); ir++; curr = null; it++; NT++; } else { // Skip to the next ResolveInfo in the final list. it++; curt = null; } } 發現了一段 對 receivers 排序的代碼,並且判斷也是 priority 的值,用的是 >= 方式 感覺的找到了地方,但是對 Activity Manager Service 這個模塊卻更加的不懂了,以後有機會一定要分析一下這塊是怎樣設計的,才能確定本文的問題所在。暫時記錄,以後分析!

C. Android啟動廣播時怎樣往廣播中傳遞參數

我們在android中使用廣播來讓其他監聽廣播的地方能夠對相應的事情做處理,但有的時候我們仍然需要傳遞一些其他的附帶值,而這個時候是可以直接用播放廣播的intent來傳遞的。
例:
Intent intent = new Intent();
intent.putExtra("msgPersons", msgPersons);
intent.setAction(Constant.hasMsgUpdatedAction);
intent.putExtra("userId", userId);
intent.putExtra("msgCount", messages.size());
sendBroadcast(intent);
監聽廣播的代碼:
if (type.equals(Constant.hasMsgUpdatedAction)) {
if (obj instanceof Intent) {
Intent intent = (Intent) obj;
String msgPersons = intent.getStringExtra("msgPersons");
.......
}
}
這里的obj實際上是廣播監聽函數public void onReceive(String type, Object obj)中的第二個參數。當時看到這個函數的時候,一直不明白第二個參數的作用,後來才發現,原來還可以通過它來得到intent。

D. Android注冊廣播有幾種方式,分別是什麼

注冊方式有兩種:
1、靜態注冊,就是在manifest文件里配置一下,這種方式注冊的廣播屬於系統級廣播。你的應用沒打開也能收到廣播。比如你要做一個收到某廣播就啟動你的應用的功能可以這樣搞。
2、動態注冊,在代碼里執行一個rigisterBroadcastReciver(可能拼寫有誤)的方法。這種你要自己作好反注冊。這種廣播可以做成你的應用啟動後才監聽,關閉後就不監聽的效果。

E. android中的廣播怎麼使用

廣播操作有兩種
1、發送廣播,就是你自己發送出去一個廣播,讓別人接收
2、接收廣播,這個是自己實現一個廣播接收器,接收那些你自己過濾的廣播,然後處理
具體的代碼實現,可以在網上找找

F. android 什麼時候用到廣播

1.正常情況下我們選擇handler消息機制來進行單向的線程間的通信;(工作線程向主線程發送消息)

因為主線程有現成的handler,而工作線程沒有現成的handler,這樣的話,主線程將handler交給工作線程而讓工作線程將工作的結果交給主線程;

相反,工作線程中沒有現成的handler(事實上是沒有消息隊列,也就是handler沒有綁定到工作線程),那麼,如果開辟的話,代碼角度上是挺麻煩的(相對應廣播機制來說);

2.廣播機制本身就是雙向的(工作線程向主線程發送廣播,主線程向工作線程發送廣播);

另外,對於像一個activity中通過fragment來進行界面的處理; 我們大多數情況下是採用廣播的機制來實現fragment中adapter的數據的更新;這樣做主要是考慮到工作線程的任務載入完成,而具體的對應刷新的activity可能還沒有啟動;

另外,基於介面隔離原則,如果用handler進行通信的話,則不能很好的滿足這一原則

G. android中的廣播是什麼意思

android的廣播概念和我們日常生活中的電台有相通之處,空氣中有不同頻段,不同電台的廣播,而android系統中就有對應的電池的電量,來電,簡訊還有例如sd卡拔插等等這些廣播的消息發出,這些消息就對應著用收音機調頻時,不同電台的節目。而我們注冊的廣播就類似於我收聽某個電台的節目,比如一個注冊廣播收聽交通廣播,另一個注冊的廣播收聽音樂廣播,那麼怎麼區分是交通廣播還是音樂廣播呢,這就要通過前一章提到的Intent的action來判斷。

H. 簡述在android中如何發送廣播消息

1.發送廣播
Intent intent = new Intent(BroadcastAction);
Bundle bundle = new Bundle();
bundle.putString("***", SUCCESS);
bundle.putString("FullPathName", mFullPathName);
intent.putExtras(bundle);
sendBroadcast(intent);
2.在Activity中創建一個內部類MyBroadcastReceiver擴展BroadcastReceiver,並在其中實現onReceive方法。
3.在Activity中聲明一個MyBroadcastReceiver類型的成員變數,並注冊:
private MyBroadcastReceiver myBroadcastReceiver;
...
myBroadcastReceiver = new MyBroadcastReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction(BroadcastAction);
registerReceiver(receiver, filter);
4.使用完後要記得釋放
unregisterReceiver(receiver);

註:1和2中的 BroadcastAction要是同一個Action

I. android的廣播和service有什麼區別啊

廣播的周期很短,你不能在廣播內做耗時操作,而服務卻能。廣播的作用是幫你傳遞一些通知,例如你寫了一個開機廣播,一旦手機開機,廣播就發一則通知告訴手機(你寫的程序),手機(你寫的程序,某個類,某句代碼)啟動服務,這個時候在服務裡面可以做你想做的耗時操作,例如去請求伺服器,載入數據。廣播和服務的區別就是廣播周期短,不能做耗時操作,服務是長時間連接,可以做耗時操作,例如用服務控制音樂的播放等。廣播需要注冊,有兩種方式,一個在配置文件裡面,一個是代碼注冊、服務是寫一個類繼承服務,然後在裡面寫你的操作,外圍實例化服務,去啟動服務。

J. android里的廣播和通知有什麼區別

1、廣播
android通過廣播來實現不同進程間的通信;對應於廣播(broadcat)還有一個廣播接收器(broadcast receiver);每個廣播指定了對應的action 、 type等信息,每個接收器根據這些信息來過濾是否自己要接收的廣播
2、通知
Notification是Android中常用的一種通知方式,當有未讀簡訊或者未接電話的時候,屏幕的狀態欄就會有提示圖標,這時可以下拉狀態欄來讀取通知。在使用微信的時候(微信在後台運行),如果有新消息時便會發出聲音提示,狀態欄也有相應的微信提示
3、安卓中廣播和通知的關系
廣播是接收請求,通知是把處理結果告訴用戶

熱點內容
linux下載解壓 發布:2025-04-04 12:23:45 瀏覽:788
怎麼在伺服器里設材質包 發布:2025-04-04 12:10:08 瀏覽:629
php學習路線 發布:2025-04-04 12:05:13 瀏覽:754
壓縮文件視頻 發布:2025-04-04 12:00:48 瀏覽:319
17php 發布:2025-04-04 11:54:33 瀏覽:213
仿鏈家源碼 發布:2025-04-04 11:48:46 瀏覽:423
籃球訓練視頻文字腳本 發布:2025-04-04 11:47:18 瀏覽:839
兩麥分離演算法 發布:2025-04-04 11:23:45 瀏覽:431
換一個瀏覽器ftp打不開 發布:2025-04-04 11:23:44 瀏覽:184
雅奇sql 發布:2025-04-04 11:13:31 瀏覽:684