Intent(意图)
Intent 是各 组件之间交互 的重要方式,一般用于启动活动、启动服务、发送广播等场景。
作用:
1、指明当前组件想要执行的动作
2、在不同组件之间传递数据
1、显示Intent(明确指出启动的活动,限定目标activity类名)
应用场景:一般用于应用内的组件之间跳转
1.1、第一个activity页面,传递数据
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);//设置视图内容
//初始化界面
maccount = this.findViewById(R.id.account);
mpassword = this.findViewById(R.id.password);
mlogin = this.findViewById(R.id.login);
//创建点击事件
mlogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d(TAG, "onClick: 登录点击了");
String account = maccount.getText().toString().trim();
if (TextUtils.isEmpty(account)) {
Toast.makeText(MainActivity.this, "请输入账户名", Toast.LENGTH_SHORT).show();
return;
}
String password = mpassword.getText().toString().trim();
if (TextUtils.isEmpty(password)) {
Toast.makeText(MainActivity.this, "请输入密码", Toast.LENGTH_SHORT).show();
return;
}
//将数据传到另个activity
Intent intent = new Intent(MainActivity.this, SecondActivity.class);//第一个参数:启动活动的上下文。第二个参数:要启动的目标活动
intent.putExtra("account", account);//传递数据
intent.putExtra("password", password);
startActivity(intent);//startActivity()启动活动,实现跳转页面
}
});
}
1.2、跳转到的activity页面,接收数据:
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
TextView info = findViewById(R.id.info);//找到控件
Intent intent = getIntent();//接收intent
String account = intent.getStringExtra("account");//接收数据
String password = intent.getStringExtra("password");
info.setText("账号:" + account + ",密码:" + password);
}
2、隐式Intent(不明确指出启动的活动,必须匹配action 和category 标签内容)
应用场景:一般用于应用之间跳转。
AndroidManifest.xml 文件
<activity android:name=".ThirdActivity">
<intent-filter>//意图过滤
//<action>和<category>中的内容,同时匹配Intent中的指定的action和category,这个活动才能相应这个Intent意图
<action android:name="com.win.LOGIN_INFO"/>//指明当前活动可以相应这个action
<category android:name="android.intent.category.DEFAULT"/>//附加信息。 DEFAULT默认界面
</intent-filter>
</activity>
2.1、第一个activity页面,传递数据。Intent 必须要匹配< action >和< category >标签中的内容。
//隐式意图
Intent intent1 = new Intent();
intent1.setAction("com.win.LOGIN_INFO");//匹配<action>标签
intent1.addCategory("android.intent.category.DEFAULT");//匹配<category>标签
intent1.putExtra("account",account);//添加数据
intent1.putExtra("password",password);
startActivity(intent1);
2.2、第二个activity页面,接收数据
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
TextView info = findViewById(R.id.info);//找到这个活动控件
Intent intent = getIntent();//接收intent
String account = intent.getStringExtra("account");//接收数据
String password = intent.getStringExtra("password");
info.setText("account:"+account+",password:"+password);//将数据放到这个控件中
}
Intent数据回传(startActivityForResult()方法)
1、MainActivity(第一个活动) 跳转到 PayActivity(第二个活动) 页面(使用startActivityForResult()方法启动第二个活动)
mbutton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, PayActivity.class);
startActivityForResult()方法,启动活动
// 第一个参数intent,第二个参数请求码(用于在之后的回调中判断数据的来源,只要是唯一值就可以)
startActivityForResult(intent,1);
}
});
2、 PayActivity(第二个活动),点击事件和添加返回数据(setResult()方法)
//给button设置点击事件
mbutton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String payNum = meditText.getText().toString().trim();
if (TextUtils.isEmpty(payNum)) {
Toast.makeText(PayActivity.this, "请输入充值金额", Toast.LENGTH_SHORT).show();
return;
}
Intent intent = new Intent();//传递数据的Intent
intent.putExtra("resultContent", "充值成功");
intent.putExtra("payNum",payNum);
//setResult()一个参数向上个活动返回处理结果(RESULT_OK,RESULT_CANCELED),第二个参数:带有数据的intent
setResult(RESULT_OK, intent);
finish();//销毁当前活动
}
});
3、MainActivity(第一个活动)得到数据。(onActivityResult()方法)
步骤:requestCode(判断数据来源)–>resultCode(判断处理结果)–>data(从Intent中获取数据)
//返回的结果会在这里回调
//onActivityResult()方法:3个参数。requestCode:启动活动时传入的请求码。resultCode:返回数据时的处理结果。data:带数据的Intent
//startActivityForResult()方法可能调用很多,但是都会回调到onActivityResult()方法中
//requestCode(判断数据来源)-->resultCode(判断处理结果)-->data(从Intent中获取数据)
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {//requestCode(判断数据来源)
case 1:
if (resultCode == RESULT_OK) {//resultCode(判断处理结果)
String resultContent = data.getStringExtra("resultContent");//data(从Intent中获取数据)
String resultContent1 = data.getStringExtra("payNum");//data(从Intent中获取数据)
mtextView.setText(resultContent+":"+resultContent1+"元");
}
break;
}
}