Android学习第三天——活动Activity

一、启停活动界面
1.Activity的启动与结束
从当前页跳到新页面,跳转代码如下:
startActivity(new Intent(源页面.this,目标页面.class));
从当前页面回到上一个页面,相当于关闭当前页面,返回代码如下:
finish();//结束当前活动页面
例子:
activity_act_satrt.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <ImageView
        android:id="@+id/iv_back"
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:padding="5dp"
        android:src="@mipmap/ic_back"/>

    <Button
        android:id="@+id/btn_finish"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="完成" />
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="按返回键,或者点击左上角的箭头图标,或者点击上面的完成按钮,均可关闭当前界面、返回上个页面" />

</LinearLayout>

Java代码:

public class ActStartActivity extends AppCompatActivity implements View.OnClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_act_start);
        findViewById(R.id.btn_act_next).setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        startActivity(new Intent(this,ActFinishActivity.class));
    }
}

activity_act_finish.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center">
    <Button
        android:id="@+id/btn_act_next"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="跳到下一个界面"/>

</LinearLayout>

ActFinishActivity:

public class ActFinishActivity extends AppCompatActivity implements View.OnClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_act_finish);
        findViewById(R.id.iv_back).setOnClickListener(this);
        findViewById(R.id.btn_finish).setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        if (v.getId()==R.id.iv_back||v.getId()==R.id.btn_finish){
            //结束当前活动页面
            finish();
        }
    }
}

记得改注册表。
2.Activity的生命周期
Activity生命周期
onCreate:创建活动。把页面布局加载进内存,进入了初始状态。
onStart:开始活动。把活动页面显示在屏幕上,进入了就绪状态。
onResume:恢复活动。活动页面进入活跃状态,能够与用户正常交互,例如允许响应用户的点击动作、允许用户输入文字等等。
onPause:暂停活动。页面进入暂停状态,无法与用户正常交互。
onStop:停止活动。页面将不在屏幕上显示。
onDestroy:销毁活动。回收活动占用的系统资源,把页面从内存中清除。
onRestart:重启活动。重新加载内存中的页面数据。
onNewIntent:重用已有的活动实例。

打开新页面的方法调用顺序为“
onCreate->onStart->onResume
关闭旧页面的方法调用顺序为:
onPause->onStop->onDestroy

3.Activity的启动模式
某APP先后打开两个活动,此时活动栈的变动情况如图所示。
在这里插入图片描述

依次结束已打开的两个活动,此时活动栈的变动情况如下图。
在这里插入图片描述
在Java代码里面设置启动模式:
Intent.FLAG_ACTIVITY_NEW_TASK:开辟一个新的任务栈
Intent.FLAG_ACTIVITY_SINGLE_TOP:当栈顶为待跳转的活动实例之时,则重用栈顶的实例
Intent.FLAG_ACTIVITY_CLEAR_TOP:当栈中存在待跳转的活动实例时,则重新创建一个新实例,并清除原实例上方的所有实例
Intent.FLAG_ACTIVITY_NO_HISTORY:栈中不保存新启动的活动实例
Intent.FLAG_ACTIVITY_CLEAR_TASK:跳转到新页面时,栈中的原有实例都被清空

二、在活动之间传递消息
1.显示Intent和隐式Intent
Intent是各组件之间信息沟通的桥梁,它用于Android各组件之间的通信,主要完成下列工作:

  • 标明本次通信请求从哪里来、到哪里去、要怎么走。
  • 发起方携带本次通信需要的数据内容,接收方从收到的意图解析数据
  • 发起方若想判断接收方的处理结果,意图就要负责让接收方传回应答的数据内容。
    Intent的组成成分:
    在这里插入图片描述
    (1)显示Intent
    显示Intent,直接指定来源活动与目标活动,属于精确匹配,它的三种构建模式:
  • 在Intent的构造函数中构造
Intent intent = new Intent(this, ActNextActivity.class); // 创建一个目标确定的意图
  • 调用意图对象的setClass方法指定
Intent intent = new Intent(); // 创建一个新意图
intent.setClass(this, ActNextActivity.class); // 设置意图要跳转的目标活动
  • 调用意图对象的setComponent方法指定。
Intent intent = new Intent(); // 创建一个新意图
// 创建包含目标活动在内的组件名称对象
ComponentName component = new ComponentName(this, ActNextActivity.class);
intent.setComponent(component); // 设置意图携带的组件信息

