START_STICKY无效。

4
我曾经提出过一个关于保持服务活动的问题,但是我没有找到解决方案,所以我有另一个更简单的问题。
Android文档中说,如果在低内存状态下使用START_STICKY启动服务,并且Android终止该服务,则将重新创建该服务,如果我没记错的话。
但是,这个服务会在一段时间后被杀死并从正在运行的任务中消失,但它没有被重新创建!我在我的手机上(Android 4.4.2)运行此服务,当屏幕开启时,它能够存活约20分钟,但当屏幕关闭时,它在约3或4分钟后就消失了......在我的平板电脑上(同样是Android 4.4.2),它的存活时间更长,大约为4或5个小时,然后又消失了(在不同的测试中,我得到了不同的结果)。我甚至在Android 5上进行了测试,结果与搭载Android 4.4.2的平板电脑相似。
我是否遗漏了什么?我认为只要我们使用return START_STICKY,服务就不会被销毁,直到我调用stopService。
以下是我的服务:
public class MyService extends Service {
    @Override
    public void onCreate() {
        super.onCreate();
    }

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

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    public void onDestroy() {
        super.onDestroy();
    }
}

抱歉我的英语不好 :)


可能与此处讨论的问题有关:https://dev59.com/n2Ij5IYBdhLWcg3wGRiM。 - Bob Snyder
你测试这个用了哪个设备? - Nicks
2个回答

7

对某些人可能有用--

此问题与基于AOSP的ROM设备无关。因此,Android 4.4.2版本不是问题。

因此,一些设备(华为,LAVA,小米)配备了预安装的启动管理器或节能器,并运行在定制的Android ROM上。所以这些设备通常不支持粘性服务。

因此,可能的选项是实现类似看门狗计时器并在中间检查服务,如果未启动,则可以再次运行该服务。可能的影响可能会对电池消耗产生影响。


2
非常感谢您提供的这个好建议,正是我在运行Android 5.1的小米红米Note 3 Pro上遇到的问题! - xyman

3
该服务会被重新创建,而不是重新启动。 如果你覆盖了onCreate方法并且使用Log.d或Toast进行输出,你会发现在你的活动和应用程序被销毁后,onCreate方法会被调用。
因此,在它被重新创建后保持其运行的技巧是在onCreate方法中编写代码,并仅使用onStartCommand方法来返回START_STICKY。

小米,奥利奥,我可以确认确切的行为。服务已经重新创建,但没有重新启动。感谢意外的想法! - Milan Švec

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