1.什么是数据传递?
2.Activity之间的关系
1)单向数据传递
2)双向数据传递
1.简介
2.Activity之间的数据传递
3.具体方法
组件名称 | 方法名称 |
Activity | startActivity() startActivityForResult() |
Service | startService() bindService() |
Broadcasts | sendBroadcast() sendOrderedBroadcast() sendStickyBroadcast() |
4.启动方式
注意,启动Activity,Service以及BroadCastReceiver之间的Intent是没有重合的
5.Intent的组成
Android Intent 基本使用及对象构成 - 圣骑士wind - 博客园
注意:
6.实例1:
7.实例2:
1.步骤
1.优点
2.隐式启动匹配的过程
3.IntentFilter
4.intentFilter的属性
标签 | 属性 | 说明 |
| android:name | 指定组件所能响应的动作,用字符串表示 |
| android:category | 用于为action增加额外的附加类别信息 |
| android:host | 指定一个有效的主机名 |
android:mimetype | 指定组件能处理的数据类型 | |
android:path | 有效的URI路径名 | |
android:port | 主机的有效端口号 | |
android:scheme | 所需要的特定的协议 |
5.启动系统的activity
6.常见的系统的action
动作 | 说明 |
ACTION_ANSWER | 打开接听电话的Activity,默认为Android内置的拨号盘界面 |
ACTION_CALL | 打开拨号盘界面并拨打电话,使用Uri中的数字部分作为电话号码 |
ACTION_DELETE | 打开一个Activity,对所提供的数据进行删除操作 |
ACTION_DIAL | 打开内置拨号盘界面,显示Uri中提供的电话号码 |
ACTION_EDIT | 打开一个Activity,对所提供的数据进行编辑操作 |
ACTION_INSERT | 打开一个Activity,在提供数据的当前位置插入新项 |
ACTION_PICK | 启动一个子Activity,从提供的数据列表中选取一项 |
ACTION_SEARCH | 启动一个Activity,执行搜索动作 |
ACTION_SENDTO | 启动一个Activity,向数据提供的联系人发送信息 |
ACTION_SEND | 启动一个可以发送数据的Activity |
ACTION_VIEW | 最常用的动作,对以Uri方式传送的数据,根据Uri协议部分以最佳方式启动相应的Activity进行处理。对于http:address将打开浏览器查看;对于tel:address将打开拨号呼叫指定的电话号码 |
ACTION_WEB_SEARCH | 打开一个Activity,对提供的数据进行Web搜索 |
1.简介
当一个Activity启动另一个Activity时,常常会有一些数据要传递过去,在Android中,需要传递的数据放在对象Intent中。
2.方法
前一个Activity传递数据:
后一个Activity获取数据:
3.采用bundle的数据传递
1.简介
2.方法
(1)前一个Activity传递数据:
(2)后一个Activity传递数据:
(3)前一个Activity接收传递数据:
3.为什么需要用requestCode呢?
1.项目要求:模拟一个登录注册的界面采用单向和双向数据传递的方式
图1 登录界面
图2 登录成功界面
图3 模拟的注册界面
2.项目目录
图3 项目目录
3.参考代码
(1)主界面和布局文件
1)布局文件
2)Java代码
/*
* 页面跳转
* 跳转到登录界面,单向数据传递
* 跳转到注册界面双向数据传递
* */
public class MainActivity extends AppCompatActivity {Button login,register;User user=new User();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);
login=findViewById(R.id.login);
register=findViewById(R.id.register);loginListener();registerListener();}//方法:登录public void loginListener(){
login.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {if (user != null&&user.getId()!=0&&user.getName()!=null&&user.getPassword()!=null) {Intent intent = new Intent();
intent.setClass(MainActivity.this, LoginActivity.class);Bundle bundle = new Bundle();
bundle.putSerializable("user", user);
intent.putExtras(bundle);startActivity(intent);} else {Toast.makeText(MainActivity.this, "用户信息为空,请注册!", Toast.LENGTH_SHORT).show();}}});}//方法:注册public void registerListener(){
register.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {if (user != null&&user.getId()!=0&&user.getName()!=null&&user.getPassword()!=null){Toast.makeText(MainActivity.this, "用户信息已存在,请登录!", Toast.LENGTH_SHORT).show();}else {Intent intent=new Intent();
intent.setClass(MainActivity.this,RegisterActivity.class);startActivityForResult(intent,1);}}});}//方法:接收回传数据@Overrideprotected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {super.onActivityResult(requestCode, resultCode, data);System.out.println("所有回传的数据!");if (requestCode==1&&resultCode==1){Intent intent=data;Bundle bundle=intent.getExtras();
user= (User) bundle.getSerializable("user");System.out.println(user);}}
}
(2)登录界面和布局文件
1)布局文件
2)Java代码
//登录后界面
public class LoginActivity extends AppCompatActivity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
//获取单向传递的信息
User user=(User) getIntent().getExtras().getSerializable("user");
if (user!=null){
TextView title=findViewById(R.id.title);
title.setText("欢迎您!"+user.getName()+"登录成功!");
} } //方法:推出登录
public void backLogin(View view) {
Intent intent=new Intent();
intent.setClass(getBaseContext(),MainActivity.class);
startActivity(intent);
Toast.makeText(this, "退出成功!", Toast.LENGTH_SHORT).show();
finish();
}
}
(3)注册界面和布局文件
1)布局文件
2)Java代码
//注册信息界面
public class RegisterActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_register);}//方法:取消注册public void backRegister(View view) {Intent intent=new Intent();
intent.setClass(getBaseContext(),MainActivity.class);startActivity(intent);Toast.makeText(this, "取消注册成功!", Toast.LENGTH_SHORT).show();finish();}//方法:注册public void forRegister(View view) {Intent intent=new Intent();Bundle bundle=new Bundle();User user=new User(1,"张三","123456");
bundle.putSerializable("user",user);
intent.putExtras(bundle);setResult(1,intent);Toast.makeText(this, "注册成功!", Toast.LENGTH_SHORT).show();finish();}
}
(4)实体类
public class User implements Serializable {
private int id;
private String name;
private String password; public User(int id, String name, String password) {
this.id = id;
this.name = name;
this.password = password;} public int getId() {return id;} public void setId(int id) {
this.id = id;} public String getName() {return name;} public void setName(String name) {
this.name = name;} public String getPassword() {return password;} public void setPassword(String password) {
this.password = password;} public User() {} @Override
public String toString() {return "User{" +"id=" + id +", name='" + name + '\'' +", password='" + password + '\'' +'}';}
}
4.效果图
1.注意
1)manifest代码
2)第一个activity的Java代码,布局文件就一个button省略
//隐式启动
public void openDemo(View view) {
Intent intent=new Intent();
intent.setPackage("com.lxz.review2");
intent.setAction("com.lxz.openDemo");
intent.addCategory("android.com.lxz.openDemo");
intent.putExtra("code","200");
startActivity(intent); }
3)被启动的界面Java代码
String code=getIntent().getStringExtra("code");Toast.makeText(this, "code:"+code, Toast.LENGTH_SHORT).show();
4)效果图
1.案例1
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.baidu.com"));
startActivity(intent);