android啟動廣播
『壹』 Android啟動廣播時怎樣往廣播中傳遞參數
在android中使用廣播來讓其他監聽廣播的地方能夠對相應的事情做處理,但有的時候需要傳遞一些其他的附帶值,而這個時候是可以直接用播放廣播的intent來傳遞的。x0dx0a例:x0dx0aIntent intent = new Intent();x0dx0aintent.putExtra("msgPersons", msgPersons);x0dx0aintent.setAction(Constant.hasMsgUpdatedAction);x0dx0aintent.putExtra("userId", userId);x0dx0aintent.putExtra("msgCount", messages.size());x0dx0asendBroadcast(intent);
『貳』 Android本地廣播的使用
為了解決廣播的安全性問題,Android引入了本地廣播機制,使用該機制發出的廣播只能在應用程序的內部進行傳遞,並且廣播接收器也只能接收來自本應用程序發出的廣播。
本地廣播是無法通過靜態注冊的方式來接收的。我們知道靜態注冊主要是為了在程序未啟動的情況下能接收廣播,而當我們發送本地廣播的時候,程序肯定是已經啟動的了,所以我們需要動態注冊方式創建接收器。
在這里我們創建一個繼承於BroadcastReceiver的類LocalReceiver。onReceive()處理你接收到的廣播內容,在這里我用Toast來創建一個提示接收到消息的彈窗
在activity_main.xml文件創建一個用於發送廣播的按鈕
首先通過本地廣播管理器LocalBroadcastManager的getInstance()方法獲取一個實例,並分別創建過濾器IntentFilter和自定義接收器LocalReceiver的實例。給IntentFilter的實例添加一個action:localbroadcast(接收的廣播的名稱),然後調用LocalBroadcastManager的registerReceiver()方法進行注冊,並將LocalReceiver的實例和IntentFilter的實例都傳進去。這樣本地監聽器就創建完成了。
調用LocalBroadcastManager的sendBroadcast()發送本地廣播。運行程序,點擊Send Button按鈕,我們可以看到彈窗顯示「This is in LocalReceiver」,說明本地廣播發送和接收成功了。
當然,我們最後一定不要忘了取消注冊。我們可以通過調用unregisterReceiver()方法來實現。至此,Android的標准廣播發送就完成了。
1.發送的廣播只能在本程序內傳遞,不必擔心數據泄露
2.其它程序廣播無法發送到本程序的內部,不必擔心安全漏洞隱患
3.本地廣播比系統全局廣播更加高效
『叄』 安卓開機廣播是什麼意思
就是android 系統開機的時候會發送一個廣播,應用程序注冊的這個廣播的話就可以收到,通常很多應用就會啟動後台服務
『肆』 說說Android的廣播(1)
對於Activity的啟動流程,我們已經有了幾個版本的分析了。這里我們分析一個更容易一些的,四大組件中最簡單的Broadcast Receiver。
關於Broadcast,有幾點需要了解。首先是廣播的類型,然後是廣播的發送方法,最後是廣播是如何被接收的。這三者相輔相承的,比如普通廣播和有序廣播只有在詳細了解了廣播的接收過程了之後,才能真正明白它的含義。
普通的廣播是不在意順序的,最簡單的理解是同時可以收到這個廣播。如果應用是動態注冊這個廣播的,且廣播發送時這個進程還活著,那麼當然可以並發的把廣播盡快地傳送出去是最好的。
但是,如果是通過AndroidManifest.xml靜態注冊的情況,也就是說這個廣播首先要把一個進程啟動起來,這時並發啟動很多進程就是個問題了。Android目前的做法是,對這種靜態的廣播接收者,自動按有序廣播的方式來串列處理。但是這對應用是透明的,應用不能假設系統已經把靜態的無序廣播當成有序廣播來處理。
這個時候講粘性廣播有福了,因為從Android 5.0(API 21)開始,因為安全性的問題,官方已經正式廢棄了粘性廣播。
Context類提供兩個方法可以用於發送普通廣播:
差別是第二個設置許可權。
發給特定的用戶:
有序廣播因為要處理消息的處理結果,所以要復雜一些。
如果只是想讓廣播可以按優先順序來收取,並不在意處理的結果,可以用下面的版本:
同樣,在多用戶環境下,也可以選擇給哪個用戶發廣播:
不管是普通的還是有序的廣播都對應有粘性的版本:
以上的API都是定義於Context類中: https://developer.android.com/reference/android/content/Context.html
首先我們先看看發送端是如何發送的。
我們首先先放一個大圖,讓大家先有一個直觀的印象,不管普通廣播、有序廣播、粘性廣播如何組合,最終都匯集到一個大方法中。
我們先看應用發送普通廣播的一個簡單的例子:
非常簡單,調用ContentWrapper的sendBroadcast方法就可以了。
然後我們順藤摸瓜就好了。
Activity中的sendBroadcast,實際上調用的是:
我們來看frameworks/base/core/java/android/content/ContextWrapper.java中對sendBroadcast的定義:
ContextWrapper只是一個包裝,真正的實現在ContextImpl中
我們來看/frameworks/base/core/java/android/app/ContextImpl.java中真正實現sendBroadcast的功能:
它會通過IPC去調用AMS的broadcastIntent。由於我們這個普通的廣播的方法參數最少,所以好多都是傳null。
加鎖,定參數,然後調用真正的邏輯的實現。
我們先把broadcastIntentLocked的真正邏輯放一下,先看看有序廣播是如何發送的。
ContextWrapper.sendOrderedBroadcast
Context是abstract方法,調用的是ContextWrapper的實現:
跟普通廣播一樣,還是會調用到ContextImpl.sendOrderedBroadcast
有序廣播調用broadcastIntent的區別在於serialized參數,普通廣播為false,有序廣播為true.
原型為:
前面講過帶有回調的版本,我們看看它是如何實現的:
當然還是調用ContextImpl.sendOrderedBroadcast
這次變成只是一個封裝了,它會調用一個更多參數的版本:
這次是一個全參數調用broadcastIntent的版本了,除了sticky就齊了
我們也不繞圈子了,直接看ContextImpl.sendStickyBroadcast.
『伍』 Android 使用廣播系統解決app開機自啟動問題
關注 【網羅開發】微信公眾號,回復【160】便可領取。
網羅天下方法,方便你我開發 ,更多Android技術干貨等待領取,所有文檔會持續更新,歡迎關注一起成長!
總結一下使用ACTION_BOOT_COMPLETED的廣播,解決app開機自啟動的問題
1.首先在你的工程上建一個廣播接受的類,繼承BroadcastReceiver:
2.然後要在AndroidManifest.xml中加入許可權和配置相關信息:
3.在application標簽中,配置以下相關信息:
補充說明:
1.查看系統中是否安裝了類似360管家的軟體,為了加快開機速度,默認是關閉掉開機廣播的,只需要在設置中打開即可。
2.如果監聽不到廣播,可以嘗試同時監聽廣播和sd卡。
3.同時監聽廣播和sd卡,在application標簽中,配置以下相關信息:
『陸』 android 之廣播機制
Android 中的廣播主要可以分為兩種類型:標准廣播和有序廣播
一種完全非同步執行的廣播,在廣播發出之後,所有的BroadcastReceiver幾乎會在同一時刻收到這條廣播消息,因此它們之間沒有任何先後順序可言。這種廣播的效率會比較高,但同時也意味著它是無法被截斷
標准廣播工作示意圖:
一種同步執行的廣播,在廣播發出之後,同一時刻只會有一個BroadcastReceiver能夠收到這條廣播消息,當這個BroadcastReceiver中的邏輯執行完畢後,廣播才會繼續傳遞。所以此時的BroadcastReceiver是有先後順序的,優先順序高的BroadcastReceiver就可以先收到廣播消息,並且前面的BroadcastReceiver還可以截斷正在傳遞的廣播,這樣後面的BroadcastReceiver就無法收到廣播消息了
有序廣播工作示意圖:
可以讓程序在未啟動的情況下接收廣播
在Android 8.0系統之後,所有隱式廣播都不允許使用靜態注冊的方式來接收了。隱式廣播指的是那些沒有具體指定發送給哪個應用程序的廣播,大多數系統廣播屬於隱式廣播,但是少數特殊的系統廣播目前仍然允許使用靜態注冊的方式來接收,詳見網址: https://developer.android.google.cn/guide/components/broadcast-exceptions.html
在 AndroidManifest.xml 文件中注冊
在 AndroidManifest.xml 文件中進行許可權聲明
不要在 onReceive() 方法中添加過多的邏輯或者進行任何的耗時操作,因為BroadcastReceiver中是不允許開啟線程的,當 onReceive() 方法運行了較長時間而沒有結束時,程序就會出現錯誤
先定義一個BroadcastReceiver來准備接收此廣播
在 AndroidManifest.xml 文件中注冊
有序廣播是一種同步執行的廣播,並且是可以被截斷的。為了驗證這一點,我們需要再創建一個新的BroadcastReceiver。新建AnotherBroadcastReceiver
同樣,在 AndroidManifest.xml 文件中注冊,同時,使用 intent-filter 標簽的 android:priority 屬性設置優先順序
前面的 AnotherBroadcastReceiver 的優先順序比較高,因此 AnotherBroadcastReceiver 一定比 MyBroadcastReceiver 先收到廣播,因此,可以在 AnotherBroadcastReceiver 的 onReceive 方法中使用 abortBroadcast() 方法截斷廣播,這樣 MyBroadcastReceiver 就收不到該廣播了
在界面上彈出一個對話框,讓用戶無法進行任何其他操作,必須點擊對話框中的「確定」按鈕,關閉所有的Activity,然後回到登錄界面即可
ActivityCollector 類用於管理所有的Activity,具有關閉所有Activity的功能
創建 BaseActivity 類作為所有 Activity 的父類,並在裡面實現強制下線功能,在這里實現此功能,有以下幾點原因
創建一個LoginActivity來作為登錄界面
activity_login.xml
LoginActivity 如果輸入 123 就到 MainActivity界面
MainActivity 中點擊強制下線按鈕,就發送強制下線的廣播
MainActivity 布局