我一直试图在设备在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");
    }
}

当前回答

其他答案看起来不错,但我认为我应该把所有问题都归结为一个完整的答案。

你需要在AndroidManifest.xml文件中添加以下内容:

In your <manifest> element: <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> In your <application> element (be sure to use a fully-qualified [or relative] class name for your BroadcastReceiver): <receiver android:name="com.example.MyBroadcastReceiver"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver> (you don't need the android:enabled, exported, etc., attributes: the Android defaults are correct) In MyBroadcastReceiver.java: package com.example; public class MyBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Intent startServiceIntent = new Intent(context, MyService.class); context.startService(startServiceIntent); } }

从最初的问题:

<receiver>元素是否在<application>元素中尚不清楚 不清楚是否为BroadcastReceiver指定了正确的全限定(或相对)类名 在<intent-filter>中有一个拼写错误

其他回答

如果你正在使用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会自动用小写完成此权限。

其他答案看起来不错,但我认为我应该把所有问题都归结为一个完整的答案。

你需要在AndroidManifest.xml文件中添加以下内容:

In your <manifest> element: <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> In your <application> element (be sure to use a fully-qualified [or relative] class name for your BroadcastReceiver): <receiver android:name="com.example.MyBroadcastReceiver"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver> (you don't need the android:enabled, exported, etc., attributes: the Android defaults are correct) In MyBroadcastReceiver.java: package com.example; public class MyBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Intent startServiceIntent = new Intent(context, MyService.class); context.startService(startServiceIntent); } }

从最初的问题:

<receiver>元素是否在<application>元素中尚不清楚 不清楚是否为BroadcastReceiver指定了正确的全限定(或相对)类名 在<intent-filter>中有一个拼写错误

在尝试了所有提到的答案和技巧后,我终于找到了为什么代码不能在我的手机上工作。一些Android手机,如“华为荣耀3C Android 4.2.2”,在他们的设置中有一个状态管理器菜单,你的应用程序必须在列表中勾选。 :)

我有一个额外的<category>-tag,不知道这是否有任何区别。

<receiver android:name="BootIntentReceiver">  
        <intent-filter>  
            <action android:name="android.intent.action.BOOT_COMPLETED" />  
            <category android:name="android.intent.category.HOME" />  
        </intent-filter>  
</receiver>

你有没有试过省略if子句"android.intent.action.BOOT_COMPLETED".equals(intent. getaction(),因为接收器可能只接收该意图?

如果在接收类中保留空构造函数,就会遇到这个问题。删除空构造函数后,onRreceive方法开始正常工作。