有什么办法可以强制应用程序始终在后台运行?


12

在Ice Cream Sandwich(ICS)上,操作系统将您的应用程序分类,并且每个类别都有其自己的阈值,在该阈值中,操作系统使用它来确定哪个应用程序在内存不足时首先关闭。

你们中是否有人生气过,比如说您打开了一个计时器在后台运行以测量某事的时间,然后又打开了几个应用程序并回到计时器,只是看到它已重置或关闭?我的意思是说,真的,这确实令人讨厌。

是否有一种方法可以强制应用程序即使在操作系统内存不足时也可以在后台继续运行?


7
这是应用程序的错误代码的标志。用户永远不必为此烦恼,Android提供了手段,以便应用程序可以保存其状态并在以后恢复状态(因为早期的Android版本)。您应该将错误报告发送给App开发人员。
流量

Answers:


8

接受的答案原来是不正确或过时的。Xposed应用程序的“应用程序设置”模块允许您基于每个应用程序指定以防止应用程序被杀死或释放:

http://repo.xposed.info/module/de.robv.android.xposed.installer

http://repo.xposed.info/module/de.robv.android.xposed.mods.appsettings

在玩更改此类低级行为的应用程序时,当然应谨慎负责。


应该注意的是,这需要root用户,并且需要对Android OS进行大量修改。
sweisgerber.dev

5

简单的答案:否。Android始终使用OOM(内存不足)优先级来释放未使用的内存。您可以使用某些任务管理器更改应用程序的优先级(至少在重新启动之前),但即使那样,如果内存不足,后台的应用程序也会开始被杀死。

考虑这种情况:您下载了一个编码错误的应用程序,该应用程序在启动时运行,会导致缓冲区溢出并占用所有内存。通常情况下,此应用会被杀死,但是如果将其设置为保持打开状态,则会有效地阻塞您的手机,直到重新启动为止,然后重新启动,等等。

某些计时器使用优先级较高的服务来避免此问题,但是如果在计时器处于后台时启动足够的高性能,占用资源的应用程序,最终将被杀死。


1
IMO,并不需要那样。默认情况下,让系统按照其旧方式运行,并且如果用户希望某个特定应用仅在需要时在特定时刻在后台运行,则只需提供该选项即可。由于用户可以自行决定“固定”应用程序,因此不需要其他权限类别。我不希望某个应用一旦运行就永远无法停止。我只希望有一个选项可以在有需要时(就像我在问题中描述的那样)进行此操作。
supertonsky 2012年

1
@onik缓冲区溢出与占用内存无关。您知道什么是缓冲区溢出吗?

3
@onik,所以答案是否定的,您不知道缓冲区溢出是什么。得到它了。

1
@onik链表中的无限循环肯定也很可能使您在循环Integer.MAX_VALUE时间之前就陷入了OOM 。为什么您认为事情仍然受到限制Integer.MAX_VALUE

1
@onik正确:根据定义,缓冲区溢出无法扩展分配的内存大小。如果它扩展了分配的内存大小,则不是缓冲区溢出。我认为您正在考虑无限循环。
Mooing Duck

1

不会。但是,我想到了两种缓解问题的方法,但这两种方法都只能由开发人员实施:第一种是显示通知,Android将使执行此操作的应用程序比其他应用程序具有更高的优先级。第二个是保存开始时间,因此当计时器最终重新启动时,不会被重置。


1
毫无理由地以前台优先级运行应用程序(这就是为什么需要通知的原因)被认为是不好的做法。如前所述:Android提供了一个不错的Api,它甚至允许不受OOM杀手影响的计时器/计数器。Dianne Hackborn撰写了一篇有关该主题的不错的帖子
Flow

我毫不怀疑有这样的API,但是在此问题中前面提到过什么?
Erik

1
另外,很明显,在这种情况下,有可能保持应用程序始终运行,这与您发布的游戏示例不同。
Erik

4
没有任何理由仅因为计时器而使应用程序保持运行。只需使用onSaveInstanceStateonRestoreInstanceState保护App状态(包括计时器信息)即可。无需在前景中运行。即使是警报,您也可以使用它AlarmManager来确保稍后执行。应该使用前景的唯一原因是:1.您正在进行一些实际的前景活动,例如播放音乐或播放视频。2.您想保持数据连接打开(例如,IMAP IDLE(推))。
流量

0

第一种方法:-如果您在程序中创建了粘滞线程,可以,可以强制使程序继续运行。但是请记住,处于高级设置模式的用户可以停止后台运行的应用程序。但是,如果您以在发生任何Give事件时开始启动粘滞线程的方式编写粘滞线程,则可以实现此目的。

第二种方法:如果用户不是扎根的android,并且您想在后台运行应用程序。在应用程序的后台使用SL4脚本。使用脚本进行后台检查和程序,并编写前端以显示其他内容。

例如:在大多数游戏引擎中,这是内置的。即使用户关闭了应用程序,它们也连接到服务器。引擎在电话中创建多个脚本的原因(在任何特定事件下都会对其进行随机检查),并且使用TRIGGER在前景背景上连续运行您的应用。

***很抱歉,TYPO的..拼写检查器不可用。希望你实现你想要得到的。


欢迎使用Android Enthusiast,这是一个针对Android最终用户的问答网站。据我了解,您提供的2种方法只能在开发人员端完成,即拥有应用程序源代码的方法。不幸的是,这可能对这里的大多数读者没有帮助,因为他们没有开发应用程序。如果这可能适用于非开发人员,请考虑编辑答案以清楚地说明如何进行操作而无需触碰应用程序的源代码。谢谢。
Andrew T.

-1

有时可以选择锁定应用程序。这样可以防止在手机中杀死停止该应用程序。

锁定选项在操作系统本身中不可用,使用某些第三方应用程序(如GO Task Manager等)可以提供帮助。


2
OOM杀死是由内核完成的,没有任何应用程序可以阻止或“锁定”进程。您链接到的应用程序是一个任务杀手,可以杀死应用程序本身。您所指的锁定功能只会阻止任务杀手杀死它。
Erik
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.