【问题标题】:Broadcast Receiver not receiving BOOT and MEDIA_MOUNTED intent广播接收器未接收到 BOOT 和 MEDIA_MOUNTED 意图
【发布时间】:2015-01-21 09:49:34
【问题描述】:

我正在尝试创建一个简单的 BroadcastReceiver,它可以接收 android.intent.action.BOOT_COMPLETED 意图以及 android.intent.action.MEDIA_MOUNTED 意图。这个想法是在接收到这些意图中的任何一个时启动服务。因此,该服务应在 Android 启动完成后或 USB 存储设备连接到 Android 目标时启动(如果此时该服务尚未启动)。 应用程序使用的权限在本节中定义

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

以下部分定义了负责处理意图和启动相应服务的 BroadcastReceiver。

<receiver
        android:name="com.example.systemupgradeapplication.IntentReceiver"
        android:label="USB Detection Receiver"
        android:enabled="true"
        android:permission="android.permission.RECEIVE_BOOT_COMPLETED" >
        <intent-filter>
            <action android:name="android.intent.action.MEDIA_REMOVED" />
            <action android:name="android.intent.action.MEDIA_EJECT" />
            <action android:name="android.intent.action.MEDIA_BAD_REMOVAL" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.MEDIA_MOUNTED" />
            <data android:scheme="file" />
        </intent-filter>
        <intent-filter android:priority="999" >
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
    </receiver>

下一节定义了应该从广播接收器启动的相应服务

<service android:name=".SysUpgradeService" />

注意:接收器和服务组件在 Android Manifest 的 &lt;application&gt; 部分中定义。

下面的sn-p是负责处理广播的意图的类

public class IntentReceiver extends BroadcastReceiver {
private final static String TAG = "IntentReceiver";
private static boolean m_UsbInserted = false;
private static boolean m_UsbRemoved = true;
@Override
public void onReceive(Context context, Intent intent) {
    Log.d(TAG, "LaunchReceiver::ACTION_MEDIA_MOUNTED :: intent received with path= ");
    // TODO Auto-generated method stub
    //if(intent.)
    String action = intent.getAction();
    if (action.equals(Intent.ACTION_MEDIA_MOUNTED)) {
        String path = intent.getDataString();
        if(path.contains("usb")) {
            m_UsbInserted = true;
            Log.d(TAG, "LaunchReceiver::ACTION_MEDIA_MOUNTED :: intent received with path= "+path);
            Intent myIntent = new Intent(context, SysUpgradeService.class);
            myIntent.putExtra("path", path);
            context.startService(myIntent);
        }

    }else if(action.equals(Intent.ACTION_BOOT_COMPLETED)) {
        Log.d(TAG, "BOOT Completed intent received");
context.startService(new Intent(context, SysUpgradeService.class));
    }

我面临的问题是没有任何意图到达我的广播接收器(IntentReceiver 类中的日志都没有打印在 logcat 中),即使我可以在 Android 调试日志中看到 BOOT_COMPLETE 和 MEDIA_MOUNTED正在广播意图。安卓系统启动后,这个应用程序也没有启动。

感谢您在这方面的帮助,我的方法可能有什么问题以及一些可能的解决方案。

【问题讨论】:

    标签: java android android-intent broadcastreceiver intentfilter


    【解决方案1】:

    好的,所以我将 apk 推送到 /system/priv-app,这是放置自定义 ROM 一部分的系统应用程序的位置。现在我的应用程序中不需要任何活动,因为它是自定义 ROM 的一部分并且被识别为系统应用程序。看来,如果您的应用程序是第 3 方应用程序,它必须具有能够接收广播意图的活动。 但是在这种情况下,我可以控制自定义 ROM 源代码以及设备上的 root 访问权限。所以这两种方法都有效

    1. 让您的应用程序成为自定义 ROM 源代码的一部分,在设备上构建和刷写。
    2. 在设备上获取 root 访问权限,将您的 apk 推送到 /system/priv-app(4.4 及更高版本),重新启动,瞧!

    【讨论】:

    • 是的,它要求我等待 2 天,直到我可以接受自己的答案。感谢提醒@DavidWasser
    【解决方案2】:

    确保您的应用程序中存在至少一个活动。从 Android 3.1 开始,BroadcastReceiver 将在用户手动启动活动之前无法工作,这是为了提供安全性。一旦用户第一次运行该应用程序,那么您的 BroadcastReceiver 将始终运行,除非它不强制停止它。首次启动活动后,即使重新启动设备,您的广播接收器也会运行。

    【讨论】:

    • 您的意思是说我可以在安装应用程序后启动一次虚拟空白活动,此后即使我在重新启动后不启动/启动活动,应用程序将继续接收意图并启动服务随心所欲,对吧?
    • 你在这个应用程序中有任何活动吗?
    • 不,我在此应用程序中没有任何活动。想法是在后台线程中启动服务,该应用程序应该执行系统升级,类似于在手机/平板电脑中升级 Android 软件的方式,因此我们的目的实际上不需要 Activity。
    • 好的,如果没有单一活动,您将不会收到任何意图。这是肯定的。根据 android 3.1 的安全问题,您必须至少有一项活动。您的代码将在 Android 3.1 以下运行,但不能在 android 3.1 及更高版本上运行。
    • 如果应用程序是自定义 ROM 的一部分,那么我相信您可以解决这个问题。我不确定如何,因为我从未构建过自定义 ROM。但是在此应用未经过系统签名的普通设备上,您的应用在安装时将处于“停止状态”,并且永远不会获得任何广播 Intent。您对此无能为力。
    猜你喜欢
    • 1970-01-01
    • 2020-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多