導航:首頁 > 操作系統 > android開機廣播收不到

android開機廣播收不到

發布時間:2023-08-08 00:24:03

1. 為什麼小米手機開機時「android.intent.action.MEDIA_MOUNTED」sd卡正常掛在的廣播接收不到

您好!
一.請您備份數據,進入recovery(關機,按住音量上+開機鍵進入recovery)模式,清除緩存,清除用戶數據,清除所有數據,恢復備份的時候,設置和手機裡面的第三方安全軟體這兩項不要恢復。嘗試可否正常使用。
二.如果還是不行,建議您使用線刷按照下面的方法重新刷一次完整包,下面的刷機教程您可以參考一下:
1.您先在小米官網下載個適合您機型的您需要的MIUI 線刷包。這是鏈接:http://bbs.xiaomi.cn/topic-mirom.html
2.在下載的這段時間,請您備份數據,進入recovery(關機,按住音量上+開機鍵進入recovery)清除緩存,清除用戶數據,清除所有數據,。電腦裝好驅動,下載個miflash刷機工具,這是裝驅動鏈接:http://bbs.xiaomi.cn/thread-504332-1-1.html
3.一切准備就緒之後,請您按照官網的刷機教程使用第六種線刷,這是官方的刷機教程:http://bbs.xiaomi.cn/thread-3104435-1-1.html
4.如果您對刷機不熟悉,請您參考下米粉製作的刷機視頻教程:http://v.youku.com/v_show/id_XNTEyMjQ1MzI4.html
感謝您的支持,祝您生活愉快!
歡迎您在網路小米企業平台提問:http://..com/c/xiaomi/

2. Android廣播阻塞、延遲問題

        最近項目中,多次碰到app研發人員反饋廣播從發送到接收器接收,間隔時間太長,要求系統進行優化,特別是開機階段。對此,專門閱讀了一下廣播從發送到接收這個流程的源碼,以徹底搞明白怎樣讓自己發送的廣播盡快到達接收器。

涉及到的源碼類不多,主要就是ActivityManagerService.java 和 BroadcastQueue.java。發送廣播進程調用發送介面,通過IPC到達AMS,AMS根據Intent是否配置Intent.FLAG_RECEIVER_FOREGROUND,選擇當前廣播加入前台廣播隊列還是後台廣播隊列。根據當前廣播是否有序,將廣播加入廣播隊列的串列列表還是並行列表。廣播隊列和廣播隊列中的廣播列表是影響廣播接收時間的主要因素。

BroadcastQueue廣播隊列,負責將廣播發送給廣播接收器。AMS中有兩個成員變數, 

BroadcastQueue mFgBroadcastQueue;//前台廣播隊列

BroadcastQueue mBgBroadcastQueue;//後台廣播隊列

前台廣播隊列和後台廣播隊列的區別有兩處:1 超時時間,前台10s,後台60s. 2 是否延遲廣播等待前一個廣播進程完成。這兩個區別已經說明前台廣播對廣播接收器要求更高,響應時間更短,如果廣播要排隊,時間上前台廣播更短。同時系統默認使用後台廣播隊列,所以前台廣播隊列處理的廣播要少,避免了可能的大量廣播排隊情況。

廣播隊列中的列表

//存放無序並發送給動態廣播接收器的廣播任務

final ArrayList<BroadcastRecord> mParallelBroadcasts = new ArrayList<BroadcastRecord>();

//存放無序發送給靜態廣播接收器的廣播任務或者存放有序廣播任務

final ArrayList<BroadcastRecord> mOrderedBroadcasts = new ArrayList<BroadcastRecord>();

mParallelBroadcasts 此列表中存放的是無序廣播動態廣播接收器任務,廣播隊列會在處理任務時通過嵌套循環,把每個廣播通過ipc發送到關注它的所有進程。所有無序廣播+動態廣播接收器,廣播不需要排隊。這種情況是最快能讓廣播到達目標進程的方式。

mOrderedBroadcasts存放的廣播任務特點:廣播有序,或者廣播接收器是靜態注冊的。此種類型的廣播全部要在mOrderedBroadcasts中排隊,廣播之間按時間先後,同一個廣播不同廣播接收器按優先順序。mOrderedBroadcasts存放的廣播必須等一個廣播任務處理完畢才能處理下一個,中間可能包含進程的啟動等。

由此可見,廣播最快的情況是前台廣播、無序廣播、動態注冊廣播接收器。最糟糕的情況是:後台廣播、有序或靜態注冊廣播接收器、廣播接收器優先順序低。如果一個應用只是簡單的靠注冊一個靜態廣播接收器拉起進程,對應的正是最糟糕的情況。如果又發生在開機階段,自然延遲嚴重。

