1.为什么要使用Intent?
Intent 是 Android 程序中各组件之间进行交互的一种重要方式,它不仅可以指明当前组 件想要执行的动作,还可以在不同组件之间传递数据。Intent 一般可被用于启动活动、启动 服务、以及发送广播等场景,由于服务、广播等概念
Intent分为俩种:显示Intent 和隐式Intent
1.1显示Intent
显示类型一般创建在活动中,例如跳转页面:
Intent intent = new Intent(当前页面.this, 跳转的页面.class);
startActivity(intent);
1.2隐式Intent
隐式类型一般在 AndroidManifest.xml 配置
<activity android:name=".SecondActivity" >
<intent-filter>
//<action>标签中我们指明了当前活动可以响应 com.example.activitytest.ACTION_START 这个 action
<action android:name="com.example.activitytest.ACTION_START" />
//<category>标签则包含了一些附加信息,更精确地指明了当前的活动能够响应的 Intent 中还可能带有的 category
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
//只有<action>和<category>中的内容同时能够匹配上 Intent 中指定的 action 和 category 时,这个活动才能响应该 Intent。
下面看一下主代码(MainActivity)的点击事件
button1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//我们使用了 Intent 的另一个构造函数,直接将 action 的字符串传了进去,表明我们想要启动能够响应 com.example.activitytest.ACTION_START 这个 action 的活动
Intent intent = new Intent("com.example.activitytest.ACTION_START");
startActivity(intent);//在调用startActivity()方法的时候会自动将这个 category 添加到 Intent 中
}
});
隐式Intent更多用法扩展:
使用隐式 Intent,我们不仅可以启动自己程序内的活动,还可以启动其他程序的活动, 这使得 Android 多个应用程序之间的功能共享成为了可能。比如说你的应用程序中需要展示 一个网页,这时你没有必要自己去实现一个浏览器(事实上也不太可能),而是只需要调用 系统的浏览器来打开这个网页就行了
例如点击按钮打开百度:
button1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//这是一个 Android 系统内置的动作
Intent intent = new Intent(Intent.ACTION_VIEW);
//然后通过 Uri.parse()方法,将一个网址字符串解析成一个 Uri 对象,再调用 Intent 的 setData()方法将这个 Uri 对象传递进去
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);
}
});
还有很多功能,打开软件,百度等等。。。。
2.Intent传递数据
2.1向下一个活动传递数据
FirstActivity 向 SecondActivity 传递数据(向下)
FirstActivity 发送:
button1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//定义一个字符串数据便于传递
String data = "Hello SecondActivity";
//因为我们需要FirstActivity 向 SecondActivity 传递数据,所以这样写
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
//并通过 putExtra()方法传递了一个字符串。注意这里 putExtra()方法接收两个参数,第一个参数是键,用于后面从 Intent中取值,第二个参数才是真正要传递的数据
intent.putExtra("extra_data", data);
//开始执行
startActivity(intent);
}
});
SecondActivity 接收:
public class SecondActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.second_layout);
//首先可以通过 getIntent()方法获取到用于启动 SecondActivity 的 Intent
Intent intent = getIntent();
//调用getStringExtra()方法,传入相应的键值,就可以得到传递的数据了
String data = intent.getStringExtra("extra_data");
//输出打印
Log.d("SecondActivity", data);
}
}
2.2返回数据给上一个活动
我们还以俩个活动为例MainActivity和MainAcitivity2:
MainActivity:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//首先定义一个按钮
Button but = (Button) findViewById(R.id.but);
//按钮监听事件
but.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MainActivity.this,Main2Activity.class);
/*startActivityForResult()方法接收两个参数,第一个参数还是 Intent,第二个参数是求
码,用于在之后的回调中判断数据的来源(请求码-----唯一就可以)*/
startActivityForResult(intent,1);
}
});
}
@Override
//重写onActivityResult
//第一个参数 requestCode,即我们在启动活动时传入的请求码。第二个参数 resultCode,即我们在返回数据时传入的处理结果。第三个参数 data,即携带着返回数据的 Intent,下面就不做解释了
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
switch(requestCode){
case 1:
if(resultCode == RESULT_OK){
String data_return = data.getStringExtra("data_return");
Toast.makeText(this, ""+data_return, Toast.LENGTH_SHORT).show();
}
break;
default:
break;
}
}
Main2Activity:
public class Main2Activity extends AppCompatActivity {
@Override
//当用户按下 Back 键,就会去执行 onBackPressed()方法中的代码,我们在这里添加返回数据的逻辑就行了
//这里就不做解释了,自己捂捂
public void onBackPressed() {
Intent intent = new Intent();
intent.putExtra("data_return","Hello");
setResult(RESULT_OK,intent);
finish();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
//这俩步就不用多说了吧阿巴阿巴
Button but2 = (Button) findViewById(R.id.but2);
but2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//构建一个Intent,用来传数据而已,并没有其他意图
Intent intent = new Intent();
//用putExtra方法,来传输键值对
intent.putExtra("data_return","Hello MainActivity");
/*setResult方法接收俩个参数,第一个参数用于向上一个活动返回处理结果,一 般只 使用 RESULT_OK 或RESULT_CANCELED 这两个值,第二个参数则是把带有数据的 Intent 传递回去*/
setResult(RESULT_OK,intent);
//销毁当前活动
finish();
}
});
}
}