Skip to content

Activity组件

Acitivty是一种可以包含用户界面的组件,表示一个屏幕。屏幕间切换需要启动一个新的Activity。

创建

  1. 定义一个Java类,继承ActivityAppCompatActivity(后者是前者的子类)

    重写onCreate()方法,必须包含以下语句:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    public class MainActivity extends AppCompatActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main17_2);
            //其它逻辑...
        }
        //其它方法...
    }
    
  2. 在AndroidManifest.xml文件中注册

    在该文件的application节点中添加<activity android:name=".MyActivity" .../>节点。

    其中,label表示当前页面顶部左上角的标签,如果不设置则默认使用父级application中的label。此外,还可以使用icon属性为当前页面设置指定的图标。

    包含intent-filter标签的activity为默认主屏幕,允许且仅允许一个activity标签包含intent-filter子标签。

    1
    2
    3
    4
    <application
          //其它内容...
            <activity android:name=".MyActivity" android:label="My App" android:icon="@mipmap/ic_launcher"/>
        </application>
    

生命周期

分为完整生存期、可见生存期和前台生存期。

Activity栈:当前运行的activity的集合。Android是使用Task(任务)来管理Activity的,一个Task就是一组存放在栈里Activity的集合,这个栈也称作回退栈。每启动一个新的Activity,就会覆盖在原Activity之上,点击返回键就会销毁最上面的Activity,下面的Activity就会重新显示出来。

Activity状态

  • 运行:栈顶元素,有焦点
  • 暂停:非栈顶,部分可见,无焦点
  • 停止:非栈顶,不可见
  • 销毁:从栈中pop

回调函数:系统自动调用,不可手动调用。

  • onCreate():创建Activity,在活动第一次被创建的时候调用。
  • onStart():运行,活动由不可见变为可见时调用。
  • onResume():暂停->运行,活动准备好和用户进行交互时调用,此时活动一定位于栈顶。
  • onPause():暂停,系统准备去启动或者恢复另一个活动的时候调用。
  • onStop():停止,活动完全不可见时调用。
  • onDestroy():销毁,活动被销毁前调用。
  • onRestart():停止->运行,活动由停止状态变为运行状态前调用。

跳转

  • 启动Activity
    Intent intent=new Intent(当前的Activity.this期望启动的Activity.class);
    startActivity(intent);
    
  • 返回上一个Activity
    当前Activity对象.finish();
    

数据传递

向新Activity中传递单个数据

  • 在启动新Activity前封装数据:
    intent.putExtra("参数名",任意基本数据类型的值或字符串等); 
    
  • 在新Activity提取数据:
    1
    2
    3
    Intent intent=getIntent();      //在新activity获得intent对象
    Xxx objName=intent.getXxxExtra("参数名",[如果没有提取到数据返回的默认值]);    //默认值不设置则返回null
    // 注意:String类型可以直接用 getStringExtra("参数名"),不需要传默认值
    

    其中,Xxx是被封装的数据的数据类型。

向新Activity中传递打包数据

  • 创建Bundle对象并打包数据
    1
    2
    3
    4
    Bundle bundle = new Bundle();
    bundle.putXxx("参数名",Xxx类型的值);
    bundle.putXxxArray("参数名",Xxx类型的数组);
    //...other data...
    
  • 封装数据
    intent.putExtras(bundle);
    
  • 在新Activity中提取数据
    1
    2
    3
    Intent intent=getIntent();      //在新activity获得intent对象
    Bundle bundle=intent.getExtras();  //在新activity获得bundle对象
    Xxx objName=bundle.getXxx("参数名",[如果没有提取到数据返回的默认值]);    //从bundle中提取对应数据
    

从新Activity回传数据到旧Activity

  • 以子Activity的方式启动新Activity

    以便监听数据回传。

    startActivityForResult(intent,请求码);
    

    请求码是一个整型,用于在存在多个可能打开的子界面中区分具体的子界面。

  • 在子Activity Finish前回传数据

    Java

    1
    2
    3
    Intent intent = new Intent();      //通常创建一个新的空intent对象用于回传
    intent.putExtra("参数名",任意基本数据类型的值);    //封装回传的数据
    setResult(结果码, intent);    //回传
    

    结果码用于区分子界面返回状态(通常使用 RESULT_OKRESULT_CANCELED),以在主Acitivity判断下一步的操作。

  • 在主Activity重写onActivityResult()方法

    三个主要参数:请求码、结果码、intent对象。在获取数据前,通常需要先判断请求码和结果码是否符合预期。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        // 先判断请求码和结果码
        if (requestCode == 你的请求码 && resultCode == RESULT_OK) {
            //通过data获取回传的数据
            String result = data.getStringExtra("参数名");
        }
    }