四大组件之Activity

来源:互联网 发布:python 论坛 编辑:程序博客网 时间:2024/06/02 05:04

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之间进行传递:
Activity跳转时,可以把数据封装在intent对象中
  • intent.putExtra("key","value");
intent中可以封装的数据类型:八大基本数据类型和字符串及它们的数组,还有实现了序列化接口的对象,还有bundle对象,数据可以先封装至Bundle,再把Bundle封装至intent 。

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



异常情况下的生命周期:

onSaveInstanceState()方法保证在onStop()之前执行,但是和onPause()没有具体的时序关系
onRestoreInstanceState()从时序上说调用在onStart()之后,onSaveInstanceState() 保证活动被异常终止之前一定调用。使用此方法保存被关闭的Activity的临时数据,下次再启动该活动的时候可以再次获取临时数据。数据的取出可以在oncreate()方法中或者在onRestoreInstanceState()方法中。前者需要进行判断是否非空,后者不需判断,直接取出系统只在Activity异常终止的时候才会调用onSaveInstanceState与onRestoreInstanceState来储存和恢复数据,其他情况不会触发这个过程。但是按Home键或者启动新Activity仍然会单独触发onSaveInstanceState的调用。”
@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_thread);         if (savedInstanceState != null) {        String tempData = savedInstanceState.getString("key");    }}@Overrideprotected void onSaveInstanceState(Bundle outState) {    super.onSaveInstanceState(outState);    String tempData = "Something you just save";    outState.putString("key", "tempData");}@Overrideprotected void onRestoreInstanceState(Bundle savedInstanceState) {    super.onRestoreInstanceState(savedInstanceState);    String tempData = savedInstanceState.getString("key");}
存储数据的工作流程:委托思想
Activity被异常终止,Activity调用onSaveInstanceState()保存数据,Activity委托Window保存数据,Window委托它上面的顶级容器保存数据,顶层容器是一个ViewGroup,顶层容器再去一一通知它的子元素保存数据

开启Activity获取返回值

从A界面打开B界面, B界面关闭的时候,返回一个数据给A界面
1. 开启Activity并且获取返回值
        startActivityForResult(intent, 0);
2. 在新开启的界面里面实现设置数据的逻辑
        Intent data = new Intent();
        data.putExtra("phone", phone);
        //设置一个结果数据,数据会返回给调用者
        setResult(0, data);
        finish();//关闭掉当前的activity,才会返回数据
3. 在开启者activity里面实现方法
        //通过data获取返回的数据
        onActivityResult(int requestCode, int resultCode, Intent data) {
        }
4. 通过判断请求码和结果码确定返回值的作用

Activity的启动模式

Activity task stack:任务栈
栈:连续的内存空间,后进先出
  • 标准模式:默认就是标准模式,每次启动都会创建一个新的实例添加到任务栈顶
  • singleTop栈顶复用。如果Activity的实例不在栈顶,那么就会创建,如果已经在栈顶了,就不会再创建了
  • singleTask栈内复用。如果Activity没有被创建任何实例,那么启动时会创建,如果已经创建了一个实例,那么启动时是返回至该Activity而不会再创建该Activity。保证栈中永远只有一个该Activity的实例
  • singleInstance:在一个单独的任务栈中创建该Activity的实例,然后再也不会创建第二个实例了,以后的每次启动该Activity,都是把该Activity所在的栈显示至前台。保证整个系统的内存都只有一个该Activity的实例。呼叫来电界面

Activity的销毁

通过调用 Activity 的 finish() 方法来结束该 Activity。您还可以通过调用 finishActivity() 结束您之前启动的另一个 Activity。

原创粉丝点击