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

android啟動廣播

發布時間: 2023-01-11 18:45:27

『壹』 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 布局

熱點內容
定義dns伺服器的ip 發布:2025-05-17 20:32:37 瀏覽:954
android判斷圖片 發布:2025-05-17 20:32:33 瀏覽:833
安卓12什麼時候適配小米 發布:2025-05-17 20:31:47 瀏覽:70
c語言字元串初始化 發布:2025-05-17 20:18:43 瀏覽:37
安卓融e聯推送需要什麼許可權 發布:2025-05-17 20:18:39 瀏覽:268
我的世界無限武魂伺服器 發布:2025-05-17 20:17:09 瀏覽:372
安卓手游腳本語言 發布:2025-05-17 19:53:07 瀏覽:22
找圈演算法 發布:2025-05-17 19:49:19 瀏覽:411
資料庫的存取方法 發布:2025-05-17 19:48:36 瀏覽:126
androidapp測試 發布:2025-05-17 19:48:19 瀏覽:389