2012-10-13 67 views
2

我對這裏的一個概念感到困惑。我閱讀過很多教程,爲了在設備啓動時收到通知(比如說爲了重新安排鬧鐘),您需要有一個boot_completed廣播接收器。爲什麼我們不會爲BOOT_COMPLETED事件註冊廣播接收器

然而,令人困惑的部分是,我沒有看到像「註冊(boradcast接收器)」的方法。人們只有廣播接收機類,他們擁有清單。但是你不需要某種註冊過程?系統如何知道有一個APP x有一個廣播接收器y正在監聽啓動事件,除非通過註冊明確告知

有點像您創建點擊監聽器,但您需要註冊/添加它到按鈕所以點擊後會被調用。

有人可以爲我清除困惑嗎?

謝謝

感謝

回答

2

人們只是有廣播接收器類和他們有它的表現。但是你不需要某種註冊過程?

清單中的<receiver>元素具有<intent-filter>子元素,記錄了Intent結構,它希望接收:

<?xml version="1.0" encoding="utf-8"?> 
<manifest android:versionCode="1" 
      android:versionName="1.0" 
      package="com.commonsware.android.sysevents.boot" 
      xmlns:android="http://schemas.android.com/apk/res/android"> 

    <uses-sdk android:minSdkVersion="3" 
      android:targetSdkVersion="6" /> 
    <supports-screens android:largeScreens="false" 
        android:normalScreens="true" 
        android:smallScreens="false" /> 
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 
    <application android:icon="@drawable/cw" 
       android:label="@string/app_name"> 
    <receiver android:name=".OnBootReceiver"> 
     <intent-filter> 
     <action android:name="android.intent.action.BOOT_COMPLETED" /> 
     </intent-filter> 
    </receiver> 
    </application> 
</manifest> 

在這裏,我們註冊BroadcastReceiver,命名爲OnBootReceiver,接收BOOT_COMPLETED廣播。

系統怎麼會知道有一個X程序誰擁有廣播接收者Y監聽啓動事件,除非通過註冊

Android是「明確通過註冊告訴」明確告知。恰恰相反,「註冊」是通過清單完成的,而不是通過應用程序中的Java代碼完成的。

+0

所以,如果我做context.registerReceiver()那麼我不需要添加廣播接收器來顯示,對吧? – Snake

+1

@Snake:是的,請記住'registerReceiver()'不適用於'ACTION_BOOT_COMPLETED'。 – CommonsWare

1

簡短的回答: 您可以動態地Context.registerReceiver註冊這個類的一個實例()或靜態地在AndroidManifest.xml中發佈通過標籤實現

+4

除了'registerReceiver()'對'ACTION_BOOT_COMPLETED'無效,因爲在任何代碼可以調用'registerReceiver()'的時候,引導就已經發生了。 :-) – CommonsWare

+0

哇,我從來沒有想過。很好的解釋 –

+0

@CommonsWare爲什麼Android在啓動完成時不發送StickyBroadcast?在這種情況下,我想動態註冊一個接收器將工作? –

相關問題