BOOT_COMPLETED没有使用Android

时间:2013-12-07 12:22:35

标签: android broadcastreceiver bootcompleted

首先,我知道已经有数百个问这样的问题了,但我已经检查了一段时间,但仍然找不到任何解决方案。

我见过this answer说BOOT_COMPLETED没有发送到应用程序,除非用户在Android 3.1版之后首先启动你的应用程序 但我仍然看到一些应用程序正在这样做,必须有一种方法。我真的需要处理它,否则我也反对在没有用户交互的情况下做某事。

所以这是我的AndroidManifest:

<manifest ... >

<!-- to be activated service on boot is completed -->
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<!-- Keeps the processor from sleeping when a message is received. -->
<uses-permission android:name="android.permission.WAKE_LOCK" />

<application ... >
    <!-- to receive data when boot completed -->
    <receiver
        android:name="myPackage.BootReceiver"
        android:enabled="true"
        android:exported="true"
        android:permission="android.permission.RECEIVE_BOOT_COMPLETED" >
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
    </receiver>
</application>

</manifest>

提前致谢。

编辑:我的广播接收器中没有太多东西可以看,但是这里需要的是:

package myPackage
public class BootReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
    Utils.LogI("BootReceiver", "BootReceiver received!");
    if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
        // Do my stuff
    }
}
}

8 个答案:

答案 0 :(得分:62)

以下这件事对我有用

AndroidManifest.xml

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

<application>    

    <receiver android:name=".BootCompletedReceiver" >
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
            <action android:name="android.intent.action.QUICKBOOT_POWERON" />
        </intent-filter>
    </receiver>

    <service android:name="NotifyingDailyService" >
    </service>

<强> BootCompletedReceiver.class

public class BootCompletedReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent arg1) {
    // TODO Auto-generated method stub
    Log.w("boot_broadcast_poc", "starting service...");
    context.startService(new Intent(context, NotifyingDailyService.class));
}

}

<强> Service.class

 public class NotifyingDailyService extends Service {

@Override
public IBinder onBind(Intent arg0) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public int onStartCommand(Intent pIntent, int flags, int startId) {
    // TODO Auto-generated method stub
    Toast.makeText(this, "NotifyingDailyService", Toast.LENGTH_LONG).show();
    Log.i("com.example.bootbroadcastpoc","NotifyingDailyService");

    return super.onStartCommand(pIntent, flags, startId);
}
}

答案 1 :(得分:29)

这是一个古老而基本的问题,但很多Android开发人员现在仍然对这个问题感到困惑,因为他们需要花时间仔细阅读文档

我看到有人分享了一些链接并说: &#34;这已经不再工作&#34; ,它完全<强>错误和被误解

关于此问题:&#34;我已经看到此答案说BOOT_COMPLETED未发送到应用程序,除非用户在Android 3.1及#34之后首先启动您的应用程序; ,请阅读这些内容(来自官方文档:https://developer.android.com/about/versions/android-3.1.html#launchcontrols)以正确理解:

  • 请注意,应用程序的停止状态活动停止状态不同。系统分别管理这两个停止状态。

  • 应用程序在首次安装但尚未启动时处于停止状态,并且当它们被手动停止时 用户(在管理应用程序)。(他们的意思是强制停止应用程序)

