我目前正在对此进行大量阅读,但认为向一群知识渊博的开发人员提问也绝对不会受到伤害。 这是一个受欢迎的问题,似乎有很多不同的处理方法。
我有一个Android应用程序。它使用OpenGL,因此在启动时会从磁盘和VRAM中加载相当数量的数据。当屏幕旋转以及按下电源按钮时(将手机置于睡眠模式),我丢失了所有数据并且活动被终止。
我不想要这个。该应用程序启动并加载其数据大约需要7秒钟,如果您只是将手机暂停一秒钟,然后必须等待应用再次加载,那真的很烦人。
我熟悉Google概述的应用生命周期,但很难实现适合我特定情况的解决方案。
有什么建议吗?我的总体目标是在手机休眠旋转时保留内存中的以下内容: 1.堆上的应用程序内存 2. VRAM中的App内存
谢谢!
到目前为止:
public class MainActivity
private FH_SurfaceView fGLSurfaceView;
@Override
public void onSaveInstanceState(Bundle outState)
{
super.onSaveInstanceState(outState);
}
@Override
public void onRestoreInstanceState(Bundle savedState)
{
super.onRestoreInstanceState(savedState);
}
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
// Check if the system supports OpenGL ES 2.0.
final ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
final ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo();
final boolean supportsEs2 = configurationInfo.reqGlEsVersion >= 0x20000;
if (savedInstanceState != null) {
/* NEED TO DO SOMETHING HERE?? */
return;
}
else{
this.fGLSurfaceView = new FH_SurfaceView(this);
setContentView(fGLSurfaceView);
}
}
@Override
protected void onResume()
{
super.onResume();
}
@Override
protected void onPause()
{
super.onPause();
}
}
答案 0 :(得分:0)
问题是您的Activity
持有大量数据。当手机休眠时,可能会出于各种原因将其目标锁定,主要是为了确保其他任务的内存,还因为它可能会耗尽处理周期而Android知道它不可见。因此你的问题。这不会发生在所有应用中,只会发生“沉重”的应用。
你可能无法做到这一点,但这里有一些建议:
分析您的数据加载情况。可能是某些部件的计算成本很高,因此它们会减慢处理速度,而其他部分则在内存上很重,但处理起来很轻。然后在onPause
转储重型内存部分,以提高Android不会杀死你的应用程序的几率。您可以获得1-2秒的加载时间而不是当前的7秒。
考虑创建数据所在的Service
,然后绑定到该数据以便访问它。 Android不希望显示Service
,并且您可以在onPause
的{{1}}或onStop
中停止处理,以防止Android终止服务。我意识到这是“棘手的”,因为您的数据当前处于自定义Activity
类中 - 并且存储显示数据不在UI线程上是一件痛苦的事。
此外,出于类似原因,您可能会将数据放入SurfaceView
类。这样做的好处是您不需要绑定器来访问数据。缺点是Android比Application
更有可能破坏这一点(但是这是经验谈论,而不是测试 - 所以,有教养的猜测?)。此外,应谨慎处理Service
课程。
如果一切都失败了,那么试着提供一个有趣的过渡,承认情况的愚蠢。换句话说,向用户传达你知道一种不愉快的情况远比忽视它并希望他们不介意的要好。