Android基础之Intent | Activity间的数据传递 | 序列化 | 含实例 | 带源码地址

Intent

定义方式

  • 显示Intent
Intent intent = new Intent(this,OtherActivity.class);
startActivity(intent);
  • 隐式Intent

不明确指出要启动哪一个活动,而是指定了一系列更为抽象的action和category,有系统去分析这个intent,并帮我们找合适的活动去启动

通过配置<activity>的<intent-filter>内容,指定action和category

<activity android:name=".MainActivity">
    <intent-filter>
        <action android:name="com.example.toasttest.ACTION_START" />

        <category android:name="android.intent.category.DEFAULT" />
        //<category android:name="com.example.toasttest.MY_GATEGORY" />
    </intent-filter>
</activity>

action:表明当前活动可以响应com.example.toasttest.ACTION_START这个action

category:包含了一些附加信息,更精确地指出了当前活动能够响应的intent可能带有category

Intent intent = new Intent("com.example.toasttest.ACTION_START");
//intent.addCategory("com.example.toasttest.MY_GATEGORY");
startActivity(intent);

若该intent的category在上方manifest中未被定义,则程序会崩溃

常用属性说明

  • Action

Action

说明

ACTION_MAIN:

Android Application的入口,每个Android应用必须且只能包含一个此类型的Action声明

ACTION_VIEW:

系统根据不同的Data类型,通过已注册的对应Application显示数据

ACTION_EDIT:

系统根据不同的Data类型,通过已注册的对应Application编辑示数据

ACTION_DIAL:

打开系统默认的拨号程序,如果Data中设置了电话号码,则自动在拨号程序中输入此号码

ACTION_CALL:

直接呼叫Data中所带的号码

ACTION_SEND:

由用户指定发送方式进行数据发送操作

  • Category

Category

说明

CATEGORY_DEFAULT:

Android系统中默认的执行方式,按照普通Activity的执行方式执行

CATEGORY_HOME:

设置该组件为Home Activity

CATEGORY_PREFERENCE:

设置该组件为Preference

CATEGORY_LAUNCHER:

设置该组件为在当前应用程序启动器中优先级最高的Activity,通常为入口ACTION_MAIN配合使用

CATEGORY_BROWSABLE:

设置该组件可以使用浏览器启动

CATEGORY_GADGET:

设置该组件可以内嵌到另外的Activity中

  • Extras

Extras

说明

EXTRA_BCC:

存放邮件密送人地址的字符串数组

EXTRA_CC:

存放邮件抄送人地址的字符串数组

EXTRA_EMAIL:

存放邮件地址的字符串数组

EXTRA_SUBJECT:

存放邮件主题字符串

EXTRA_TEXT:

存放邮件内容

  • Data

Data

说明

tel:

号码数据格式,后跟电话号码

mailto:

邮件数据格式,后跟邮件收件人地址

smsto:

短息数据格式,后跟短信接收号码

content:

内容数据格式,后跟需要读取的内容

file:

文件数据格式,后跟文件路径

实例

  • 启动一个网页
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);
<activity android:name="com.example.intenttest.SecondActivity">
  	<intent-filter tools:ignore="AppLinkUrlError">
  		  <action android:name="android.intent.action.VIEW" />

    		<category android:name="android.intent.category.DEFAULT" />
    		<data android:scheme="http"/>
  	</intent-filter>
</activity>

源码地址

DoSomeAndroidTest/MyIntentTest at main · qricis/DoSomeAndroidTest · GitHub

  • 实现接口回调

MainActivity

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    switch (requestCode) {
        case 1:
            if (resultCode == RESULT_OK) {
                String returnedDate = data.getStringExtra("data_return");
                Log.d("MainActicity", returnedDate);
                Toast.makeText(this,returnedDate,Toast.LENGTH_SHORT).show();
            }
            break;
        default:
            break;
    }
}

public void toGetData(View view) {

    Intent intent = new Intent(this,SecondActivity.class);
    startActivityForResult(intent,1);

}

SecondActivity

public void toReturnData(View view) {

    Intent intent = new Intent();
    intent.putExtra("data_return","this is data that return to you");
    setResult(RESULT_OK,intent);
    finish();

}

引申

当SecondActivity并没有点击按钮,而是直接返回,我们可以通过重写onBackPressed()方法来传递数据

/**
* 按返回键回调数据
*/
@Override
public void onBackPressed() {
    Intent intent = new Intent();
    intent.putExtra("data_return","This is data that you want");
    setResult(RESULT_OK,intent);
    finish();
}

源码地址

https://github.com/qricis/DoSomeAndroidTest/tree/main/MyIntentCallbackTest

Activity间数据传递

  • 利用Intent对象携带简单数据/使用Intent定义的bundle对象来传递

利用Intent的Extra部分来存储我们想要传递的数据,可以传送String , int, long, char等一些基础类型,对复杂的对象就无能为力了。

也可以用到bundle来传输,它保存的数据,是以key-value(键值对)的形式存在的。

当Bundle传递的是对象或对象数组时,必须实现Serializable或Parcelable接口

public void sendInfo(View view){
    Intent intent = new Intent(this,Main2Activity.class);
    Bundle data = new Bundle();
    String info = editText.getText().toString();

    data.putString("myinfo",info);
    intent.putExtra("data",data);
    startActivity(intent);
}


Intent intent = getIntent();
Bundle data = intent.getBundleExtra("data");
String info = data.getString("myinfo");
textView.setText(info);
  • 使用序列化来传递对象

在使用内存的时候,Parcelable类比Serializable性能高,所以推荐使用Parcelable类

Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC

Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable不能很好的保证数据的持续性在外界有变化的情况下

public void  sendObj1(View view){
    Test test = new Test();
    test.id = 1;
    test.name = "测试1";
    test.number = 123;
    test.type = "类型1";

    Intent intent = new Intent(this,Main2Activity.class);
    intent.putExtra("Test",test);
    startActivity(intent);
}


Test test = (Test)intent.getSerializableExtra("Test");
textView.setText(info+"/"+test.toString());
  • 使用Activity自身处理返回结果
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        String item = items[position];
        Intent intent = new Intent();
        intent.putExtra("item",item);
        // 设置返回结果
        setResult(RESULT_OK,intent);
        // 结束当前Activty
        finish();
    }
});

源码地址

https://github.com/qricis/DoSomeAndroidTest/tree/main/Transfer

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值