Activity,在Android开发中,经常使用到,出境频率是相当高的。今天就来仔细研究一下Activity。
一、概述。
以下描述信息来自Android官网。
Activity是单独的,用于处理用户操作。几乎所有的Activity都与用户交互,因此Activity类可以创建一个窗口,使用setContentView()来设置UI。Activity经常呈现给用户是全屏窗口,它们也可以以其他方式使用:浮动窗口,通过设置一个主题;或者嵌入另外一个Activity。
有两个方法几乎所有的Activity子类都会实现:
1.onCreate()。
在该方法中初始化Activity。最重要的是,这里通常会调用setContentView()来加载布局文件为设置UI,并且使用findViewById()方法取回你在UI中交互的组件。
2.onPause()。
当用户离开Activity时需要处理的地方。最重要的是,用户进行的任何更改都应该在此提交。
为了能够使用Context.startActivity(),所有的Activity类都必须在AndroidManifest.xml文件中定义有相关的“Activity”项。
从上面的简单描述中,可以得知,Activity主要是用来与用户交互,它可以加载UI布局。Activity是Android系统特有的类,我们在使用时不能‘new’。
下面介绍Activity生命周期。
二、Activity生命周期。
首先看一张图
该图是Android官方文档中的Activity生命周期图。
由上图可以得知,(场景是A-Activity有一个按钮,点击后会启动B-Activity)
1.A-Activity从启动到运行,会依次调用onCreate() -> onStart() -> onResume();
2.此时点击按钮启动B-Activity,将依次执行A:onPause() -> B:onCreate() -> B:onStart() -> B:onResume() -> A:onStop();
3.此时如果点击Back键,将依次执行B:onPause() -> A:onRestart() -> A:onStart() -> A:onResume() -> B:onStop() -> B:onDestroy();
4.此时如果再次点击Back键,将依次执行A:onPause() -> A:onStop() -> A:onDestroy();
下面仔细介绍这几个生命周期的方法;
1.onCreate();表示Activity正在被创建。
该方法是Activity创建时第一个调用的方法,用于初始化,例如加载布局、显示数据等。
2.onStart();表示Activity正在被启动。
该方法表示Activity已经可见了,但是还未显示,用户还看不到,没有获取到焦点;该方法可能会执行多次。
3.onResume();表示Activity已经可见。
该方法表示Activity已在前台可见,可以与用户交互了,该方法常用于重新加载数据(刷新数据),当Activity重新回到前台时,会调用该方法;该方法可能会执行多次。
4.onPause();表示Activity正在停止。
该方法表示Activity失去焦点,但是对用户仍然可见;该方法可能会执行多次;可以做一些存储数据、停止动画等工作,但是注意不能太耗时,因为这会影响到新Activity的显示,onPause()必须先执行,新Activity的onResume()才会执行。
5.onStop();表示Activity即将停止。
该方法表示Activity不可见;该方法可能会执行多次;可以做一些稍微重量级的回收工作,同样不能太耗时。
6.onDestroy();表示Activity即将销毁。
Activity正常销毁时会调用,一般在这个方法中释放资源以及回收。
7.onRestart() ;表示Activity正在重新启动。
Activity从后台重新显示到前台,由不可见变为可见状态。
如果当前Activity的Theme为Translucent(半透明) 或者启动的B-Activity是Dialog ,那么中断就只调用A-Activity的onPause() ,恢复的时候只调用A-onResume()。onStop()和onStart()是成对出现的,onPause()和onResume()是成对出现的。
PS:
1.onSaveInstanceState( Bundle outState)
当某个Activity变得“容易”被系统销毁时,该Activity的onSaveInstanceState()就会被执行,除非该activity是被用户主动销毁的,例如当用户按BACK键的时候。
注意上面的双引号,何为“容易”?言下之意就是该activity还没有被销毁,而仅仅是一种可能性。
outState 参数作用 :
-- 数据保存 : Activity 声明周期结束的时候, 需要保存 Activity 状态的时候, 会将要保存的数据使用键值对的形式 保存在 Bundle 对象中;
-- 恢复数据 : 在 Activity 的 onCreate()方法 创建 Activity 的时候会传入一个 Bundle 对象, 这个 Bundle 对象就是这个 outState 参数;(1).当用户按下HOME键时。
调用时机 : Activity 容易被销毁的时候调用, 注意是容易被销毁, 也可能没有销毁就调用了;
-- 按下Home键 : Activity 进入了后台, 此时会调用该方法;
-- 按下电源键 : 屏幕关闭, Activity 进入后台;
-- 启动其它 Activity : Activity 被压入了任务栈的栈底;
-- 横竖屏切换 : 会销毁当前 Activity 并重新创建;
总而言之,onSaveInstanceState()的调用遵循一个重要原则,即当系统“未经你许可”时销毁了你的Activity,则onSaveInstanceState()会被系统调用,这是系统的责任,因为它必须要提供一个机会让你保存你的数据。
onSaveInstanceState()方法调用注意事项 :
-- 用户主动销毁不会调用 : 当用户点击回退键 或者 调用了 finish() 方法, 不会调用该方法;
-- 调用时机不固定 : 该方法一定是在 onStop() 方法之前调用, 但是不确定是在 onPause() 方法之前 还是 之后调用;
-- 布局中组件状态存储 : 每个组件都 实现了 onSaveInstance() 方法, 在调用函数的时候, 会自动保存组件的状态, 注意, 只有有 id 的组件才会保存;
-- 关于默认的 super.onSaveInstanceState(outState) : 该默认的方法是实现 组件状态保存的;
2.onRestoreInstanceState( Bundle savedInstanceState)
需要注意的是,onSaveInstanceState()方法和onRestoreInstanceState()方法“不一定”是成对的被调用的
方法回调时机 : 在 Activity 被系统销毁之后 恢复 Activity 时被调用, 只有销毁了之后重建的时候才调用, 如果内存充足, 系统没有销毁这个 Activity, 就不需要调用;
-- Bundle 对象传递 : 该方法保存的 Bundle 对象在 Activity 恢复的时候也会通过参数传递到 onCreate() 方法中;
-- 位于生命周期位置吧 : 该方法在 onResume() 方法之前保存信息;
三、启动模式。
首先我们需要知道的是,一个应用中所有的Activity都是在一个栈中维护的,这个栈叫做任务栈(Task Stack)。
(1).一个应用程序一般都是由多个Activity组成的;
(2).一个应用程序一旦启动,系统就会给它分配一个任务栈,当该应用中所有的Activity都退出后,任务栈就清空了;
(3).在Android系统中存在多个任务栈,一个应用程序一个任务栈;
启动一个Activity有两种方式:
首先SecondActivity需要在 AndroidManifest.xml 中注册,
(1).Activity.startActivity()方法,
...
<activity
android:name=".SecondActivity"
android:label="@string/app_name"/>
...
在代码中启动新的Activity方法,
Intent intent =new Intent(MainActivity.this,SecondActivity.class);
startActivity(intent);
该启动方式,无返回结果,也就是说不需要把数据从新启动的Activity返回给上个Activity。其实startActivity()方法最终还是调用了下面的startActivityForResult()方法。
(2).startActivityForResult (Intent intent, int requestCode)方法,
requestCode的值是自定义的,用于识别跳转的目标Activity。跳转的目标Activity所要做的就是返回数据/结果,setResult(int resultCode)只返回结果不带数据,或者setResult(int resultCode, Intent data)两者都返回!而接收返回的数据/结果的处理函数是onActivityResult(int requestCode, int resultCode, Intent data),这里的requestCode就是startActivityForResult的requestCode,resultCode就是setResult里面的resultCode,返回的数据在data里面。
Activity的启动模式有4中,分别是:
1.standard,
标准模式,也是默认的启动模式,每次都会启动一个新的Activity实例加入到任务栈中;
2.singleTop,
栈顶模式,如果要开启的Activity在任务栈的顶部已经存在,就不会创建新的实例,那么将会调用Activity的newInstance()方法,否则将创建一个新的Activity实例加入到任务栈中;
3.singleTask,
如果要开启的Activity在任务栈中已经存在,则复用该Activity,将调用Activity的newInstance()方法,并且会清空任务栈中该Activity的之上的所有Activity;否则将创建一个新的Activity实例加入到任务栈中;
4.singleInstance
单例模式,该Activity会独享一个单独的任务栈,该任务栈中只能有这个Activity,不能有其他实例;
这些启动模式可以在功能清单文件AndroidManifest.xml中进行设置中的launchMode属性。
四、数据传递。
两个Activity之间想要传递数据、信息,要怎么操作呢?那就得使用Intent(运输大队长)。
例如,从MainActivity需要传递数据至新启动的SecondActivity,
Intent intent =new Intent(MainActivity.this,SecondActivity.class);
intent.putExtra("info", 12);
startActivity(intent);
Intent还可以启动一个Activity,启动一个Service,发起一个广播Broadcasts,
startActvity( ),startService( ),bindService( ),sendBroadcasts( )
Intent的中文意思是“意图,意向”,在Android中提供了Intent机制来协助应用间的交互与通讯,Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用。Intent不仅可用于应用程序之间,也可用于应用程序内部的Activity/Service之间的交互。因此,可以将Intent理解为不同组件之间通信的“媒介”专门提供组件互相调用的相关信息。
如果我们要打电话,可以这样写,
Intent intent =new Intent(Intent.ACTION_CALL);
startActivity(intent);
有关Intent的使用,还有很多,此处就不详说了!请读者自行查阅文档!
好了,有关Activity的认识、生命周期、任务栈等基础知识就介绍到这里!下篇文章就着手通过Activity的源码,对其进行分析!