创建Activity
什么是Android中的Activity?
一个activity是提供一个界面,用于与用户交互(打电话,发邮件等)的应用组件。
如何创建一个Activity呢?
- 在layout中定义个布局文件
- 定义一个Activity(或者已存在的Activity子类)的子类,并实现相关的方法.
- 在AndroidManifest.xml中配置Activity
定义一个Activity子类时,要实现哪些方法呢
- onCreate(): 你必须实现这个方法,系统会在创建activity时,调用此方法,在这个方法中初始化的activity重要部分,尤其是调用setContentView()使用资源资源来设置activity的界面。
- onPause(): 当用户将要离开activity时,系统调用的第一方法就是此方法,通常保存在当前会话中的变化的信息。
- 更多的activity信息请看管理生命周期
如何在在AndroidManifest.xml中配置呢?
<manifest ... >
<application ... >
<activity android:name="ExampleActivity" >
<intent-filter>
....
</intent-filter>
</activity>
...
</application>
...
</manifest >
android:name属性唯一必须指定的,它指定到一个特定的actiivty的类名(包含包名)
如果actiivty能被其他应用访问就要定intent filter
如果是入口的activity,必须指定如下的intent filter
<activity android:name="...">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
启动Activity
启动Activiy的方法有哪些?
- startActivity()
- startActivityForResult()
启动Activity的方法有哪些异同?
- 相同点:均需要Intent对象作为参数,均可通过Intent传递少量数据。
- 不同点:如果想从启动的activity获取数据,使用startActivityForResult().
启动Activity的Intent如何定义?
- 显式启动,只能启动本应用的Activity
Intent intent = new Intent(this, SignInActivity.class); startActivity(intent);
> * 隐式启动,只要知道Activity的\<action\>就可以启动Ativity
> ```
Intent intent = new Intent(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_EMAIL, recipientArray);
startActivity(intent);
关闭Activity
怎么关闭一个Activity呢?
- 关闭自身可以调用finish()
- 关闭由startActivityForResult()启动的Activity可以使用finishActivity()
Notice:
尽量不要显式的结束Activity,因为这样会破坏Activity的生命周期,降低用户体验。
Activity的生命周期
什么是Activity的生命周期?
Activity的创建,运行,销毁等所经历的过程
Activity的生命周期怎样的形式表现的?
系统调用Activity的回调函数来表现的,共有六个主要的回调函数和其他的辅助函数
onCreate() onStart() onResume() onPause() onStop() onDestory()
Activity的六大回调函数都有什么作用呢?
public class ExampleActivity extends Activity {
@Override
/**********第一次创建Activity调用此方法***************/
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/*
* 1. 创建视图(基本使用setContentView()方法来加载视图)
* 2. Bundle对象中保存了Activity的以前状态,进行一些必要的复原。
* 3. 相关数据获取,比如数据库数据的获取。
*/
}
@Override
/***************在Activity可视之前调用***************/
protected void onStart() {
super.onStart();
/*
*1. Followed by onResume() Activtiy将会可见(正常)
*2. Followed by onStop() Activity将会隐藏(不正常)
*/
}
@Override
/************在Activity可以交互之前执行**************/
protected void onResume() {
super.onResume();
/*
*在此刻activity已位于回退栈的top
*此方法执行完之后,Activity就会处于运行状态。
*/
}
@Override
/*********当前Activity失去了焦点,但仍可见***********/
protected void onPause() {
super.onPause();
/*
*1. 保存数据,停止动画,或者其他消耗CPU的操作等等。
*2. 这个方法不要执行耗时操作。
*/
}
@Override
/********当Activity不再可视时,会调用此方法*********/
protected void onStop() {
super.onStop();
/*
*1. 意味着被Activity被销毁,
*2. 或着其他的Activity运行覆盖了此方法
*/
}
@Override
/*************在Activity销毁时执行***************/
protected void onDestroy() {
super.onDestroy();
}
}
Notice: 在重写Activity的回调函数时,必须先调用父类的相应的回调函数,再添加自己的逻辑。
如果Activity A启动Activity B 那回调方法是如何被调用的呢?
- A的onPause()执行
- B的执行顺序 onCreate(), onStart(), onResume().
- 如果A不可见,A的onStop()方法执行。
>**Notice:** 当两个Activity共享的数据,最好在A的onPause()中执行,例如:A必须写 入数据到数据库以便B可以读取时,要在A的onPause()中执行。
Activity生命周期都有哪些状态呢?
- Resumed:Activity可视,并且获取焦点。
- Paused : 另一个Activity可视的,并获取了焦点,但paused的Activity仍然是可视。也就是说另一个Activity在paused的Activtiy之上,另一个Activity是通明的或者是没有覆盖整个屏幕。paused的Activity是存活的(activity对象仍然保存在内存,维持着所有状态,仍然附着在window上 )
- Stopped : stoped的Activity不可见的,但仍然存活(activity对象仍然保存在内存,维持着所有状态,仍然附着在window)
- activity生命周期图
保存Activity的状态
为什么要保存Activity的状态呢,正常情况下不是挺好吗?
- 在正常情况下paused和stopped的activity对象会保存在内存中,activity状态也会保留,当activity可见时,也能够正常恢复。但是当系统为了获取内存,销毁了activity对象,当activity要Resumed时,必须重新创建Activity对象,用户的改变的状态将不复存在,所以要保存activity的状态。可以使用onSaveInstanceState()来保存信息
那如何保存Activity的状态呢?
- 保存临时数据(通常是UI的状态时)可以使用用onSaveInstanceState()
- 保存持久的数据就需要在onPause()中进行了
onSaveInstanceState()如何保存临时数据的,又是如何恢复数据的呢?
Notice:
- 不能保证onSaveInstanceState()一定会被执行,例如当用户使用back button关闭 时,当系统调用了此函数,可能是在onStop()之前调用,或者onPause()之前。
- onSaveInstanceState()提供了默认的实现,即对于view只要提供了ID,就会保存其状 态,因此在覆写时,首先要调用父类的onSaveInstanceState().
Skill: 测试状态保存是否正确可以旋转屏幕,因为旋转屏幕默认情况会销毁Activity, 重新创建Activity。