(2)隐式Intent
隐式Intent,没有明确指定要跳转的目标活动,只给出一个动作字符串让系统自动匹配,
属于模糊匹配。动作名称既可以通过setAction方法指定,也可以通过构造函数Intent(Str
ing action)直接生成意图对象

常见系统动作:
在这里插入图片描述

2.向下一个Activity发送数据(A->B)
Intent使用Bundle对象存放待传递的数据信息
Bundle对象操作各类型数据的读写方法说明见下表:
在这里插入图片描述
3.向上一个Activity返回数据

  • 上一个页面打包好请求数据,调用startActivityForResult方法执行跳转动作
  • 下一个页面接收并解析请求数据,进行相应处理
  • 下一个页面在返回上一个页面时,打包应答数据并调用setResult方法返回数据包裹
  • 下一个页面在返回上一个页面时,打包应答数据并调用setResult方法并返回数据包裹
  • 上一个页面重写方法onActivityResult,解析获得下一个页面的返回数据
    例子:
    在这里插入图片描述
    在这里插入图片描述
public class ActRequestActivity extends AppCompatActivity implements View.OnClickListener {
    private String mRequest="哈哈哈";
    private ActivityResultLauncher<Intent> register;
    private TextView tv_response;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_act_request);
        TextView tv_request =findViewById(R.id.tv_request);
        tv_request.setText("待发消息为"+mRequest);

        tv_response = findViewById(R.id.tv_response);

        findViewById(R.id.btn_request).setOnClickListener(this);

        register = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() {
            @Override
            public void onActivityResult(ActivityResult result) {
                if (result!=null){
                    Intent intent=result.getData();
                    if (intent!=null&&result.getResultCode()== Activity.RESULT_OK){
                        Bundle bundle= intent.getExtras();
                        String response_time=bundle.getString("response_time");
                        String response_content=bundle.getString("response_content");
                        String desc=String.format("接收请求消息:\n应答时间为%s\n应答内容为%s",response_time,response_content);
                        //把返回消息的详情显示在文本视图上
                        tv_response.setText(desc);
                    }
                }

            }
        });
    }

    @Override
    public void onClick(View v) {
        Intent intent=new Intent(this,ActResponseActivity.class);
        //创建一个新包裹
        Bundle bundle=new Bundle();
        bundle.putString("request_time", DataUtil.getNowTime());
        bundle.putString("request_content",mRequest);
        intent.putExtras(bundle);
        startActivity(intent);
        register.launch(intent);
    }
}
public class ActResponseActivity extends AppCompatActivity implements View.OnClickListener {
    private static final String mReponse="嘻嘻!";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_act_response);
        TextView tv_request=findViewById(R.id.tv_request);
        //从上一个页面传来的意图中获取快递包裹
        Bundle bundle= getIntent().getExtras();
        String request_time=bundle.getString("request_time");
        String request_content=bundle.getString("request_content");
        String desc=String.format("收到请求消息:\n请求时间为%s\n请求内容为%s",request_time,request_content);
        //把请求消息的详情显示在文本视图上
        tv_request.setText(desc);

        findViewById(R.id.btn_response).setOnClickListener(this);
        TextView tv_response=findViewById(R.id.tv_response);
        tv_response.setText("待返回的消息为:"+mReponse);
    }

    @Override
    public void onClick(View v) {
        Intent intent=new Intent();
        //创建一个新包裹
        Bundle bundle=new Bundle();
        bundle.putString("response_time", DataUtil.getNowTime());
        bundle.putString("response_content",mReponse);
        intent.putExtras(bundle);
        //携带意图返回上一个页面。Result_OK表示处理成功
        setResult(Activity.RESULT_OK,intent);
        //结束当前界面
        finish();
    }
}

三、为活动补充附加信息
1.利用资源文件配置字符串

public class ReadStringActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_read_string);
        TextView tv_resouce=findViewById(R.id.tv_resource);

        String value=getString(R.string.weather_str);
        tv_resouce.setText(value);
    }
}

把内容写在Strings.xml里面不需要重新编译

2.利用元数据传递配置信息
适用于需要第三方SDK,例如微信登录。
步骤:
调用getPackageManager方法获得当前应用的包管理器;
调用包管理器的getActivityInfo方法获得当前活动的信息对象;
活动信息对象的metaData是Bundle包裹类型,调用包裹对象的getString即可获得指
定名称的参数值。

  • 15
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值