Activity的生命周期

来源:互联网 发布:云盘搭建php源码 编辑:程序博客网 时间:2024/05/16 03:54

谈谈你对Activity的理解?

对于这种“你对什么什么怎么理解”的面试题,最好的回到方式就是用你自己的理解说出来,通俗中夹杂些专业术语,偶尔再蹦出几个英文。当然如果你很牛X,你可以往深了说,只要别漫无目的的说就行。围绕一条主线。这其中如果你对某一方面比较精通,你就应该往你精通的方向引。面试官可能就会顺着你的思路走了。不过现在有很多面试问Android方面的知识不多,问java方面的比较多。

通俗的讲,Activity就是一个应用程序的门面,也可以理解成就是WEB程序中一个页面,当然与web程序中的页面不同的是,web中的一个页面可能只是一个纯粹的展示页面不与用户进行任何交互,而几乎所有的Activity都会与用户交互。当然两者在架构上也有本质区别,Activity与用户的交互通过触发UI的不同事件完成的。而Web程序是通过请求,响应来完成交互的。还有在android中颠覆了很多常规想法,比如在一个Activity中可以打开另一个不在同一应用的Activity。这在其他程序是不可想象的。当然这种设计的出发点也是为了节省系统资源。从View层的角度来看,Activity承载了与用户交互的不同控件。从控制层看,也就是内部逻辑,Activity需要保持各个界面的状态,背后会做很多持久化的操作。包括妥善管理生命周期的各个阶段。(把生命周期引出来了,没准就会问你这方面的)。

下面是文档式的回答:(最好的回答方式两者结合)

首先Activity是android四大组件之一。它是单独的,作为用户与程序交互的一个载体。几乎所有的Activity都与用户交互。Activity创建了一个窗口,你可以通过setContentView这个方法将需要的UI放置在窗口。任何一个应用程序都可以调用单独的一个Activity。

其次,Activity的继承关系 Activity→ContextThemeWrapper→ContextWrapper→Context

最后大部分的Activity的子类都需要实现以下两个接口:

onCreate(Bundle savedInstanceState)接口是初始化activity的地方. 在这儿通常可以调用setContentView(int)设置在资源文件中定义的UI, 使用findViewById(int) 可以获得UI中定义的窗口.

onPause()接口是使用者准备离开activity的地方,在这儿,任何的修改都应该被提交(通常用于ContentProvider保存数据).

所有Activity必须在清单文件里注册一下才能使用。




Activity的生命周期

Android使用任务(Task)来管理活动Activity

 public class Activity extends ApplicationContext {               protected void onCreate(Bundle savedInstanceState);//在活动第一次被创建时调用,完成活动的初始化操作,如加载布局、绑定事件                protected void onStart();//当活动由不可见变成可见时调用                protected void onRestart();//当活动从停止变成运行之前调用,即活动被重新重启onStop-->onRestart-->onStart                protected void onResume();//在活动准备好和用户进行交互时调用,此时活动位于栈顶                protected void onPause();//当活动要启动另外一个活动时被调用,一般会将一些消耗CPU的资源释放并保存一些关键数据                protected void onStop();//当活动从可见变成不可见时调用                protected void onDestroy();//活动被销毁前调用    }

注:当活动不再位于栈顶,但是仍然可见时会调用onPause,并不会调用onStop(例如:新活动是一个对话框式活动),此时活动还是存活的。


1.打开应用(Activity第一次被创建):onCreate() ---> onStart() ---> onResume() 

    然后按下back键:onPause() ---> onStop() ---> onDestroy()

2.如果在第一次创建之后不按back键,而是打开另一个ActivityB:onPause() --->B的onCreate() --->B的onStart() --->B的onResume() ---> onStop()

     这也是为什么不能在onPause()中做一些重量级操作的原因:让新Activity尽快显示并切换到前台

    再按下back键返回第一个Activity:onRestart() ---> onStart() ---> onResume()

    若此时启动的不是另外一个普通的Activity,而是一个DialogActivity:onPause()

    再按下back键:onResume()

3.如果在第一次创建之后不按back键,而是按下Home键:onPause() ---> onStop()

    注意:假设Activity中有一个EditText,里面有输入的内容“test”,如果这个时候再返回Activity会发现EditText中没有字了,这种情况可以定义一个String 类型用来存取EditText输入的值,在onPause()中将输入的值赋给String,在onRestart()中把值赋回来,恢复原先状态

0 0