Android Activity间通信

Intent传递消息

Intent是各个组件之间信息沟通的桥梁,主要完成3部分工作:

  1. Intent表明本次通信请求从哪来到哪去,要怎么走。
  2. 发起方携带本次通信需要的数据内容,接收方对收到的Intent数据进行解包。
  3. 如果发起方要求判断接收方的处理结果,Intent负责让接收方传回响应的数据内容

表达Intent有两种方式,一种是显式Intent,一种是隐式Intent。

显式Intent

声明一个Intent对象时需要指定两个参数,第一个参数为源页面,第二个参数为目标页面

1.在构造函数中指定:

Intent intent = new Intent(this,TargetActivity.class);

 2.调用setClass方法指定:

Intent intent = new Intent(); 
intent.setClass(this, TargetActivity.class);

3.调用setComponent方法指定:

Intent intent = new Intent(); 
ComponentName component = new ComponentName(this, TargetActivity.class);
intent.setComponent(component);

 隐式Intent

 没有明确指定要跳转的类名,只给出一个动作让系统匹配有相同定义的目标

Intent intent = new Intent();
intent.setAction("a");
intent.addCategory("b");
startActivity(intent);

系统根据Action、Category等属性寻找目标

在AndroidManifest.xml里的intent-filter过滤器配置

<activity>
	<intent-filter>
		<action android:name="a"/>
		<category android:name="b"/>
		<category android:name="android.intent.category.DEFAULT"/>	<!--此句一般都要加 -->
		<data android:scheme="..." android:host="..." android:path="/..." android:type="..."/>
	</intent-filter>
</activity>

 Android入门:隐式Intent_xiazdong的博客-CSDN博客

Bundle快递包裹

Intent重载了很多putExtra方法传递各类型的参数,为了方便管理,Android引入Bundle概念,大小包裹由Bundle统一存取。

Bundle内部用于存放数据的结构是Map映射,存取只需调用putExtras方法和getExtras方法。

//存包裹
Intent intent = new Intent(MainActivity.this, FirstActivity.class);
Bundle bundle = new Bundle(); 

bundle.putString("name", "张三"); 
bundle.putInt("age", 30);

intent.putExtras(bundle);

startActivity(intent);

//----------------------------------------
//取包裹
Intent intent = getIntent();
Bundle bundle = intent.getExtras();
String name = bundle.getString("name", "");
int age = bundle.getInt("age", 0);

实战开发:Activity请求与响应

 

 页面1:发送消息给页面2

 页面2:收到的页面1请求信息

页面1:页面2的响应信息

页面1 Activity:

public void onClick(View v) {
        if (v.getId() == R.id.btn_request) {
            //创建一个新意图
            Intent intent = new Intent();
            //设置意图要跳转的活动类
            intent.setClass(this, responseActivity.class);

            //获取当前系统时间
            SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss");
            Date curDate = new Date(System.currentTimeMillis());
            //存入request_time字符串
            intent.putExtra("request_time", formatter.format(curDate));
            //存入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);
        }
    }

 页面2 Activity

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_response);
        findViewById(R.id.btn_response).setOnClickListener(this);

        et_response = findViewById(R.id.et_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_response){
            Intent intent = new Intent();
            Bundle bundle = new Bundle();

            SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss");
            Date curDate = new Date(System.currentTimeMillis());
            bundle.putString("response_time", formatter.format(curDate));
            bundle.putString("response_content", et_response.getText().toString());
            intent.putExtras(bundle);
            setResult(Activity.RESULT_OK, intent);
            //关闭当前页面
            finish();
        }
    }

以上仅为部分代码 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值