Activity

创建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。

参考文档:

参考文档1

updatedupdated2020-06-132020-06-13