当RAM内存清除时,Android应用程序崩溃

时间:2014-12-03 15:21:12

标签: android application-restart

我的应用程序在RAM内存清除后崩溃。由于当前的实现,我无法使用onSavedInstanceState。那么,有没有人知道,当用户试图从最近的应用程序打开它时,我怎么才能重启应用程序?我已经在Main活动中尝试了这个代码,它是所有活动的基类:

if (isFirstApplicationStartUp()) {
        Intent i = new Intent(this, Main.class);
        startActivity(i);
    }
  

isFirstApplicationStartUp()是一个布尔值,从扩展Application的类(在onCreate中)设置为true。

但是这个实现并不像预期的那样工作,因为在执行此代码之前会调用先前的活动。

3 个答案:

答案 0 :(得分:2)

您可能不希望从“最近任务”列表启动时从头开始重新启动应用,因为您的应用可能完全有效。你需要做的是你需要记住你的应用程序是否已被正确“初始化”(无论这意味着什么)。如果用户返回您的应用程序并且该应用程序初始化后该进程已被终止并重新启动,则需要检测此情况,然后将用户重定向回应用程序的第一个活动。

执行此操作的最佳方法是为所有活动创建基类。在此基类中,您可以在onCreate()中实现代码,以检查您的应用是否已正确初始化。如果尚未正确初始化,则应将用户重定向回第一个活动。像这样:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // Check if the application has been restarted by AndroidOS after it has killed the process due to inactivity
    //  in this case, we need to redirect to the first activity and dump all other activities in the task stack
    //  to make sure that the application is properly initialized
    if (!isApplicationInitialized() && !(this instanceof FirstActivity)) {
        Intent firstIntent = new Intent(this, FirstActivity.class);

        firstIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); // So all other activities will be dumped
        startActivity(firstIntent);

        // We are done, so finish this activity and get out now
        finish();
        return;
    }

    // Now call the activity-specific onCreate()
    doOnCreate(savedInstanceState);

您的所有活动都需要从此基类继承,并且不应覆盖onCreate()。相反,他们应该实现方法doOnCreate(),它将从基类'onCreate()调用(见上文)。

注意:只有在应用程序退出之前,根活动(在此示例中为FirstActivity)永远不会完成时,此方法才有效。这意味着您将始终在任务的根目录中拥有FirstActivity的实例。这是必需的,以便Intent.FLAG_ACTIVITY_CLEAR_TOP正常工作。

答案 1 :(得分:0)

Android操作系统负责在需要时清理ram。这意味着它可以在不使用时自由地杀死任何应用程序。应用程序本身会尝试保存应用程序的视图组件,但您负责保存任何其他变量或恢复任何图像。

以下是更详细的说明:http://www.senzumbrellas.com/collection/home.php?sl=en

  

默认情况下,系统使用Bundle实例状态来保存活动布局中每个View对象的信息(例如输入EditText对象的文本值)。因此,如果您的活动实例被销毁并重新创建,则布局的状态将恢复到之前的状态,而您无需代码。但是,您的活动可能包含您要恢复的更多状态信息,例如跟踪用户在活动中的进度的成员变量。


Android不是设置此布尔值,而是为您提供访问任何实例信息的方法。您应该改为覆盖onSaveInstanceState(Bundle savedInstanceState):

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    //save any state variables you want to keep around.
    //this is not rally meant for large memory intensive objects like images

    super.onSaveInstanceState(savedInstanceState);
}

然后在onCreate中检查onCreate中的savedInstanceState:

if(savedInstanceState != null)
{
    //this means that the activity is being restored
}

答案 2 :(得分:0)

在活动中使用共享变量而不是全局变量。这解决了我的问题。