android中的Activity重新创建和Process重新创建之间的区别

时间:2012-05-02 18:04:32

标签: android process activity-lifecycle

我一直想把它搞清楚,但我现在似乎陷入了困境。基本上我试图理解Activity被销毁和重新创建的时间与运行它的进程被破坏和重新创建之间的区别。

根据此处的图表:http://developer.android.com/reference/android/app/Activity.html,当且仅当重新创建基础应用程序进程时,才会重新创建活动。

但是,假设我用一个按钮创建一个简单的程序:

public class HelloAndroidActivity extends Activity {
private int test = 15;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Button button = (Button)findViewById(R.id.button1);
    button.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            Toast.makeText(getApplicationContext(), test + " ", Toast.LENGTH_SHORT)
                       .show();
            test++;
        }
    });
}
}

现在它会显示数字15,16,17 ......当我点击按钮时。但是,如果我离开程序并转到主菜单并重新输入,或者我更改了屏幕方向,那么它会重新设置为15.因此必须重新创建活动。

但是,该程序一直在运行(正如您在转到任务管理器时所看到的那样),因此该过程尚未被销毁。

同样,如果我将变量test更改为静态变量,那么尽管Activity被销毁并重新创建,它仍会保留其值。因此,该过程必须与活动区别开来。

根据Android Activity网站上的图表,只有当底层进程的内存太少时才会重新创建活动,但是在这里它似乎是在许多其他场景中重新创建的 - 例如屏幕方向,进入主菜单等。

所以我的问题是:Activity生命周期和底层流程生命周期有什么区别?是否存在一个Activity重新创建的路径,Android图表中没有描述它保留底层流程?

非常感谢你对这个问题的任何帮助!

1 个答案:

答案 0 :(得分:1)

  

根据此处的图表:http://developer.android.com/reference/android/app/Activity.html,当且仅当重新创建基础应用程序进程时,才会重新创建活动。

有许多事情会破坏活动,包括调用finish(),用户按下BACK按钮(默认情况下会触发对finish()的调用)或正在进行配置的设备更改(默认情况下,会销毁并重新创建前台活动)。

  

但是,如果我离开程序并转到主菜单并重新输入,或者我更改屏幕方向,则重新设置为15.因此必须重新创建活动。

如果通过“离开程序”,你的意思是“按下BACK按钮”,那么这是有道理的。同样,从纵向切换到横向也是一种配置变化,因此也很有意义。

  

但是,该程序一直在运行(正如您在转到任务管理器时所看到的那样),因此该过程尚未被销毁。

正确。

  

因此,该过程必须与活动区别开来。

正确。应用程序可能包含数十个或数百个活动,以及许多其他组件(服务等)。默认情况下,它们都是单个进程的一部分。

  

根据Android Activity网站上的图表,只有当底层进程的内存太少时才会重新创建活动,

没有

  

活动生命周期与基础流程生命周期之间有什么区别?

该过程将保留在内存中,直到Android需要内存以获取其他内容。 Android根据年龄,活跃组件等选择要根据正在进行的操作终止流程。您可以阅读有关the process lifecycle in the documentation的更多信息。

  

还有一条活动重新创建的路径,Android图表中没有描述它保留了底层流程吗?'

有很多东西会破坏活动,在图表中用箭头指向onDestroy()。我在答案的第一段列举了其中的几个。一旦活动被销毁,如果再次需要该活动的实例(例如,用户重新启动应用程序),则会创建一个新的实例。