Android 前台服务在执行与internet相关的操作时被终止

Android 前台服务在执行与internet相关的操作时被终止,android,android-service,Android,Android Service,更新:以前,我找不到一个定义良好的模式,说明我的前台服务何时被终止。在对发生这种情况的设备(并非所有设备)进行更多调试后,我发现了这种情况。 1.)很多时候,当我打开chrome加载一个网站时,前台服务被终止。有时甚至在我使用whatsapp时也会发生这种情况。 2.)没有例外,stacktrace没有显示任何有用的内容。 原问题如下: 关于StackOverflow有很多这样的问题,但到目前为止,我读到的答案大多是说它是由Android操作的,我们不能100%保证前台服务不会被终止。一些答案建

更新:以前,我找不到一个定义良好的模式,说明我的前台服务何时被终止。在对发生这种情况的设备(并非所有设备)进行更多调试后,我发现了这种情况。

1.)很多时候,当我打开chrome加载一个网站时,前台服务被终止。有时甚至在我使用whatsapp时也会发生这种情况。

2.)没有例外,stacktrace没有显示任何有用的内容。

原问题如下:

关于StackOverflow有很多这样的问题,但到目前为止,我读到的答案大多是说它是由Android操作的,我们不能100%保证前台服务不会被终止。一些答案建议开始时要有粘性,但这对我的情况没有多大帮助

在我的例子中,我有一个音乐播放器应用程序,它有一个前台服务。这项服务在某些设备上被终止,主要是Xiomi的一些版本(Android版本是5.1.1)现在我明白android可能内存不足,因此我的前台服务将被终止,但为什么其他音乐播放器应用程序从未经历过这样的终止呢。什么是他们做得对而我做得不对?

我使用
startForeground
进行前台服务。另外,我在onStartCommand中返回
START\u STICKY
,尽管这没有帮助,因为如果终止,服务将在4-5秒后重新启动。将我的服务与我使用的活动绑定

bindService(playIntent, musicConnection, Context.BIND_AUTO_CREATE | Context.BIND_IMPORTANT );
那么,为了防止这种情况发生,我到底可以改进/更改我的应用程序,如果其他应用程序工作正常,那么我的情况一定是出了问题。有人能帮忙吗。提前谢谢

编辑:

这就是我如何称呼startForeground()

此服务在某些设备上被终止,主要是在某些版本的 Xiomi(Android版本为5.1.1)

对此不确定,但据我了解,这可能是因为

  • 来自供应商的操作系统自定义中的错误
  • Android中关于前台服务优先级的bug,由服务绑定标志的各种组合(即绑定、自动创建、绑定、重要等)触发。阅读Robin Davies的答案
  • 我不知道你用不用。但如果你不这样做,那么按照这个:

    您可以创建一个既已启动又已绑定的服务。就是 可以通过调用
    startService()
    启动服务,这允许 服务无限期运行,并允许客户端绑定到 通过调用调用服务。(这称为绑定到已启动的服务)

    如果确实允许启动和绑定服务,则当 服务已启动,系统不会在 所有客户都解除绑定。相反,您必须通过 调用
    stopSelf()
    stopService()

    尽管您通常应该实现或 ,有时两者都需要实现。对于 例如,音乐播放器可能会发现允许其服务 无限期运行并提供绑定。这样,活动就可以 启动服务播放一些音乐,音乐将继续播放 即使用户离开了应用程序。然后,当用户返回 对于应用程序,活动可以绑定到服务以恢复 播放控制

    在向已启动的服务添加绑定时,请务必阅读关于的部分,以了解有关服务生命周期的更多信息

    启动服务时将调用
    onStartCommand
    ,因此
    START\u STICKY
    仅在
    startService()时有效

    流程日志更新

    程序5:prcp F/S/IF trm:0 22407:com.wave.music.player/u0a2 (前景服务)

    在进程日志中,使用adj设置
    prcp(可见的前台服务)
    记录在前台运行的播放器服务,这意味着它实际上是坚不可摧的。尽管如此,您的服务仍被操作系统破坏,但运行新发布的应用程序的可用内存可能非常少。据此,

    系统中只有几个前台进程,这些进程 只有当内存太低,甚至 这些进程可以继续运行。一般来说,在这一点上 设备已达到内存分页状态,因此需要执行此操作 以保持用户界面的响应性


    所以我认为你没有做错什么。我只是想建议你们阅读Android开发者的官方文档,并尝试在单独的过程中运行你们的服务(文档建议音乐播放器应用采用这种方法)。要小心实现这一点,因为如果操作不当,它很容易增加而不是减少RAM占用空间

    由于以下原因,Xiomi手机发生了这种情况

    MIUI 7.0解决方案=>安全性=>Autostart=>选择要在后台运行的应用=>重新启动 重新启动后,您的设备应该能够像其他android设备一样在后台运行应用程序服务

    若你们在寻找其他的电话,那个么请检查这里的服务结构。它会自动重启,但当你们重启电话呼叫接收器时

    public class AppService extends Service {
    
    private class LocalBinder extends Binder {
        public AppService getServerInstance() {
    
            return AppService.this;
        }
    }
    
    
    @Override
    public IBinder onBind(Intent intent) {
        return mBinder;
    }
    
    
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // If we get killed, after returning from here, restart
    
        return Service.START_STICKY;
    }
    
    @Override
    public void onCreate() {
        super.onCreate();
    
    } 
    
    @Override
    public void onDestroy() {
    
    }
    
    }
    

    谢谢,希望这能对您有所帮助。

    您能演示一下如何调用startForeground(),当前台服务被终止时,您是否注意到任何特定的模式?例如:当你打开另一个音乐播放器应用程序或打开youtube等时?@AADTechnical No没有特定的模式,即使我只保留它自己,它也会在一个小时后停止while@ucsunil谢谢你的回复,我已经添加了代码!!感谢您确认是否有人打电话给您?感谢您抽出时间回答。我正在使用startService()并将我的活动绑定到我的服务。因为这对m很有效
    public class AppService extends Service {
    
    private class LocalBinder extends Binder {
        public AppService getServerInstance() {
    
            return AppService.this;
        }
    }
    
    
    @Override
    public IBinder onBind(Intent intent) {
        return mBinder;
    }
    
    
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // If we get killed, after returning from here, restart
    
        return Service.START_STICKY;
    }
    
    @Override
    public void onCreate() {
        super.onCreate();
    
    } 
    
    @Override
    public void onDestroy() {
    
    }
    
    }