首先,新建2个活动,并为每个活动添加1个Button,并将activity1设置为主活动。
一、显式Intent
为Activity1的Button添加事件
package com.example.intenttest;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.Button;
public class activity1 extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_activity1);
Button bt1=(Button)findViewById(R.id.bt1);
bt1.setOnClickListener(
view->{
Intent intent=new Intent(this,activity2.class);
startActivity(intent);
}
);
}
}
①、new一个Intent对象,其参数分别为上下文和目标活动
②、将Intent作为参数,调用方法startActivity(),启动activity2
这样就完成了显式Intent,可以通过点击bt1来启动activity2
二、隐式Intent
在Intent中指定action与category,并为目标活动设置action和category标签。只有活动与Intent的action、category同时匹配,该活动才能响应该Intent。其中,Intent中只能有1个action,可以有多个category。即:设置好Intent,然后相匹配的活动可以响应其。
配置activity2:
<activity android:name=".activity2">
<intent-filter>
<action android:name="com.example.activity1.START"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.CATEGORY"/>
</intent-filter>
</activity>
修改bt1的响应逻辑:
bt1.setOnClickListener(
view->{
Intent intent=new Intent("com.example.activity1.START");
intent.addCategory("android.intent.category.CATEGORY");
startActivity(intent);
}
);
在调用startActivity时会自动为Intent添加1个默认的category,所以,在activity2中添加了对应标签。
三、通过隐式Intent启动不同应用程序的活动
在Intent中指定action为android内置动作,这里使用Intent.ACTION_VIEW,其常量值为android.intent.action.VIEW,chrome可以响应该action。
在Intent中指定默认category,因为其会自动添加默认category,所以不指定其他category就可以了
在Intent中指定data,用来和目标活动的data标签匹配,这里以百度网站为例
修改bt1的响应逻辑:
bt1.setOnClickListener(
view->{
Intent intent=new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);
}
);
如果想要启动的是拨号,action可以指定为Intent.ACTION_DIAL,setData中可以填"tel:电话号码",tel为协议名
通过为活动配置data标签,可以指定当前活动可以响应什么类型的数据,其主要有以下内容:
①、android:scheme——用于指定数据的协议,如http、geo、tel
②、android:host——用于指定数据的主机名
③、android:port——用于指定数据的端口
④、android:path——用于指定域名后的路径
⑤、android:mimeType——用于指定可以处理的数据类型
配置activity2:
<activity android:name=".activity2">
<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>
这样,其就可以响应http请求。
效果如下:
可以看到,chrome和我们的app都可以响应该Intent。
四、使用Intent在活动间传递信息
1、向下一个活动传递数据
通过Intent的putExtra()存入数据,然后在目标活动中将数据取出
修改bt1的响应逻辑:
bt1.setOnClickListener(
view->{
Intent intent=new Intent("the action");
intent.putExtra("the key","the value");
startActivity(intent);
}
);
配置activity2:
<intent-filter>
<action android:name="activity2"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
在activity2中取出数据,并在点击按钮时将其打印出来:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_activity2);
String data;
Intent intent=getIntent();
data=intent.getStringExtra("the key");
Button bt2=(Button)findViewById(R.id.bt2);
bt2.setOnClickListener(
view -> Toast.makeText(this,data,Toast.LENGTH_SHORT).show()
);
}
2、返回数据给上一个活动
如果期望目标活动销毁时能够返回数据,那么可以使用startActivityForReault()来启动目标活动。此外,当返回上一个活动时,会调用其onActivityReault()。
activity1:
package com.example.intenttest;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.widget.Button;
import android.widget.Toast;
public class activity1 extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_activity1);
Button bt1=(Button)findViewById(R.id.bt1);
bt1.setOnClickListener(
view->{
Intent intent=new Intent("the action");
startActivityForResult(intent,1);//启动activity2,1是请求码
}
);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode != 1) return; //如果请求码表示1,表示并不是目标活动返回
if (resultCode == RESULT_OK) { //如果处理结果为RESULT_OK,表示成功
Toast.makeText(this, data.getStringExtra("the key"), Toast.LENGTH_SHORT).show();//取出数据,并显示
}
}
}
activity2的Button响应逻辑:
bt2.setOnClickListener(
view -> {
Intent intent=new Intent();
intent.putExtra("the key","the data from activity2");
setResult(RESULT_OK,intent);
finish();
}
);
这样,在点击bt2的时候,就会返回activity1,并显示数据。不过,当用户通过返回键回到activity1时,并没有点击Button,此时,可以通过重写activity2中的onBackPressed来解决。
@Override
public void onBackPressed() {
Intent intent=new Intent();
intent.putExtra("the key","the data from activity2 when you back");
setResult(RESULT_OK,intent);
finish();
}
五、小结
Intent像是活动间的桥梁,通过其可以启动合适的目标活动,也可以在活动间传递数据。