0

我正在尝试编写一个在手机启动时运行的服务,并且必须从 SD 卡中读取数据。起初我使用接收器,android.intent.action.BOOT_COMPLETED但切换到下面的意图以确保已加载 SD 卡。

我的问题是在我的 Nexus 7 上,它似乎没有收到MEDIA_MOUNTED意图。Nexus 7 没有 SD 卡(但它有单独的 SD 卡分区)。我也尝试了这个BOOT_COMPLETED意图,同样幸运。我在模拟器和我的 Thunderbolt 上测试了相同的代码,两种意图都有效。

清单:

<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 没有广播 a MEDIA_MOUNTED,因为它没有真正的 SD 卡;但我也无法收到BOOT_COMPLETED意图。

并提出问题;是的,我确实有BOOT_COMPLETED许可。

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

2 回答 2

5

在这个答案开始出现在足够多的搜索结果中以供人们找到之前,我必须输入多少次?也许粗体大写会起作用:

从 Android 3.1 开始,BroadcastReceiver在手动运行应用程序的其他组件之一(例如运行活动的用户)之前,根本不会工作

这在文档中(虽然位置不太好)、博客文章和许多 StackOverflow 答案中,例如:

因此,向您的应用程序添加一个活动。无论如何,您都需要一些活动,用于控制后台操作的设置、文档、许可协议、隐私政策等。

(注意:我并不是真的对你大喊大叫——我只是很沮丧,尽管努力宣传,但这种情况不断出现......)

于 2012-09-03T23:39:21.883 回答
1

请注意,许多 Android 设备模拟SD 卡的方式是它不会影响对 SD 卡的访问,即使桌面访问它也是如此。因此,可能是 Nexus 7 只是以这种方式暴露了所有内存,因此它并没有真正安装任何东西,所以它不会广播MEDIA_MOUNTED。如果你想在开机时做一些任务,听BOOT_COMPLETED是唯一正确的方法。

于 2012-09-03T23:29:45.027 回答