Activity简介
Activity通常展现为一个可视化的用户界面,是Android程序与用户交互的窗口,一个Activity占据当前的窗口,响应所有窗口事件,具备有控件,菜单等界面元素。从内部逻辑来看,Activity需要为了保持各个界面状态,需要做很多持久化的事情,还需要妥善管理生命周期,和一些转跳逻辑。
注意:
1. 首先一个应用程序可以有一个或者多个Activity的活动页面。
2. 每一个应用程序都需要有一个activity入口,也就相当于程序的入口。唯一不同的他的入口地址需要在androidmianfest.xml中配置
3. 启动一个activity的时候要跳转到另一个activity中就需要Intent的组件。
Activity的生命周期
Activity的状态
- active/running:Activity处于前台并且在Activity栈的栈顶
- paused:Activity失去焦点但仍然可见,例如当一个非全屏的透明Activity在当前Activity的上方时,会进入paused状态,在内存极度匮乏的时候,处于paused状态的Activity可能被系统杀死
- stoped:当Activity被另一个Activity完全覆盖的时候,会处于stoped状态,当系统需要更多内存时可能会杀死处于该状态的Activity
- killed:当处于paused或者stoped状态的Activity被系统从内存中删除后,会处于killed状态
Method | Description | Killable? | Next |
---|---|---|---|
onCreate() | 当Activity第一次被创建的时候调用,可以在这里设置静态参数,加载View,将数据绑定到lists等。如果这个Activity曾经被冻结过,那么可以通过提供的Bundle参数来恢复之前的状态 | 否 | onStart() |
onRestart() | 当Activity从stopped状态重新启动的时候调用 | 否 | onStart() |
onStart() | 当Activity变得可见的时候被调用 | 否 | onResume() 或 onStop() |
onResume() | 当用户可以与Activity交互的时候被调用 | 否 | onPause() |
onPause() | 当系统准备resume其它Activity时被调用,可以在这里提交未保存的数据,停止动画以及其它任何需要CPU计算的事务。在这里不要做太耗时的操作,否则下个Activity会被阻塞 | HONEYCOMB之前的版本可以 | onResume()或onStop() |
onStop() | 当Activity变得不可见时被调用 | 可以 | onRestart()或onDestroy() |
onDestroy() | Activity被destroy之前最后被调用的方法 | 可以 | 无 |
Activity的创建
新建一个类,继承Activity,重写onCreate方法
public class MainActivity extends Activity {//继承Activity 活动(界面) @Override protected void onCreate(Bundle savedInstanceState) {//程序的入口 super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);//设置内容视图 } }
- 新建一个layout的xml文件
- 在AndroidManifest中注册Activity
Activity的切换
显式切换
通过Intent来实现启动一个明确的Activity
Intent intent = new Intent(ThisActivity.this, OtherActivity.class);
startActivity(intent);
隐式切换
首先需要在AndroidManifest中设置Activity的intent-filter信息,其中的action name原则上可以随意随意设置,最好使用包名.类名的结构,防止冲突。
<activity
android:name="com.example.SecondActvity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="1234567890" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
然后在Intent中设置action信息,从而启动对应的Activity
Intent intent = new Intent();
intent.setAction("1234567890");
startActivity(intent);
Activity的启动模式
任务栈
任务栈Task,是一种用来放置Activity实例的容器,他是以栈的形式进行盛放,也就是所谓的先进后出,主要有2个基本操作:压栈和出栈,其所存放的Activity是不支持重新排序的,只能根据压栈和出栈操作更改Activity的顺序。
Standard模式
标准模式。可以有多个相同的实例,也允许多个相同Activity叠加。应用场景:绝大多数Activity。
singleTop模式
栈顶复用模式,如果要开启的activity在任务栈的顶部已经存在,就不会创建新的实例,而是调用 onNewIntent()方法。避免栈顶的activity被重复的创建。应用场景:在通知栏点击收到的通知,然后需要启动一个Activity,这个Activity就可以用singleTop,否则每次点击都会新建一个Activity。
singleTask模式
栈内复用模式, activity只会在任务栈里面存在一个实例。如果要激活的activity,在任务栈里面已经存在,就不会创建新的activity,而是复用这个已经存在的activity,调用 onNewIntent()方法,并且清空这个activity任务栈上面所有的activity。应用场景:大多数App的主页。对于大部分应用,当我们在主界面点击回退按钮的时候都是退出应用,那么当我们第一次进入主界面之后,主界面位于栈底,以后不管我们打开了多少个Activity,只要我们再次回到主界面,都应该使用将主界面Activity上所有的Activity移除的方式来让主界面Activity处于栈顶,而不是往栈顶新加一个主界面Activity的实例,通过这种方式能够保证退出应用时所有的Activity都能报销毁。
singleInstance模式
单一实例模式,整个手机操作系统里面只有一个实例存在。不同的应用去打开这个activity 共享公用的同一个activity。他会运行在自己单独,独立的任务栈里面,并且任务栈里面只有他一个实例存在。应用场景:呼叫来电界面。这种模式的使用情况比较罕见,在Launcher中可能使用。或者你确定你需要使Activity只有一个实例。建议谨慎使用。
设置启动模式
设置AndroidManifest
可以设置standard,singleTop,singleTask,singleInstance
<activity
android:name="com.example.singletask.SecondAct"
android:launchMode="singleTask"
android:label="@string/app_name" >
</activity>
设置Intent的Flag
FLAG_ACTIVITY_NEW_TASK
使用一个新的Task来启动一个Activity,但启动的每个Activity都讲在一个新的Task中。该Flag通常使用在从Service中启动Activity的场景,由于Service中并不存在Activity栈,所以使用该Flag来创建一个新的Activity栈,并创建新的Activity实例。
FLAG_ACTIVITY_SINGLE_TOP
使用singletop模式启动一个Activity,与指定android:launchMode=“singleTop”效果相同。
FLAG_ACTIVITY_CLEAR_TOP
使用SingleTask模式来启动一个Activity,与指定android:launchMode=“singleTask”效果相同。
FLAG_ACTIVITY_NO_HISTORY
Activity使用这种模式启动Activity,当该Activity启动其他Activity后,该Activity就消失了,不会保留在Activity栈中。