用户退出应用后如何保持后台服务运行

14

我想创建一个服务,即使用户通过从运行进程菜单中将进程移出屏幕来关闭应用程序,该服务仍会执行后台作业。

我尝试的方法是通过像这样声明的方式在不同的进程中创建服务:

  <service
        android:name=".service.Service"
        android:enabled="true"
        android:icon="@drawable/ic_launcher"
        android:process=":my_process" >
  </service>

而 onStartCommand() 方法是:

    @Override
public int onStartCommand(Intent intent, int flags, int startId) {
    return START_STICKY;
}

嗨,你有找到解决方案吗?我已经搜索了几个小时来解决这个问题,但是我没有找到解决方案。 你的代码看起来和我的一模一样。 - JustADev
我通过以下代码简单地启动了我的服务:ContextWrapper cont = new ContextWrapper(getBaseContext()); cont.startService(service); - JustADev
与此相关的内容:https://dev59.com/32Qn5IYBdhLWcg3wrouL - Ciro Santilli OurBigBook.com
如果您从该服务显示通知,它将防止操作系统终止它。 - Mohammad Ersan
4个回答

9
根据Android文档,您可以通过使用属性来实现此行为:
 android:isolatedProcess="true"

顺便说一下,我知道这不是回答问题,但它可能也会帮助一些人 - 最近,我发现了一个很棒的第三方库,Evernote开发人员创建了它。它的名字叫Android-Job,其目的是创建在不同进程上运行并可以在设备重启后再次激活的作业,真是太棒了。


这个库非常老了。使用它还好吗? - shikhar bansal
是的,我们正在广泛使用它。不确定,但我认为它会不时地得到新的提交。 - Nativ
1
看起来在Oreo上添加了isolatedProcess=true后,服务甚至没有启动。 :( - midhunhk
它是否仍适用于最新的Android版本? - Ahmad
@Ahmad 对不起回复晚了。我不知道。我几年前就放弃了这个项目。 - Nativ

1
实际上,您可以实现不同类型的服务。请使用Service而不是IntentService。在那里,您需要查看START_STICKY,START_NOT_STICKY和START_REDELIVER_INTENT,即使您的活动停止运行,您也可以使您的服务在后台运行。请参阅Android服务链接,还要注意AIDL服务。

2
我使用了 START_REDELIVER_INTENT,但是当用户关闭应用程序时,我的服务仍然停止了。 - Saeed Neamati
1
我使用了START_STICKY,但是即使用户强制关闭应用程序,我的服务仍然会停止。 - Sabari Karthik

0

你可以使用Handler和Runnable类来实现这个功能

   @Override
    public void onCreate()
    {

        Toast.makeText(context, "SMS SERVICE START", Toast.LENGTH_SHORT).show();


        handler=new Handler();
        runnable=new Runnable() {
            @Override
            public void run()
            {

                    TASK();
                    handler.postDelayed(runnable,180000);
// 3min delay
            }
        };

        handler.postDelayed(runnable,180000);
        super.onCreate();
    }

此任务持续运行3分钟。

public void TASK()
{
     //your task 

}

-8

服务被设计为在后台运行,无需不同的进程。

来自服务文档:

一旦启动,服务可以无限期地在后台运行,即使启动它的组件被销毁。

然而,当服务完成工作时,应该停止自己。IntentService是开始实现服务的最简单方法。


是的,我看到了这行代码,但每次关闭应用程序时服务也会被销毁。顺便说一下,我不知道是否重要,但该服务实现了OnSensorListener以监听加速度计变化(运动..)。 - Nativ
@powerX 你是如何启动该服务的?你是通过绑定还是使用 startService 进行的? - brillenheini
我正在使用带有意图的startService来启动我的服务。 - Nativ
@powerX 抱歉,我不知道。 - brillenheini

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