如果必須注冊靜態廣播接收器,縮短時間的辦法為:配置Intent.FLAG_RECEIVER_FOREGROUND,加入前台廣播隊列,設置廣播優先順序

源碼:

廣播發送:Context .sendBroadcast ->ActivityManagerNative.broadcastIntent->ActivityManagerService.broadcastIntent->ActivityManagerService.broadcastIntentLocked.到此階段,跟發送廣播的進程通信結束。此階段AMS完成的工作主要是根據Intent查找該廣播對應的動態廣播接收器、靜態廣播接收器、以此發送該廣播使用的廣播隊列。

private final int broadcastIntentLocked(

......//許可權檢查

......//特殊系統廣播進行必要處理

if (sticky) {//粘性廣播處理

......

//查找靜態注冊的接收器

receivers = collectReceiverComponents(intent, resolvedType, users);

if (intent.getComponent() == null) {

    // 查找動態廣播接收器

            registeredReceivers = mReceiverResolver.queryIntent(intent,

                    resolvedType, false, userId);

        }

//動態廣播接收器

        int NR = registeredReceivers != null ? registeredReceivers.size() : 0;

        if (!ordered && NR > 0) { 

//確定隊列

            final BroadcastQueue queue = broadcastQueueForIntent(intent);

//創建廣播任務BroadcastRecord

            BroadcastRecord r = new BroadcastRecord(queue, intent, callerApp,

                    callerPackage, callingPid, callingUid, resolvedType, requiredPermission,

                    appOp, registeredReceivers, resultTo, resultCode, resultData, map,

                    ordered, sticky, false, userId);

......

//廣播任務加入並行列表中

                queue.(r);

//啟動非同步發送廣播任務

                queue.scheleBroadcastsLocked();

registeredReceivers = null;

            NR = 0;

......

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);

//獲取廣播隊列

            BroadcastQueue queue = broadcastQueueForIntent(intent);

//創建廣播任務

            BroadcastRecord r = new BroadcastRecord(queue, intent, callerApp,

                    callerPackage, callingPid, callingUid, resolvedType,

                    requiredPermission, appOp, receivers, resultTo, resultCode,

                    resultData, map, ordered, sticky, false, userId);

//加入到廣播隊列串列列表中

                queue.enqueueOrderedBroadcastLocked(r);

//啟動非同步發送任務

                queue.scheleBroadcastsLocked();

廣播隊列處理廣播:

final void processNextBroadcast(boolean fromMsg) {

......

//並行列表,遍歷廣播任務

            while (mParallelBroadcasts.size() > 0) {

final int N = r.receivers.size();

//遍歷接收器

                for (int i=0; i<N; i++) {

//IPC調用發送給目標進程

(r, (BroadcastFilter)target, false);

}

}

//有串列廣播任務正在執行

if (mPendingBroadcast != null) {

             //接收廣播的目標進程正常

                if (!isDead) {

                    // It's still alive, so keep waiting 繼續等待目前進程反饋

                    return;

                }

}

             //取出第一個廣播

                r = mOrderedBroadcasts.get(0);//判斷是否超時,

                    if ((numReceivers > 0) && 

                            (now > r.dispatchTime + (2*mTimeoutPeriod*numReceivers))) {

                         //廣播超時

                          broadcastTimeoutLocked(false);//超時處理,終止當前廣播,啟動下一個任務。

                          }

                if (r.receivers == null || r.nextReceiver >= numReceivers

                        || r.resultAbort || forceReceive) {

                 //所有廣播任務執行完畢

}

int recIdx = r.nextReceiver++;//下一個廣播接收器

r.dispatchTime = r.receiverTime;//設置派發時間

setBroadcastTimeoutLocked(timeoutTime);//啟動超時計時

if (nextReceiver instanceof BroadcastFilter){//動態廣播接收器

(r, filter, r.ordered);//發送

return;

}

.//靜態廣播

            ResolveInfo info =

                (ResolveInfo)nextReceiver;

......

//檢查進程是否已啟動

            ProcessRecord app = mService.getProcessRecordLocked(targetProcess,

                    info.activityInfo.applicationInfo.uid, false);

            if (app != null && app.thread != null) { /進程啟動

               processCurBroadcastLocked(r, app);//發送靜態廣播

               return;

            }

     if ((r.curApp=mService.startProcessLocked(targetProcess,//啟動進程

                    info.activityInfo.applicationInfo, true,

                    r.intent.getFlags() | Intent.FLAG_FROM_BACKGROUND,

                    "broadcast", r.curComponent,

                    (r.intent.getFlags()&Intent.FLAG_RECEIVER_BOOT_UPGRADE) != 0, false, false))

                            == null) {

                      //進程啟動失敗

                  }

             //標志正在發送的串列廣播

            mPendingBroadcast = r;

            mPendingBroadcastRecvIndex = recIdx;//正在發送的廣播任務對應的接收器索引

}

3. Android App 開機自啟動

<article class="_2rhmJa">

Android 設備開機自啟動的可以用廣播實現,因為 Android 設備開機時會發送一條開機廣播 "android.intent.action.BOOT_COMPLETED"。接收後實現啟動就完成了。

接下來是准備工作

如果按照上面的全部步驟後操作後,重啟沒有自動啟動程序,怎麼辦呢?是怎麼回事呢?

*那麼首先請檢查一下你的手機是不是安裝了360等安全助手之類的軟體,如果有,請在軟體的自啟動軟體管理中將app設置為允許
*我的手機沒有安裝這些軟體,但是手機中自帶了安全助手,有的手機系統設置裡面自帶了自啟動軟體管理的功能 ,所以在這里將我們的app設置為允許開機啟動),重啟手機,測試是否成功。

然而並沒有成功

接收不到BOOT_COMPLETED廣播可能的原因
(1)、BOOT_COMPLETED對應的action和uses-permission沒有一起添加
(2)、應用安裝到了sd卡內,安裝在sd卡內的應用是收不到BOOT_COMPLETED廣播的
(3)、系統開啟了Fast Boot模式,這種模式下系統啟動並不會發送BOOT_COMPLETED廣播
(4)、應用程序安裝後重來沒有啟動過,這種情況下應用程序接收不到任何廣播,包括BOOT_COMPLETED、ACTION_PACKAGE_ADDED、CONNECTIVITY_ACTION等等。
Android3.1之後,系統為了加強了安全性控制,應用程序安裝後或是(設置)應用管理中被強制關閉後處於stopped狀態,在這種狀態下接收不到任何廣播,除非廣播帶有FLAG_INCLUDE_STOPPED_PACKAGES標志,而默認所有系統廣播都是FLAG_EXCLUDE_STOPPED_PACKAGES的,所以就沒法通過系統廣播自啟動了。所以Android3.1之後
(1)、應用程序無法在安裝後自己啟動
(2)、沒有ui的程序必須通過其他應用激活才能啟動,如它的Activity、Service、Content Provider被其他應用調用。
存在一種例外,就是應用程序被adb push you.apk /system/app/下是會自動啟動的,不處於stopped狀態。

並不太懂 我的APP啟動後 已經收到廣播

第一種方式 我再模擬器上 測試 可以 android 9.0版本

桌面設置也會把你的app當成一個桌面主題,還有一個選項是系統桌面,你需要設置成自己的app

如果找不到桌面設置選項,可以從手機設置–應用程序-查看所有應用程序(包括系統的應用程序),找到桌面程序之類的字眼的應用,清楚其默認設置。

4. android接受不到開機廣播

intent
判斷
intent.getAction()是否與
android.intent.action.BOOT_COMPLETED
相同,發出的是這個,你沒監聽這個Action

另外注意的是,如果是
3.1以下的系統,沒問題。3.1以上的系統,需要有Activity存在,並且啟動一次程序,才能夠實現廣播。

閱讀全文

與android開機廣播收不到相關的資料

熱點內容
華為加密壁紙怎麼提取 瀏覽:50
曲線命令的描述 瀏覽:454
php模板怎麼修改 瀏覽:999
單片機和微機編程的區別 瀏覽:642
金牛期貨哪個app好 瀏覽:803
程序員越老越貶值嗎 瀏覽:211
安卓手機用計算機如何隱藏應用 瀏覽:459
網吧伺服器如何架設 瀏覽:322
垃圾壓縮罐用電安全 瀏覽:621
b150能用什麼伺服器cpu 瀏覽:477
支付寶批量付款app哪個好 瀏覽:849
java開源社區源碼 瀏覽:475
cad哪個命令和滾輪一樣縮放 瀏覽:986
5日金叉10均量線選股公式源碼 瀏覽:593
文件夾有豎線怎麼去 瀏覽:1002
如何連接伺服器並實現同步 瀏覽:332
androidseekbar進度條 瀏覽:358
梯度上升演算法知乎 瀏覽:652
qt項目源碼下載 瀏覽:395
不允許代理伺服器什麼意思 瀏覽:513