前台服务在执行与互联网相关的操作时遇害

更新:以前,我无法find一个明确的模式,当我的前台服务被杀害。 经过更多的debugging设备(不发生在所有这一切发生),我发现。

1.)很多时候我打开chrome加载一个网站前台服务被杀害。 有时甚至当我使用whatsapp这发生。

2.)没有例外,堆栈跟踪没有显示任何有用的东西。

原来的问题如下:

在StackOverflow中有很多这样的问题,但到目前为止我已经阅读的答案大部分都是说它取决于Android,我们没有100%保证前台服务不会被杀死。 有些答案build议START_STICKY,但是这对我来说并没有什么帮助。

在我的情况下,我有一个音乐播放器应用程序,它有一个前台服务。 此服务在某些设备上被杀害,主要是某些版本的Xiomi(Android版本是5.1.1)。 现在我明白,android可能在内存上很短,所以我的前台服务正在被杀死,但为什么其他音乐播放器应用程序永远不会经历这样的终止。 他们做的事情是什么,我不是?

我通过使用startForeground做了我的服务前台服务。 另外,我还在onStartCommand中返回START_STICKY ,尽pipe这样做没有帮助,因为如果服务中断,服务将在4-5秒后重新启动。 绑定我的服务与我使用的活动

 bindService(playIntent, musicConnection, Context.BIND_AUTO_CREATE | Context.BIND_IMPORTANT ); 

那么,为了防止这种情况的发生,我可以在应用程序中改进/更改哪些内容,如果其他应用程序正常运行,那么在我的情况下肯定会出现问题。 有人可以请帮忙。 提前致谢 !!

编辑:

这就是我所说的startForeground()

 public void sendNotification() { Intent notIntent = new Intent(this, MainActivity.class); notIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); PendingIntent pendInt = PendingIntent.getActivity(this, 0, notIntent, PendingIntent.FLAG_UPDATE_CURRENT); Bitmap bitmap = null; if (!notificationShowing || !forwarded) { Log.i(TAG, "present"); String title = CommonUtils.getSongFromID(songIndex, this); bigView.setTextViewText(R.id.title, title); bigView.setImageViewBitmap(R.id.img, bitmap); smallView.setTextViewText(R.id.title1, title); smallView.setImageViewBitmap(R.id.img1, bitmap); if (pauseButton == 1) { bigView.setImageViewResource(R.id.pause, R.drawable.pause_noti); smallView.setImageViewResource(R.id.pause1, R.drawable.pause_noti); } else { bigView.setImageViewResource(R.id.pause, R.drawable.play_noti); smallView.setImageViewResource(R.id.pause1, R.drawable.play_noti); } musicNotification = builder.setContentIntent(pendInt) .setSmallIcon(R.drawable.logo1) .setTicker(songTitle) .setOngoing(true) .setContentTitle("Playing") .setStyle(new Notification.BigTextStyle().bigText("Song App")) .setContentText(songTitle) .setPriority(Notification.PRIORITY_MAX) .build(); musicNotification.contentView = smallView; musicNotification.bigContentView = bigView; musicNotification.contentIntent = pendInt; Intent switchIntent = new Intent("pause"); switchIntent.putExtra("button", "pause"); PendingIntent pendingSwitchIntent = PendingIntent.getBroadcast(this, 100, switchIntent, PendingIntent.FLAG_UPDATE_CURRENT); bigView.setOnClickPendingIntent(R.id.pause, pendingSwitchIntent); smallView.setOnClickPendingIntent(R.id.pause1, pendingSwitchIntent); Intent switchIntent1 = new Intent("forward"); switchIntent1.putExtra("button", "forward"); PendingIntent pendingSwitchIntent2 = PendingIntent.getBroadcast(this, 100, switchIntent1, PendingIntent.FLAG_UPDATE_CURRENT); bigView.setOnClickPendingIntent(R.id.forward, pendingSwitchIntent2); smallView.setOnClickPendingIntent(R.id.forward1, pendingSwitchIntent2); Intent switchIntent2 = new Intent("previous"); switchIntent2.putExtra("button", "previous"); PendingIntent pendingSwitchIntent3 = PendingIntent.getBroadcast(this, 100, switchIntent2, PendingIntent.FLAG_UPDATE_CURRENT); bigView.setOnClickPendingIntent(R.id.previous, pendingSwitchIntent3); smallView.setOnClickPendingIntent(R.id.previous1, pendingSwitchIntent3); Intent switchIntent3 = new Intent("end"); switchIntent3.putExtra("button", "end"); PendingIntent pendingSwitchIntent4 = PendingIntent.getBroadcast(this, 100, switchIntent3, PendingIntent.FLAG_UPDATE_CURRENT); bigView.setOnClickPendingIntent(R.id.end, pendingSwitchIntent4); smallView.setOnClickPendingIntent(R.id.end1, pendingSwitchIntent4); startForeground(NOTIFY_ID, musicNotification); notificationShowing = true; } forwarded = false; } 

