【Android 基础知识】Android 四大组件之 Activity 基础概念和常见用法

Android 提供了四大组件,分别是页面 Activity、广播 Broadcast、服务 Service 和内容提供器 ContentProvider。其中内容提供器是跟数据存取有关的组件,完整的内容组件有内容提供器 ContentProvider、内容解析器 ContentResolver、内容观察器 ContentObserver 三部分组成。

一、Activity 的生命周期

Activity 与生命周期有关的方法说明:

  • onCreate:创建页面。把页面上的各个元素加载到内存中
  • onStart:开始页面。把页面显示在屏幕上。
  • onResume:恢复页面。让页面在屏幕上活动起来,例如开启动画、开始任务等。
  • onPause:暂停动画。让页面在屏幕上的动作停下来。
  • onStop:停止动画。把页面从屏幕上撤下来。
  • onDestroy:销毁页面。把页面从内存中消除掉。
  • onRestart:重启页面。重新加载内存中的页面数据。

页面跳转时的生命周期:

  • 跳转前的页面先调用 onPause 方法,然后跳转后的页面依次调用 onCreate/onRestart -> onStart -> onResume,最后跳转前的页面调用 onStop 方法(若返回上级页面,则下级页面还需调用 onDestory 方法)。

二、使用 Intent 传递消息

  • Intent 的中文名是意图,意思是我想让你干什么,就是传递消息。
设置方法说明与用途
setComponent组件,用于指定 Intent 的来源与目的
setAction动作,用于指定 Intent 的操作行为
setData即 Uri,用于指定动作要操纵的数据路径
addCategory类别,用于指定 Intent 的操作类别
setType数据类型,用于指定 Data 类型的定义
putExtra扩展信息,用于指定装载的参数信息
setFlags标志位,用于指定 Intent 的运行模式(启动标志)

表示 Intent 的来往路径有两种方式,一种是显式 Intent ,另一种是隐式 Intent 。

  1. 显式 Intent,直接指定来源类与目标类名,属于精确匹配。
    声明一个 Intent 对象时需要两个参数,第一个参数表示跳转的来源页面,第二个参数表示接下来要跳转到的页面类。
  • 在构造函数中指定:
Intent intent = new Intent(this, ActResponseActivity.class);
  • 调用 setClass 方法指定:
Intent intent = new Intent();
intent.setClass(this, ActResponseActivity.class);
  • 调用 setComponent 方法指定:
Intent intent = new Intent();
ComponentName component = new ComponentName(this, ActResponseActivity.class);
intent.setComponent(component);
  1. 隐式 Intent,没有明确指定要跳转的类名,只给出一个动作让系统匹配拥有相同字串定义的目标,属于模糊匹配。

三、向下一个 Activity 传递参数

  • Intent 的 setData 方法只指定到达目标的路径,并非本次通信所携带的参数信息,真正的参数信息存放在 Extras 中。
  • Android 引入了 Bundle 概念,Bundle 内部用于存放数据的实质结构是 Map 映射。可以把 Bundle 理解为快递的收件柜。

前一个页面向后一个页面发送请求数据的代码:

Intent intent = new Intent(MainActivity.this, FirstActivity.class);	//创建一个目标确定的意图
Bundle bundle = new Bundle();	//创建一个新包裹
bundle.putString("name","张三");	//往包裹存放一个字符串
bundle.putInt("age","30");
bundle.putDouble("height","170.0f");	
intent.putExtras(bundle);	//把快递包裹塞给意图
startActivity(intent);	//启动意图所向往的活动页面

后一个页面接收前一个页面请求数据的代码:

Intent intent = getIntent();	//获取前一个页面传来的意图
Bundle bundle = intent.getExtras();	//卸下意图里的快递包裹
String name = bundle.getString("name","");	//从包裹里取出字符串
int age = bundle.getInt("age",0);
double height = bundle.getDouble("height",0.0f);

四、向上一个 Activity 返回参数

步骤:

  1. 前一个页面打包好请求数据,调用方法 startActivityForResult(Intent intent, int requestCode),表示需要处理结果数据,第二个参数表示请求编号,用于标识每次请求的唯一性。
  2. 后一个页面接收请求数据,进行相应处理。
  3. 后一个页面在返回前一个页面时,打包应答数据并调用 setResult 方法返回信息。setResult 的第一个参数表示应答代码(成功/失败)
Intent intent = new Intent();
Bundle bundle = new Bundle();
bundle.putString("job", "码农");
intent.putExtras(bundle);
setResult(Activity.RESULE_OK, intent);	//携带意图返回前一个页面
finish();	//关闭当前页面
  1. 前一个页面重写方法 onActivityResult,该方法的输入参数包含请求编号和应答代码,请求编号用于判断对应哪次请求,应答代码用于判断后一个页面是否处理成功。然后对应答数据进行解包处理:
