模拟Android低电量和低内存

65
为了生成通知,我需要知道如何在程序中编写低电量和低内存的中断。请问是否有人能提供建议?我已经了解了Intent。

你需要在代码中重写 onTrimMemory(int level) 方法以处理内存事件。 - IgorGanapolsky
5
低内存 https://play.google.com/store/apps/details?id=me.empirical.android.application.fillmemory(说明:该应用程序为英文名称,已尽力将其翻译成中文) - k4dima
7个回答

64

触发onTrimMemory回调的方法:

adb shell am send-trim-memory <process-name> <level>

例如:adb shell am send-trim-memory com.example.app MODERATE


9
完美。我也喜欢使用 RUNNING_CRITICAL 来获得完整的效果。 - IgorGanapolsky
3
@MaksimDmitriev 当我使用实体设备时,我会遇到这个错误,但在模拟器上却可以正常工作。 - matt---
9
“adb shell am send-trim-memory com.myapp MODERATE”是一条命令,但出现了错误:“Error: Failure to set the level - probably Unknown Process: com.myapp”。您有任何想法吗?这个应用程序包明确存在。此外,我很难找到有关该命令的文档。 - AutonomousApps
12
已解决。错误信息是错误的(关键词是“probably”)。实际上,在这种情况下发生的事情是,尽管它被列为有效级别,但它无法识别“MODERATE”。使用“RUNNING_CRITICAL”可以解决问题。 - AutonomousApps
3
@AutonomousApps会防止您发送当前应用程序状态下无效的TRIM_MEMORY级别。例如,如果您的应用程序在前台,则无法发送高于TRIM_MEMORY_RUNNING_CRITICAL级别的修剪事件。我花了10分钟左右才理解这个问题。 - androidguy
1
这仅适用于模拟器,在我的真实设备上总是出现错误,如:“无法将修剪级别设置为高于当前级别”或“无法在前台进程上设置背景修剪级别”。 - Alberto M

54

使用设备开发人员选项下的后台进程限制也可以模拟低内存。

转到设置 > 开发者选项。 在应用程序部分中,将后台进程限制更改为无后台进程

现在每次切换到另一个应用程序时,您的活动将被终止。 用于测试状态保存和状态恢复。


14
很遗憾,这完全不是真的。这里有一个很好的解释,说明了这个选项的确切作用。 - s.maks
我有一个启用了后台服务和推送通知的应用程序,该应用程序不会像其他应用程序一样被杀死。 - Alberto M

16

是的,这个API会触发与注册到 ComponentCallback2 上的上下文相同的回调,具体地说是 ComponentCallback2#onTrimMemory。由于这里没有提到,所以我想要说清楚。该命令的语法如下: am send-trim-memory [--user <USER_ID>] <PROCESS> [HIDDEN|RUNNING_MODERATE|BACKGROUND|RUNNING_LOW|MODERATE|RUNNING_CRITICAL|COMPLETE] 注意:该命令仅适用于运行 Marshmallow 及以上版本的设备。


3
非常正确。我只能让它在运行Marshmallow及以上版本的设备上工作。 - Demitrian

5
在Android模拟器上,您可以通过连接到模拟器控制台并使用power命令来设置电源状态
至于低内存问题,您只需要确保您的应用程序能够处理在后台时无预警被杀死的情况。测试这一点是Android中极少数需要使用任务管理器的情况之一,或者如果您正在运行Android 2.2,则可以通过设置来关闭应用程序。 有减少应用程序可用内存的方法,但我认为它们是不必要的。

1
嗨,Dave Webb,我想编程实现显示低电量警报,即使它并不是真的低电量。 - user395494
嗨,Dave Webb,模拟器上没问题。但是我怎么在真实设备上做到同样的事情呢? - user395494
当电池电量不低时,无法让手机显示低电量警报。 - David Webb

4

要模拟低电量警告,请按Frank的回答方式尝试使用此命令:

power capacity 10 // It will set the battery level into 10%

对于内存较低的情况:

ulimit -Sv 15000  //The current memory limit will set to 15000 Kb

1
我正在设备上运行应用程序,在DDMS视图中,我可以看到堆内存查看器,并且我看到分配的堆内存为18.2 MB。使用您的命令,我将当前内存设置为1500。那么为什么应用程序没有崩溃或分配的内存没有减少? - Prem
2
@Prem,在通过'telnet localhost 5554'连接后,我尝试使用'ulimit'命令。但始终返回错误“KO:未知命令,请尝试'help'”。我正在使用Win7操作系统。请帮助我。 - Venkatesh Achanta
@IgorGanapolsky 我搜索了一下,这是一个 shell 内置命令,在大多数 Linux 操作系统中都存在,包括 Android。因此,您可以通过 adb shell ulimit -Sv 15000 运行它。 - CalvinChe

1

您可以使用模拟器菜单。只需telnet到模拟器的本地主机(默认端口为5554),然后键入help。按照那里的说明操作即可!


0

为触发内存修剪事件,可以使用一个填充设备所有RAM并触发该事件的应用程序。

在Play商店上有许多这样的应用程序,可以通过搜索“填充RAM”来找到它们。


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