当我的应用程序启动时,我会将来自服务器的所有字符串数据加载到散列图中,并从该散列图中读取所有屏幕,以显示按钮名称,文本和屏幕标题。
我依靠这个对象(以及许多其他类似对象)的生命来维持我的应用程序保持功能。
我发现,如果我在几小时后恢复应用程序,它仍然可以正常运行。 但是,如果我打开另外10个应用程序,让它们全部打开并在几个小时后恢复应用程序,它会尝试从其中一个对象中读取,但它们现在已经消失了!
在这些情况下,我发现最好杀死应用程序并重新启动它,并尝试在主要活动的onDestroy中执行此操作,但这种情况适得其反,因为在切换到另一个活动后5秒钟,调用了上一个活动的onDestroy并使用此代码杀死应用程序:
android.os.Process.killProcess(android.os.Process.myPid());
所以我只想在闲置数小时并且资源无效时杀死应用程序。 这样,当用户尝试恢复它时,它将会死并重新启动,从而再次将所有资源加载到内存中。
我在Application类中查找了一个onDestroy方法,但没有一个。 Thre是onTrimMemory方法。
问题是:
如何使用Application.onTrimMemory()回调来终止我的应用程序所需的资源已被销毁?
编辑:实际上,阅读onTrimMemory文档,我留下的印象是它应该通过销毁对象来释放内存,如果我不这样做,那么为什么在恢复应用程序之后,这些对象现在是空值?我不明白。
EDIT2:
我成功解决了我的问题:
我从谷歌下载了一个“Fill Ram”应用程序,专为那些想要了解他们的应用程序在低内存情况下的行为的开发人员而设
我逐渐开始填充ram并看到如何使用值或分别为20,40,60和80来调用onTrimMemory方法
每次我看到它在日志中被调用后,我很快恢复了我的应用程序,然后在60或80左右,我需要的资源为空
我在onResume中插入了一个空指针检查,如果这些资源为null,我执行了以下操作:
if (application.data == null || application.data.size() == 0) {
// Restart app so data is reloaded
Log.e("kill app", "kill app");
Intent mStartActivity = new Intent(this,MainActivity.class);
int mPendingIntentId = 123456;
PendingIntent mPendingIntent = PendingIntent.getActivity(this, mPendingIntentId, mStartActivity, PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager mgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 100, mPendingIntent);
System.exit(0);
}
如此处所指出:
how to programmatically "restart" android app?
问题仍然是半解决的,因为我想在我的应用程序的其他地方可能会丢失一些其他资源,所以我考虑在onTrimMemory 60或80中执行此操作?
我需要更多的帮助来理解这一点。
另外,我应该使用
System.exit(0);
或
android.os.Process.killProcess(android.os.Process.myPid());
我还做了别的事情:
在我的基本活动中,所有其他活动都延伸了,我添加了以下内容:
@Override
public void onTrimMemory(int level) {
super.onTrimMemory(level);
if (level > TRIM_MEMORY_MODERATE) {
// Restart app so data is reloaded
android.os.Process.killProcess(android.os.Process.myPid());
}
}