Intent是Android程序中各组件之间进行交互的一种重要方式。它不仅可以指明activity想要执行的动作,也可以在不同组件之间传输数据。
Intent分为两种,显式intent和隐式intent,以下分别进行描述:
一、显式intent
bt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent1 = new Intent(MainActivity.this,secondActivity.class);
startActivity(intent1);
}
});
显式intent非常简单,直接创建一个intent对象,第一个参数代表启动活动的上下文,第二个代表想要启动的目标,之后调用startactivity即可。
二、隐式intent
相比于显式intent,隐式intent含蓄了很多,他并不明确指定要启动哪一个服务,而是用一系列的action和category等信息去过滤,然后交由系统分析这个intent,并帮我们找到合适的activity去启动。
<activity android:name=".secondActivity">
<intent-filter>
<action android:name="com.example.aries.androidtest.ACTION_START"></action>
<category android:name="android.intent.category.DEFAULT"></category>
</intent-filter>
</activity>
上述的action标签中的内容可以随便用一个字符串,比如上述的,也可以使用系统内置的,比如主活动的action;category标签则是添加了一系列附加信息,更加精确的指出当前activity能够响应的intent还必须包含带有的category。只有action和category中的内容同时响应intent的action和category时,这个activity才能被响应;
代码段如下所示:
bt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent("com.example.aries.androidtest.ACTION_START");
startActivity(intent);
}
});
注:一个intent只能指定一个action,但是可以指定多个category,满足其中一个category即可启动。单action多category如下所示:
<activity android:name=".secondActivity">
<intent-filter>
<action android:name="com.example.aries.androidtest.ACTION_START"></action>
<category android:name="android.intent.category.DEFAULT"></category>
<category android:name="my_category"></category>
</intent-filter>
</activity>
三、更多隐式intent的用法
intent-filter下面可以有三种标签,分别是action、category和data,前两个都已经讲述,现在来探讨一下data这个属性。
使用隐式intent,我们不仅可以启动自己程序内的activity,还可以调用其他程序中的activity,先看一个简单的例子,我们要展示一个网页,自己去实现一个浏览器不科学的,所以我们可以调用系统浏览器去打开,代码如下:
bt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);
}
});
这里我们首先指定了intent的action对象为Intent.ACTION_VIEW,这是安卓内置的动作,然后指定intent的data值-一个uri对象。
data标签究竟可以有哪些内容呢,我们发现如下:
android:scheme 用于指定数据的协议部分,如上例中的http;
android:host 用于指定数据的主机名部分,如www.baidu.com;
android:port 用于指定数据的端口部分,一般在主机名之后;
android:path 用于指定主机名和端口后面的部分;
android:mimeType 用于指定可以处理的数据类型。
如下面代码就可以响应打开一个网页的intent:
<activity android:name=".secondActivity">
<intent-filter tools:ignore="AppLinkUrlError">
<action android:name="android.intent.action.VIEW"></action>
<category android:name="android.intent.category.DEFAULT"></category>
<data android:scheme="http"></data>
</intent-filter>
</activity>
四、intent在activity中传递数据
1、向下一个activity传递数据
第一个activity代码如下:
bt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MainActivity.this,secondActivity.class);
intent.putExtra("data","this is data");
startActivity(intent);
}
});
接收方的第二个activity:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
TextView tv = findViewById(R.id.textView);
Intent intent = getIntent();
String data = intent.getStringExtra("data");
tv.setText(data);
}
2、返回数据给上一个活动
不在使用startactivity这个方法,而是使用startactivityforresult方法;
第一个activity:
public class MainActivity extends AppCompatActivity {
TextView tv;
Button bt;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bt = findViewById(R.id.bt1);
tv = findViewById(R.id.textView);
bt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MainActivity.this,secondActivity.class);
startActivityForResult(intent,1);//第二个参数是请求码
}
});
}
//请求码,返回数据的结果码,携带数据的intent
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode){
case 1:
if (resultCode == 4){
Log.i("info",data.getStringExtra("data"));
tv.setText(data.getStringExtra("data"));
}
}
}
}
第二个activity:
public class secondActivity extends AppCompatActivity {
Button bt;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
bt = findViewById(R.id.bt);
bt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent();
intent.putExtra("data","second返回的数据");
setResult(4,intent);
finish();
}
});
}
}
注意:一个activity可以跳转到很多个activity,应用请求码和结果码可以进行区分;