2012-09-03 28 views
0

我正試圖編寫一個在手機啓動時運行的服務,並且必須從SD卡上讀取數據。起初,我使用android.intent.action.BOOT_COMPLETED的接收器,但切換到下面的意圖,以確保SD卡已被加載。Nexus 7上的廣播接收器

我的問題是,在我的Nexus 7上,它似乎沒有收到MEDIA_MOUNTED的意圖。 Nexus 7沒有SD卡(但它有單獨的SD卡分區)。我也嘗試了BOOT_COMPLETED意圖,運氣也一樣。我已經在模擬器和我的Thunderbolt上測試了相同的代碼,並且這兩種意圖都可以工作。

Manifiest:

<receiver 
    android:name=".StartupReceiver" 
    android:enabled="true" 
    android:exported="true" 
    android:label="Start the NFS Automounter Service"> 

    <intent-filter> 
     <action android:name="android.intent.action.MEDIA_MOUNTED"></action> 
     <data android:scheme="file"/> 
     <!-- <action android:name="android.intent.action.BOOT_COMPLETED"></action>--> 
    </intent-filter> 
</receiver> 

BroadcastReceiver類:

public class StartupReceiver extends BroadcastReceiver 
{ 
    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     //if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction())) 
     //if ("android.intent.action.MEDIA_MOUNTED".equals(intent.getAction())) 
     //{ 

      Log.d("NFS_Automounter", "Recieved Mount"); 
      Intent serviceIntent = new Intent("com.ancantus.nfsautomounter.AutomountService"); 
      context.startService(serviceIntent); 
     //} 
    } 
} 

我註釋掉的意圖匹配只是嘗試,如果在所有執行類日誌。

我唯一的直覺就是Nexus 7沒有廣播MEDIA_MOUNTED,因爲它沒有真正的SD卡;但我無法收到BOOT_COMPLETED的意圖。

爲了解決這個問題,是的,我有BOOT_COMPLETED權限。

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 
+0

你有沒有什麼活動?在重新啓動設備之前,您是否運行過一次活動? – CommonsWare

+0

@CommonsWare沒有活動,接收者類運行一項服務。 – Ancantus

回答

5

在開始提供足夠多的搜索結果以便人們找到它之前,我必須輸入多少次這個答案?也許粗體大寫將工作:與Android 3.1開始

,NO BroadcastReceiver會的工作,不惜一切,直到一些手工的運行一個應用程序的其他組件,如,用戶在運行活動

這是(雖然不是位於井),在blog posts,並在許多StackOverflow的答案,如:

所以,爲您的應用添加一項活動。無論如何,您需要一些活動,設置來控制您的後臺操作,文檔,許可協議,隱私政策等。

(注意:我並不是真的對你大喊 - 我只是沮喪的是,儘管努力讓這個詞出來,這仍然會出現...)

+0

沒有它完全沒問題,我真的很驚訝,我沒有看到我的搜索(我正在專注於SD卡問題,而不是意識到'BroadcastReciever'本身沒有運行)。你的解釋很有道理。我會在明天寫一個活動,看看它是否解決了這個問題,但是可能會接受Webnet的答案,因爲我的問題更關注於SD卡。 – Ancantus

+0

@Ancantus:我懷疑當你通過運行一個活動將應用程序移出「停止」狀態時,你會發現兩個接收器都開始工作。 – CommonsWare

1

請注意,許多的方式模仿 SD卡的Android設備,即使桌面訪問它,它不會影響訪問SD卡。因此,Nexus 7可能會以這種方式公開所有內存,因此它不會真正安裝任何內容,它不會廣播MEDIA_MOUNTED。如果你想在啓動時執行一些任務,那麼聽取BOOT_COMPLETED是唯一正確的方法。

+0

好的,所以我確信Nexus7不會播放SD卡。因此,當收到'BOOT_COMPLETED'意圖時,SD卡分區應該可用。有什麼理由我不會收到這個意圖嗎? – Ancantus

+0

我無法確定,因爲我沒有在這裏得到任何Nexus,但如果沒有安裝SD卡,那聽起來像是沒有爲我廣播「MEDIA_MOUNT」的充分理由。 –

+0

有什麼方法可以知道設備是否會調用BOOT_COMPLETED。 –