enter image description here

  1. 这意味着用户应至少启动一次应用 安装 来激活应用程序,然后应用程序即可 正常接收来自OS的隐式广播。 (只有一次发布!

  2. &#34;是否安装任何应用并且从未打开甚至只有一次?&#34; ,是的,它是&#39垃圾邮件和骗局应用程序,这项技术有所帮助 用户防止这种情况!

  3. FURTHERMORE,直到现在(Android Oreo 8.0),当Android限制在Manifest(https://developer.android.com/about/versions/oreo/background.html#broadcasts)注册隐式广播时,几个广播目前仍然免于这些限制。 BOOT_COMPLETED 是他们提到的第一个https://developer.android.com/guide/components/broadcast-exceptions.html

    顺便说一下,这是我在这个问题上找到的最佳解决方案:

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
    
    <receiver android:name=".BootReceiver" android:enabled="true" android:exported="true">
                <intent-filter>
                    <category android:name="android.intent.category.DEFAULT"/>
                    <action android:name="android.intent.action.BOOT_COMPLETED"/>
                    <action android:name="android.intent.action.QUICKBOOT_POWERON"/>
                    <!--For HTC devices-->
                    <action android:name="com.htc.intent.action.QUICKBOOT_POWERON"/>
                </intent-filter>
            </receiver>
    

    最后,请仔细阅读文档并仔细思考一次代码:3!

答案 2 :(得分:4)

默认情况下,一些新的平板电脑和Android设备都有安全应用程序。有时这些应用会锁定您的自动启动模式。这个安全应用程序的一个例子是MyAsus经理。所以你可以添加&#34;允许自动启动&#34;到您的应用

答案 3 :(得分:4)

对于Htc设备 添加com.htc.intent.action.QUICKBOOT_POWERON

    <receiver android:enabled="true" android:name=".receivers.BootUpReceiver">
        <intent-filter>
            <category android:name="android.intent.category.DEFAULT" />
            <action android:name="android.intent.action.BOOT_COMPLETED"/>
            <action android:name="android.intent.action.QUICKBOOT_POWERON"/>
            <action android:name="com.htc.intent.action.QUICKBOOT_POWERON"/>
         </intent-filter>
    </receiver>

答案 4 :(得分:3)

问题出在设备上。某些设备仅允许内部应用程序接收此操作(例如:Android 5.1)。

您可以将其添加到您的意图过滤器中作为解决方法

行动android:name="android.intent.action.USER_PRESENT"

用户解锁设备后会触发此操作。

答案 5 :(得分:2)

对于像我一样仍然存在此问题的其他人,如果要在具有引导锁(引脚,模式或其他方式)的设备上进行调试,则OS => 7.0的操作系统需要订阅{ {1}},如下所示:

android.intent.action.LOCKED_BOOT_COMPLETED

您可以在以下链接中找到文档:https://developer.android.com/training/articles/direct-boot

答案 6 :(得分:1)

我遇到的问题是,当我关闭Android 6.0.1面板的电源时,BOOT_COMPLETEDQUICKBOOT_POWERON并不能总是触发我的意图。我已经在互联网上搜索了很长一段时间,并通过在清单文件中添加QUICKBOOT_POWEROFF来找到解决方案。

另请参阅:

HTC's "fast boot" is not broadcasting BOOT_COMPLETED intent nor wiping intents from alarm manager

答案 7 :(得分:0)

要解决此问题,您需要创建一个NotificationListener服务

如果设备> = Build.VERSION_CODES.JELLY_BEAN_MR2并且具有华为设备中的电池优化选项,则您必须请求NotificationListener许可并按以下代码创建NotificationListener服务,然后您将在BOOT_COMPLETED中获得您的接收器

清单接收者:

    <receiver
                android:name=".TestRes"
                android:enabled="true"
                android:exported="true">
                <intent-filter android:priority="1">
                    <category android:name="android.intent.category.DEFAULT"/>
                    <action android:name="android.intent.action.BOOT_COMPLETED"/>
                    <action android:name="android.intent.action.QUICKBOOT_POWERON"/>
                    <action android:name="android.intent.action.USER_PRESENT"/>
                    <action android:name="android.intent.action.REBOOT"/>
                </intent-filter>
 </receiver>

1创建一个NotificationListener服务:

@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
public class DevAppNotificationListener extends NotificationListenerService {

    @Override
    public void onNotificationPosted(StatusBarNotification sbn) {
//        super.onNotificationPosted(sbn);
    }

    @Override
    public void onNotificationRemoved(StatusBarNotification sbn) {
   //     super.onNotificationRemoved(sbn);
    }


}

2检查是否已授予NotificationListener:

static boolean CheckNotificationLisPermission(Context context)
    {

        return NotificationManagerCompat.getEnabledListenerPackages (context).contains(context.getApplicationContext().getPackageName());

    }

3,如果没有,则请求NotificationListener权限:

 Intent intent = new Intent("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS");
            context.startActivityForResult(intent, callBackResultIntent);