Activity
Activity是一个应用组件,主要完成与用户交互的功能。一个应用通常由多个Activity 组成。 一般会指定应用中的某个 Activity 为“主”Activity,即首次启动应用时呈现给用户的那个 Activity。 设置主Activity的方式如下:(在manifest中配置)
<activity android:name=".ExampleActivity" android:icon="@drawable/app_icon">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
而且每个 Activity 均可启动另一个 Activity,以便执行不同的操作。 每次新 Activity 启动时,前一 Activity 便会停止,但系统会在堆栈(“返回栈”)中保留该 Activity。 当新 Activity 启动时,系统会将其推送到返回栈上,并取得用户焦点。
返回栈与数据结构中的栈的概念一样,遵循基本的“后进先出”堆栈机制,即首先启动的Activity组件会先进栈,有新的Activity 被启动时就会处于前一个Activity 的上面,取代其栈顶位置,通常那个情况下,与用户交互的Activity 就是处于栈顶的Activity 。当用户完成当前 Activity 并按“返回”按钮时,系统会从堆栈中将其弹出(并销毁),然后恢复前一 Activity。当一个 Activity 因某个新 Activity 启动而停止时,系统会通过该 Activity 的生命周期回调方法通知其这一状态变化。Activity 因状态变化—系统是创建 Activity、停止 Activity、恢复 Activity 还是销毁 Activity— 而收到的回调方法可能有若干种,每一种回调都会为您提供执行与该状态变化相应的特定操作的机会。 例如,停止时,您的 Activity 应释放任何大型对象,例如网络或数据库连接。 当 Activity 恢复时,可以重新获取所需资源,并恢复执行中断的操作。 这些状态转变都是 Activity 生命周期的一部分。
创建Activity
创建一个类继承 Activity,或使用其现有子类。在子类中实现 Activity 在其生命周期的各种状态之间转变时(例如创建 Activity、停止 Activity、恢复 Activity 或销毁 Activity 时)系统调用的回调方法。 两个最重要的回调方法是:
onCreate():在此方法内初始化 Activity 的必需组件。 最重要的是,必须在此方法内调用 setContentView(),以定义 Activity 用户界面的布局。
onPause():系统将此方法作为用户离开 Activity 的第一个信号(但并不总是意味着 Activity 会被销毁)进行调用。 通常应该在此方法内确认在当前用户会话结束后仍然有效的任何更改(因为用户可能不会返回)。
启动Activity
可以通过调用 startActivity(),并将其传递给描述您想启动的 Activity 的 Intent 来启动另一个 Activity。Intent 对象会指定您想启动的具体 Activity 或描述您想执行的操作类型(系统会为您选择合适的 Activity,甚至是来自其他应用的 Activity)。可以通过使用类名创建一个显式定义您想启动的 Activity 的 Intent 对象来实现此目的。 例如,可以通过以下代码让一个 Activity 启动另一个名为 SignInActivity 的 Activity:
Intent intent = new Intent(this, SignInActivity.class);
startActivity(intent);
或者启动系统级别的Activity:
Intent intent = new Intent(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_EMAIL, recipientArray);
startActivity(intent);
Intent可以携带数据在不同的Activity之间进行传递:
- intent.putExtra("key","value");
Activity跳转
- 显式跳转
-
- 同一应用中,指定目标Activity的字节码和当前的上下文
- 不同应用中,指定目标Activity所在的应用的包名和目标Activity的包名加类名
- 隐式跳转
-
- intent-filter节点及其子节点(action category data)都可以同时定义多个,隐式启动时只需与任意一个匹配即可
- Intent中必须存在action(只能有一个)并且必须和过滤规则中的其中一个action匹配,否则就匹配失败
- Intent中可以没有category,但是如果有就必须和过滤规则中的其中一个category匹配;
-
- 匹配规则中设置 category android:name="android.intent.category.DEFAULT"
-
- Intent中没有定义category,也能匹配的原因是系统会默认在启动的时候会默认添加上述的配置
- 启动的时候需要调用:
-
- intent.addCategory("xxxxx");
- 如果过滤规则中有data属性,那么Intent中必须存在至少一个与之相匹配的data,否则就匹配失败
-
- data的组成:mimeTYPE和URI
- intent.setData("xxxxx");
- 隐式跳转最好对匹配结果进行判断,避免出现错误:
-
- 使用PackageManager的resolveActivity或者Intent的resolveActivity,找到返回最合适一个,否则返回null
- PackageManager还提供了queryIntentActivity方法,该方法返回匹配集合
//只有mimeType的匹配
<data android:mimeType="image/*"/>
intente.setDataAndType(Uri.parse("file://abc"),"image/png");
//mimeType、scheme的匹配
<data android:scheme="http"/>
<data android:mimeType="video/mpeg"/>
intente.setDataAndType(Uri.parse("http://abc"),"video/mpeg");
Activity的生命周期
void onCreate() 创建时调用 ——Activity已经被创建完毕
void onStart() Activity已经显示在屏幕,但没有得到焦点
void onResume() Activity得到焦点,可以与用户交互
void onPause() Activity失去焦点,无法再与用户交互,但依然可见
void onStop() Activity不可见,进入后台
void onDestroy() Activity被销毁
void onRestart() Activity从不可见变成可见时会执行此方法
完整生命周期(entire lifetime)onCreate-->onStart-->onResume-->onPause-->onStop-->onDestory
可视生命周期(visible lifetime)onStart-->onResume-->onPause-->onStop
前台生命周期(foreground lifetime)onResume-->onPause
异常情况下的生命周期:
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_thread);
if (savedInstanceState != null) {
String tempData = savedInstanceState.getString("key");
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
String tempData = "Something you just save";
outState.putString("key", "tempData");
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
String tempData = savedInstanceState.getString("key");
}
开启Activity获取返回值
Activity的启动模式
- 标准模式:默认就是标准模式,每次启动都会创建一个新的实例添加到任务栈顶
- singleTop:栈顶复用。如果Activity的实例不在栈顶,那么就会创建,如果已经在栈顶了,就不会再创建了
- singleTask:栈内复用。如果Activity没有被创建任何实例,那么启动时会创建,如果已经创建了一个实例,那么启动时是返回至该Activity而不会再创建该Activity。保证栈中永远只有一个该Activity的实例
- singleInstance:在一个单独的任务栈中创建该Activity的实例,然后再也不会创建第二个实例了,以后的每次启动该Activity,都是把该Activity所在的栈显示至前台。保证整个系统的内存都只有一个该Activity的实例。呼叫来电界面
Activity的销毁
通过调用 Activity 的 finish()
方法来结束该 Activity。您还可以通过调用 finishActivity()
结束您之前启动的另一个 Activity。