【问题标题】:Broadcast Receiver on Nexus 7Nexus 7 上的广播接收器
【发布时间】:2012-09-04 07:39:21
【问题描述】:

我正在尝试编写一个在手机启动时运行的服务,并且必须从 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 没有广播MEDIA_MOUNTED,因为它没有真正的 SD 卡;但我也无法收到BOOT_COMPLETED 意图。

为了解决这个问题;是的,我确实拥有BOOT_COMPLETED 权限。

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

【问题讨论】:

  • 你有活动吗?您是否在重启设备之前运行过一次活动?
  • @CommonsWare 无活动,接收器类运行服务。

标签: java android broadcastreceiver android-manifest


【解决方案1】:

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

从 ANDROID 3.1 开始,没有 BroadcastReceiver 将完全有效,直到有人手动运行应用程序的其他组件之一,例如运行活动的用户

这在documentation(虽然位置不太好)、blog posts 以及许多 StackOverflow 答案中,例如:

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

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

【讨论】:

  • 不,没关系,我真的很惊讶我在搜索中没有看到任何内容(我专注于 SD 卡问题,而不是意识到 BroadcastReciever 本身没有运行)。你的解释很有道理。我明天会写一个活动,看看它是否能解决问题,但可能会接受 Webnet 的回答,因为我的问题更集中在 SD 卡上。
  • @Ancantus:我怀疑一旦您通过运行活动将应用程序从“停止”状态移出,您会发现两个接收器都开始工作。
【解决方案2】:

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

【讨论】:

  • 好的,所以我是正确的,Nexus7 不会广播 SD 卡安装。因此,当收到BOOT_COMPLETED 意图时,SD 卡分区应该可用。有什么理由我不会收到那个意图吗?
  • 我无法确定,因为我这里没有 Nexus,但如果没有 SD 卡可挂载,那么这听起来是我不广播 MEDIA_MOUNT 的充分理由。
  • 有什么方法可以知道设备是否会调用 BOOT_COMPLETED。
  • 如果您重新启动设备,它将广播BOOT_COMPLETED。无需检查。
猜你喜欢
  • 1970-01-01
  • 2018-10-27
  • 1970-01-01
  • 2014-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多