Android四大组件之Activity
1、什么是Activity
Activity是Android四大组件之一,用于显示View。Activity是一个应用程序组件,提供一个用户交互的接口,其本身是没有界面的,Activity类创建一个窗口,在上面可以绘制用户接口。窗口通常充满屏幕,也可以小于屏幕而悬浮于其他窗口之上。
开发者可以通过Activity类提供的setContentView(View)接口将View放到Activity创建的窗口上。一个程序一般由多个Activity组成,他们通常是松耦合关系。一个Activity可以启动另外一个Activity。每次一个Activity启动,前一个Activity就停止,但是Android系统会保留Activity在一个栈上,当用户完成当前Activity然后点击back按钮时,它就会被弹出栈并被销毁。所有的Activity类必须在AndroidManifest.xml文件中注册,不注册会报错。例如:
<activity android:name=".BaseActivity" />
<activity android:name=".activity.AboutCSDNActivity" />
<activity android:name=".activity.BlogOsphereActivity" />
<activity android:name=".activity.FeedBackActivity" />
<activity android:name=".activity.WebActivity" />
<activity android:name=".activity.AllBloggerActivity" />
<activity android:name=".activity.BlogDetailActivity" />
2、activity的生命周期方法
下图是Android api中所提供的Activity生命周期图
由图可以看出,Activity有如下生命周期方法,分别是:
public class Activity extends ApplicationContext {
protected void onCreate(Bundle savedInstanceState);
protected void onStart();
protected void onResume();
protected void onPause();
protected void onStop();
protected void onDestroy();
}
一个Activity启动,执行生命周期方法顺序是:onCreate -> onStart -> onResume;当一个Activity被Kill掉时候,执行生命周期方法顺序是:onPause -> onStop -> onDestroy。这是一个完整的生命周期循环。当一个应用正在运行,由于其它应用中断,比如电话来了等,执行的生命周期方法是onPause -> onStop,挂断电话恢复到当前应用,执行的生命周期方法是onStart -> onResume;如果当前应用的Activity是Theme为Translucent(半透明)或者Dialog时,那么中断就是onPause ,恢复的时候onResume。
2.1、各种生命周期方法在系统中的作用
- onCreate方法:在这里创建界面,可以实现一些界面的初始化工作
- onStart方法:在onCreate方法之后被调用,或者Activity从stop状态转换为Active状态被调用,可以实现数据的请求
- onResume方法:在 Activity 从 Pause 状态转换到 Active 状态时被调用。
- onPause方法:在 Activity 从 Active 状态转换到 Pause 状态时被调用。在这里可以保存一些数据,在onResume方法中可以读取这里保存的数据。
- onStop方法:在 Activity 从 Active 状态转换到 Stop 状态时被调用。一般我们在这里保存 Activity 的状态信息。
- onDestroy方法:在 Activity 被结束时调用,它是被结束时调用的最后一个方法,在这里一般做些释放资源,清理内存等工作。
onPause,onstop, onDestroy,三种状态下 activity都有可能被系统kill掉
2.2、Activity的四种状态
Activity有四种状态分别是:
- Running状态
- Stopped状态
- Paused状态
- Destroyed状态
生命周期方法在各个状态被调用时机如下图:
由上图可以看出:
- 当Running状态的时候,调用onPause方法可以切换到Pauseed状态。
- 当在Paused状态的时候,调用onResume方法可以切换到Running状态,调用onStop方法可以切换到Stopped状态,如果应用被退出就切换到Destroyed状态。
- 当处在Stopped状态时候,调用onRestart方法、onStart方法、onResume方法会切换到Running状态,调用onDestroy方法或者应用被退出就会切换到Destroyed状态。
3、Activity之间的通信
在 Android 中,不同的 Activity 实例可能运行在一个进程中,也可能运行在不同的进程中。因此我们需要一种特别的机制帮助我们在 Activity 之间传递消息。Android 中通过 Intent 对象来表示一条消息,一个 Intent 对象不仅包含有这个消息的目的地,还可以包含消息的内容,这好比一封 Email,其中不仅应该包含收件地址,还可以包含具体的内容。对于一个 Intent 对象,消息“目的地”是必须的,而内容则是可选项。
Intent负责对操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用。因此,Intent在这里起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦。
在应用中,我们可以通过两种形式来使用Intent:
直接Intent:指定了component属性的Intent(setClass(Context, Class)来指定)。通过指定具体的组件类,通知应用启动对应的组件。
间接Intent:没有指定comonent属性的Intent。这些Intent需要包含足够的信息,这样系统才能根据这些信息,在在所有的可用组件中,确定满足此Intent的组件。
对于直接Intent,Android不需要去做解析,因为目标组件已经很明确。
Android需要解析的是那些间接Intent,通过解析,将 Intent映射给可以处理此Intent的Activity、IntentReceiver或Service。Intent解析机制主要是通过查找已注册在AndroidManifest.xml中的所有IntentFilter及其中定义的Intent,最终找到匹配的Intent。
通过setClass传递消息:
Intent intent =new Intent(CurrentActivity.this,OtherActivity.class);
Bundle bundle =new Bundle();
bundle.putBoolean("boolean_key", true);
bundle.putString("string_key", "string_value");
intent.putExtra("key", bundle);
startActivity(intent);
另一个Activity解析消息:
Intent intent =getIntent();
Bundle bundle =intent.getBundleExtra("key");
bundle.getBoolean("boolean_key");
bundle.getString("string_key");
除了使用intent之外还可以使用sharedpreference传递消息:
// 写入 SharedPreferences
SharedPreferences preferences = getSharedPreferences("name", MODE_PRIVATE);
Editor editor = preferences.edit();
editor.putBoolean("boolean_key", true);
editor.putString("string_key", "string_value");
editor.commit();
// 读取 SharedPreferences
SharedPreferences preferences = getSharedPreferences("name", MODE_P