在Oreo上开机时启动后台服务

8

我有一个非常具体的用例。我需要在Android 8中启动一个后台服务,在启动时运行Web服务器。有人能推荐一种实现这个目标的方法吗?(在Android O中)。

似乎你不能再在启动时启动后台服务了...还有其他方法吗?JobService或者运行前台服务代替?我的代码在Android 8以下可以工作,但在O上似乎不起作用。

清单文件:

<receiver android:name=".ServiceStarter" android:enabled="true">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED"></action>
    </intent-filter>
</receiver>

ServiceStarter (扩展 BroadcastReceiver):


@Override
public void onReceive(Context context, Intent intent) {
    HTTPServerService.startService(context);
}

HTTPServerService.startService()

context.startService(new Intent(context, HTTPServerService.class));

我看过其他类似的问题,但没有一个能够解决我的具体问题。我会感激任何指点。


1
你解决了如何在Oreo上启动长时间运行的服务吗? - Someone Somewhere
我尝试了JobIntentService,但它甚至也不是完全可靠的,因此我们改变了流程,采用从应用程序内部启动的前台服务来消除在引导时启动服务的需要。 - lsrom
4个回答

4

回答

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    context.startForegroundService(new Intent(context, HTTPServerService.class));
} else {
    context.startService(new Intent(context, HTTPServerService.class));
}

AndroidManifest.xml 中添加权限:

<manifest ...>
     ...
     <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
     ...
     <application ...>
     ...
</manifest>

0

JobIntentService正在6中工作,我已经进行了测试。请按照以下方式调用服务

        Intent intent = new Intent(context, UploadService.class);
        intent.putExtra(Constants.JOB_ID, ID);
        UploadService.enqueueWork(context, intent);

而在 UploadService 中使用以下代码

 public static void enqueueWork(Context context, Intent work) {
     enqueueWork(context,UploadService.class,JOB_ID, work);
}

请确保在 enqueueWork 方法中,类名必须相同。


1
你没有回答作者的问题(如何在Oreo上启动后台服务),而是谈论了Android 6和JobIntentService的兼容性,你应该使用评论。 - user924
enqueueWork是什么?它不存在。 - user924
1
@user924,静态的enqueueWork()是一种方便的方法,可以清晰地传递参数。在Activities和Fragments中也是这样做的。只需将Android开发人员提供的enqueueWork()方法复制并粘贴到您的JobIntentService中(您的类将扩展JobIntentService)。希望能对您有所帮助。 - Someone Somewhere
这个包是Android支持库的一部分,该库已不再维护。支持库已被Jetpack的一部分AndroidX所取代。 - Pat Lee

0

很不幸,JobIntentService 在 Android 6 上似乎无法正常工作... 我调用了 enqueueWork,但 onHandle 没有被执行。 - lsrom
这个包是Android支持库的一部分,该库已不再维护。支持库已被Jetpack的一部分AndroidX所取代。 - Pat Lee

0
public void onReceive(Context context, Intent intent) {
    // TODO: This method is called when the BroadcastReceiver is receiving
    // an Intent broadcast.
    if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
        Intent myIntent = new Intent(context, intentservice.class);
        context.startForegroundService(myIntent);        
    }
}

添加一些细节以便更好地理解。 - Jaydeep

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接