//接收后一个页面的返回数据。其中 requestCode 为请求代码
//resultCode 为结果代码,intent 为后一个页面返回意图
public void onActivityResult(int requestCode, int resultCode, Intent intent){
	Bundle resp = intent.getExtras();
	String job = resp.getString("job");
	Toast.makeText(this, "目前职业:"+job, Toast.LENGTH_LONG).show();
}

完整请求页面代码:

public class ActRequestActivity extends AppCompatActivity implements OnClickListener {
    private EditText et_request; // 声明一个编辑框对象
    private TextView tv_request; // 声明一个文本视图对象

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_act_request);
        findViewById(R.id.btn_act_request).setOnClickListener(this);
        // 从布局文件中获取名叫et_request的编辑框
        et_request = findViewById(R.id.et_request);
        // 从布局文件中获取名叫tv_request的文本视图
        tv_request = findViewById(R.id.tv_request);
    }

    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.btn_act_request) {
            // 创建一个新意图
            Intent intent = new Intent();
            // 设置意图要跳转的活动类
            intent.setClass(this, ActResponseActivity.class);
            // 往意图存入名叫request_time的字符串
            intent.putExtra("request_time", DateUtil.getNowTime());
            // 往意图存入名叫request_content的字符串
            intent.putExtra("request_content", et_request.getText().toString());
            // 期望接收下个页面的返回数据
            startActivityForResult(intent, 0);
        }
    }

    // 从后一个页面携带参数返回当前页面时触发
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { // 接收返回数据
        super.onActivityResult(requestCode, resultCode, data);
        if (data != null) {
            // 从意图中取出名叫response_time的字符串
            String response_time = data.getStringExtra("response_time");
            // 从意图中取出名叫response_content的字符串
            String response_content = data.getStringExtra("response_content");
            String desc = String.format("收到返回消息:\n应答时间为%s\n应答内容为%s",
                    response_time, response_content);
            // 把返回消息的详情显示在文本视图上
            tv_request.setText(desc);
        }
    }
}

完整应答页面代码:

public class ActResponseActivity extends AppCompatActivity implements OnClickListener {
    private EditText et_response; // 声明一个编辑框对象
    private TextView tv_response; // 声明一个文本视图对象

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_act_response);
        findViewById(R.id.btn_act_response).setOnClickListener(this);
        // 从布局文件中获取名叫et_response的编辑框
        et_response = findViewById(R.id.et_response);
        // 从布局文件中获取名叫tv_response的文本视图
        tv_response = findViewById(R.id.tv_response);
        // 从前一个页面传来的意图中获取快递包裹
        Bundle bundle = getIntent().getExtras();
        // 从包裹中取出名叫request_time的字符串
        String request_time = bundle.getString("request_time");
        // 从包裹中取出名叫request_content的字符串
        String request_content = bundle.getString("request_content");
        String desc = String.format("收到请求消息:\n请求时间为%s\n请求内容为%s",
                request_time, request_content);
        // 把请求消息的详情显示在文本视图上
        tv_response.setText(desc);
    }

    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.btn_act_response) {
            Intent intent = new Intent(); // 创建一个新意图
            Bundle bundle = new Bundle(); // 创建一个新包裹
            // 往包裹存入名叫response_time的字符串
            bundle.putString("response_time", DateUtil.getNowTime());
            // 往包裹存入名叫response_content的字符串
            bundle.putString("response_content", et_response.getText().toString());
            intent.putExtras(bundle); // 把快递包裹塞给意图
            setResult(Activity.RESULT_OK, intent); // 携带意图返回前一个页面
            finish(); // 关闭当前页面
        }
    }
}

activity_act_request:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="10dp" >

    <EditText
        android:id="@+id/et_request"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入请求参数"
        android:textColor="#000000"
        android:textSize="17sp" />
    
    <Button
        android:id="@+id/btn_act_request"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:gravity="center"
        android:text="传送请求参数"
        android:textColor="#000000"
        android:textSize="17sp" />
    
    <TextView
        android:id="@+id/tv_request"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:gravity="left"
        android:textColor="#000000"
        android:textSize="17sp" />

</LinearLayout>

activity_act_response:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="10dp" >

    <TextView
        android:id="@+id/tv_response"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="left"
        android:textColor="#000000"
        android:textSize="17sp" />
    
    <EditText
        android:id="@+id/et_response"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:hint="请输入返回参数"
        android:textColor="#000000"
        android:textSize="17sp" />
    
    <Button
        android:id="@+id/btn_act_response"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:gravity="center"
        android:text="返回应答参数"
        android:textColor="#000000"
        android:textSize="17sp" />
    
</LinearLayout>

在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

玳宸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值