Solutions Collecting From Web of "前台服务在执行与互联网相关的操作时遇害"

由于以下原因, 秀秀手机发生这种情况。

解决scheme为MIUI 7.0 =>安全=>自动启动=>select你想要在后台运行的应用程序=>重新启动重新启动后,您的设备应该能够像其他Android设备一样在后台运行应用程序服务。

MIUI 4.0设置

MIUI AutoStart详细描述

而如果你正在寻找其他的电话,那么检查这里是服务structure.It自动重新启动,但当你重新启动电话BootReceiver。

 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() { } } 

谢谢,希望这会帮助你。

这个服务在某些设备上被杀害,主要是某些版本的Xiomi(Android版本是5.1.1)

不知道这一点,但根据我的理解,这可能是因为

  1. 从供应商定制的错误。
  2. Android中的错误是关于优先化前台服务,这是由服务绑定标志的各种组合(即BIND_AUTO_CREATE,BIND_IMPORTANT等)触发的。阅读Robin Davies的答案。

我不知道你是否使用startService()或不。 但是,如果你不按照这个文件 :

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

如果你确实允许你的服务被启动和绑定,那么当服务启动时,当所有的客户端解除绑定时,系统不会销毁服务。 相反,您必须通过调用stopSelf()stopService()来显式停止服务。

虽然通常应该实现onBind()或onStartCommand() ,但有时还需要实现两者。 例如,音乐播放器可能会发现允许其服务无限期地运行并提供绑定是有用的。 这样,一个活动可以启动服务来播放一些音乐,即使用户离开应用程序,音乐也会继续播放。 然后,当用户返回到应用程序时,该活动可以绑定到该服务以重新获得对回放的控制。

请务必阅读关于pipe理绑定服务的生命周期的章节,以获取有关将绑定添加到启动的服务时的服务生命周期的更多信息。

onStartCommand将在启动服务的情况下被调用,所以START_STICKY只会在startService()情况下工作。

更新进程日志

程序#5:prcp F / S / IF trm:0 22407:com.wave.music.player / u0a2(fg-service)

在你的过程中,使用adj设置prcp (visible foreground service)logging在前台运行的播放器服务,这意味着它几乎是坚不可摧的。 尽pipe如此,您的服务被操作系统所破坏,可能会有非常低的内存来运行新的启动应用程序。 按照这个文件 ,

在系统中只会有一些前台进程,如果内存太less以至于这些进程无法继续运行,这些进程只能作为最后的手段被终止。 一般来说,此时设备已达到内存分页状态,因此需要执行此操作以保持用户界面的响应。

所以我认为你没有做错什么。 我只是想build议你阅读这个官方的Android开发者文档,并尝试在单独的过程中运行你的服务(文档build议这种方法的音乐播放器应用程序)。 要小心实现这个,因为如果做得不正确,它可以很容易地增加而不是减less你的RAM空间。