4

我正在尝试监听重启事件。

我创建了以下类:

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

public class OnBootReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i("MYBOOTRECEIVER", "HELLO!");
    }
}

然后在清单文件中,我放入了以下 xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.mypackage"
    android:installLocation="internalOnly"
    android:versionCode="1"
    android:versionName="1.0" >
    <uses-sdk
        android:minSdkVersion="3"
        android:targetSdkVersion="8" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <application android:label="@string/app_name" >
        <receiver android:name=".OnBootReceiver" >
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <action android:name="android.intent.action.QUICKBOOT_POWERON" />
                <category android:name="android.intent.category.HOME" />
            </intent-filter>
        </receiver>
    </application>
</manifest>

但是,在我安装了这个应用程序并重新启动设备后,什么也没有发生。(我使用的是带有 android 3.2 的 Galaxy Tab 8.9)。正如您从清单中看到的那样,我已经在内部存储器上安装了应用程序(就像在 stackoverflow 上的类似问题上所建议的那样)......我还进行了 Quickboot_poweron 操作(查看 Galaxy 选项卡是否具有与 htc 设备类似的行为) ……但什么都没有。我希望有人能帮助我!

4

3 回答 3

8

我早些时候在 3.0 后的设备上遇到了同样的问题。

原因是

从 3.1 开始,当安装应用程序时,它们处于“停止”状态,因此在用户明确启动它们之前它们将无法运行。按下强制停止将使它们返回此状态。

一旦用户第一次运行应用程序(并且没有强制停止它),一切都会像以前一样 - 重新启动将导致接收到 BOOT_COMPLETED 广播等等。但是,如果用户安装了该应用程序,除非他们手动运行该应用程序,否则将不会收到任何广播。

因此,在您的情况下,您将必须创建启动器活动并确保您至少启动该启动器活动一次,然后您将开始接收启动事件广播。

于 2012-06-19T10:29:59.450 回答
1

问题在于,对于 Honeycomb 及更高版本,广播信号不会自动启动尚未启动的应用程序。有一个标志可用于更改此设置,但是 BOOT_COMPLETED 广播不带有该标志。您需要安装在系统分区上才能克服这种细微差别。

如果您无法在系统分区上安装,则需要找到其他启动方式——通过说服用户手动启动您,或让用户安装您提供的小部件等。

于 2012-06-19T10:23:13.427 回答
0

除了类别部分之外,清单中提到的操作是正确的,如果您只想接收启动完成,则可以排除。在 Receiver 文件中,这可以正常工作,但您应该始终使用 if-else 语句来区分收到的操作。

    if (action.equals(android.intent.action.BOOT_COMPLETED)) {
       Log.i("MYBOOTRECEIVER", "BOOT COMPLETED RECEIVED");
    }
于 2012-06-19T10:23:15.847 回答