我一直试图在设备在android上启动时启动一项服务,但我无法让它工作。我在网上看了一些链接,但没有一个代码工作。我是不是忘了什么?

AndroidManifest.xml

<receiver
    android:name=".StartServiceAtBootReceiver"
    android:enabled="true"
    android:exported="false"
    android:label="StartServiceAtBootReceiver" >
    <intent-filter>
        <action android:name="android.intent.action._BOOT_COMPLETED" />
    </intent-filter>
</receiver>

<service
    android:name="com.test.RunService"
    android:enabled="true" />

BroadcastReceiver

public void onReceive(Context context, Intent intent) {
    if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction())) {
        Intent serviceLauncher = new Intent(context, RunService.class);
        context.startService(serviceLauncher);
        Log.v("TEST", "Service loaded at start");
    }
}

当前回答

作为附加信息:BOOT_COMPLETE在外部存储挂载之前发送给应用程序。因此,如果应用程序被安装到外部存储,它将不会收到BOOT_COMPLETE广播消息。

更多详细信息,请参见广播接收器侦听“引导完成”部分。

其他回答

请注意,在问题的开头,有一个拼写错误:

<行动android: name = " android.intent.action._BOOT_COMPLETED " / >

而不是:

<行动android: name = " android.intent.action.BOOT_COMPLETED " / >

一个小“_”和所有这些麻烦:)

如果你正在使用Android Studio,你非常喜欢自动完成,那么我必须告诉你,我正在使用Android Studio v 1.1.0,我使用自动完成以下权限

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

Android Studio Auto-completedRECEIVE_BOOT_COMPLETED都是小写的,比如receive_boot_completed,我一直在拉我的头发,因为我已经列出了我的清单,为启动服务在启动时做的事情。我刚刚再次确认

Android Studio会自动用小写完成此权限。

事实上,我不久前遇到了这个麻烦,而且它非常非常容易修复,如果你设置了"android.intent.action.BOOT_COMPLETED"权限和intent-filter,你实际上没有做错什么。

注意,如果你在Android 4。X,你必须在启动服务之前运行广播监听器,这意味着,你必须先添加一个活动,一旦你的广播接收器运行,你的应用程序应该像你预期的那样运行,然而,在Android 4上。X,我还没有找到一种方法来启动启动没有任何活动的服务,我认为谷歌这样做是出于安全原因。

我刚刚发现,可能是因为设置>电源中的快速启动选项

当我关闭这个选项时,我的应用程序接收到一个this广播,而不是其他。

顺便说一下,我在HTC Incredible S上安装了Android 2.3.3。

希望能有所帮助。

如何在设备启动时启动服务(autorun app等)

首先:自版本Android 3.1+你不会收到BOOT_COMPLETE如果用户从未启动你的应用程序至少一次或用户“强制关闭”应用程序。 这样做是为了防止恶意软件自动注册服务。这个安全漏洞在最新版本的Android中已经被修补。

解决方案:

创建带有活动的应用程序。当用户运行它一次应用程序可以收到BOOT_COMPLETE广播消息。

第二:在挂载外部存储之前发送BOOT_COMPLETE。如果app被安装到外部存储,它不会收到BOOT_COMPLETE广播消息。

在这种情况下,有两个解决方案:

将应用程序安装到内部存储 在内部存储中安装另一个小应用程序。这个应用程序接收BOOT_COMPLETE并在外部存储上运行第二个应用程序。

如果你的应用程序已经安装在内部存储中,那么下面的代码可以帮助你理解如何在设备启动时启动服务。


在Manifest.xml

许可:

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

注册你的BOOT_COMPLETED接收器:

<receiver android:name="org.yourapp.OnBoot">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED"/>
    </intent-filter>
</receiver>

注册您的服务:

<service android:name="org.yourapp.YourCoolService" />

在接收器OnBoot.java中:

public class OnBoot extends BroadcastReceiver
{

    @Override
    public void onReceive(Context context, Intent intent) 
    {
        // Create Intent
        Intent serviceIntent = new Intent(context, YourCoolService.class);
        // Start service
        context.startService(serviceIntent);

    }

 }

对于HTC,如果设备没有捕获RECEIVE_BOOT_COMPLETED,你可能还需要在Manifest中添加这段代码:

<action android:name="android.intent.action.QUICKBOOT_POWERON" />

接收器现在看起来是这样的:

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

如何测试BOOT_COMPLETED没有重新启动模拟器或真实设备? 很容易。试试这个:

adb -s device-or-emulator-id shell am broadcast -a android.intent.action.BOOT_COMPLETED

如何获取设备id?获取带有id的连接设备列表:

adb devices

默认情况下,您可以在ADT中找到:

adt-installation-dir/sdk/platform-tools

享受!)