Broadcast Receiver on Nexus 7

↘锁芯ラ 提交于 2020-01-16 14:34:23

问题


I am trying to write a service that runs on phone boot, and must read data off the SD card. At first I was using a reciever for android.intent.action.BOOT_COMPLETED but switched to the intent below to make sure that the SD card has been loaded.

My Issue is that on a my Nexus 7, it doesn't appear to receive the MEDIA_MOUNTED intent. The Nexus 7 doesn't have an SD card (but it has separate SD card partition). I also tried the BOOT_COMPLETED intent, with the same luck. I have tested the same code on the emulator and my Thunderbolt, and both intents work.

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>

The BroadcastReceiver class:

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

I commented out the intent matching just to try and log if the class is executed at all.

My only hunch is that the Nexus 7 doesn't broadcast a MEDIA_MOUNTED because it doesn't have a real SD card; but I can't receive the BOOT_COMPLETED intent either.

And to forstall the question; yes I do have the BOOT_COMPLETED permission.

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

回答1:


How many times must I type in this answer before it starts coming up in enough search results that people will find it? Maybe boldface caps will work:

STARTING WITH ANDROID 3.1, NO BroadcastReceiver WILL WORK, AT ALL, UNTIL SOMETHING HAS MANUALLY RUN ONE OF THE APPLICATION'S OTHER COMPONENTS, SUCH AS A USER RUNNING AN ACTIVITY.

This is in the documentation (albeit not well located), in blog posts, and in many StackOverflow answers, such as:

  • https://stackoverflow.com/a/9084771/115145
  • https://stackoverflow.com/a/11865858/115145
  • https://stackoverflow.com/a/11744499/115145

So, add an activity to your app. You need some activities anyway, for settings to control your background operation, for your documentation, for your license agreement, for your privacy policy, etc.

(note: I'm not really yelling at you -- I am just frustrated that this keeps coming up despite efforts to get the word out...)




回答2:


Please note that many Android devices emulate SD card in the way it does not affect access to the SD card even when desktop accesses it. Therefore it may be that Nexus 7 simply exposes all memory that way, so as it does not really mount anything, it'd not broadcast MEDIA_MOUNTED. If you want to do some tasks on boot, listening to BOOT_COMPLETED is the only correct approach.



来源:https://stackoverflow.com/questions/12255041/broadcast-receiver-on-nexus-7

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!