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

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

    1
    2
    3
    4
    <application
          //其它内容...
            <activity android:name=".MyActivity" android:"label"/>
        </application>
    

生命周期

分为完整生命周期、可见生命周期和焦点生存周期。

Activity栈:当前运行的activity的集合

Activity状态

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

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

  • onCreate():创建Activity
  • onStart():运行
  • onPause():暂停
  • onStop():停止
  • onResume():暂停->运行
  • onRestart:停止->运行
  • onDestroy():销毁

跳转

  • 启动Activity

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

    当前Activity对象.finish();
    

数据传递

向新Activity中传递单个数据

  • 在启动新Activity前封装数据:

    intent.putExtra("参数名",任意基本数据类型的值);
    
  • 在新Activity提取数据:

    Intent intent=getIntent();      //在新activity获得intent对象
    Xxx objName=intent.getXxx("参数名",[如果没有提取到数据返回的默认值]);    //默认值不设置则返回null
    

    其中,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.getBundle();  //在新activity获得bundle对象
    Xxx objName=intent.getXxxExtra("参数名",[如果没有提取到数据返回的默认值]);    //默认值不设置则返回null
    

从新Activity回传数据到旧Activity

  • 以子Activity的方式启动新Activity

    以便监听数据回传。

    startActivityForResoult(intent,请求码);
    

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

  • 在子Activity Finish前回传数据

    1
    2
    3
    Intent intent=getIntent();      //在新activity获得intent对象
    intent.putExtra("参数名",任意基本数据类型的值);    //封装回传的数据
    setResult(结果码intent);    //回传
    

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

  • 在主Activity重写onActivityResult()方法

    三个主要参数:请求码、结果码、intent对象

    1
    2
    3
    4
    5
    @Override
        public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data, @NonNull ComponentCaller caller) {
            super.onActivityResult(requestCode, resultCode, data, caller);
            //通过data获取回传的数据
        }