Android开发之Activity启动和传递数据
目录
前言
本人是一位嵌入式行业的开发者,从业以来负责嵌入式软件方面的开发和设计。近期,由于项目需要,产品需要通过蓝牙对接到安卓移动端。由于公司没有安卓开发人员,这一块工作就需要我来完成。
这里就不再说明Android Studio怎么下载怎么安装,也不讲下载到别人的项目代码,怎么构建/修改Gradle顺利的build successfully。
此篇文章的用意,更多是作为自己的学习笔记,也为有需要的朋友提供一点点帮助。写的不好,恳请指正。
启动一个Activity
Activity作为安卓APP中最基本的要素,它通常与界面显示关联在一起。当然Activity不是只能用于界面活动中。也不属于特定的一个界面。
启动一个Activity,一般有两种方法,一个是跳转到新的Activity,一个是不发生跳转,但是接收新Activity返回的结果。
方法1 启动一个新的Activity并跳转
Intent newIntent = new Intent(MainActivity.this, NewActivity.class);或者
Intent newIntent = new Intent();
newIntent.setClass(MainActivity.this, NewActivity.class);
startActivity(newIntent); // 跳转到新的Activity
严格的说,该方法调用请求是发送给操作系统的ActivityManagerActivityManager负责创建Activity实例并调用其onCreate()方法。
方法2 启动一个新Activity但不跳转,并等待其返回结果。
Intent newIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); // 传入一个String类型的Action,这里以打开蓝牙为例
#需要一个方法类接收被启动activity返回的信息
(重写父类的onActivityResult)
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case 0: {
if (resultCode == RESULT_OK) {
toast("蓝牙打开成功");
}
}
break;
case xxx: {
//处理相应resultCode返回的结果resultCode
if (resultCode == y2) {
} else if (resultCode == y1) {
}
}
break;
...
}
}
参数1:携带了extra信息的intent对象,参数2:请求码,发给新activity(当一个activity启动多个不同类型的新activity,会要使用到请求码进行区分来自具体activity的返回信息)startActivityForResult(newIntent, requestCode);
Activity之间传递消息
Activity传递数据是经常用到的。我们期望在启动一个新的Activity时,同时也把必要的数据传递过去。
传递的数据有的是基本类型,有的引用类型(如自定义的对象)。
传递的数据是基本类型
方法1. 实例化一个Bundle对象,设置Value。(有点像Key:Value形式)
MainActivity:
// 我们以向新Activity传递一个byte为例,传递其他类型的方法类似
Intent newIntent = new Intent();
newIntent.setClass(MainActivity.this, NewActivity.class);
byte a = 1;
Bundle newBundle = new Bundle();
newBundle.putByte("test1", a);
newIntent.putExtras(newBundle);
startActivity(newIntent); //启动新的Activity
NewActivity:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_new);
//获取到Intent
Intent intent = getIntent();
//从Intent获取到Bundle
Bundle bundle= intent.getExtras();
if (bundle != null) {
byte m = bundle.getByte("test1");
Log.e(TAG, "m = "+m);
}
}
方法2. 调用响应的方法,上层不实例化Bundle对象例如
例如,想要给新的Activity传递String字符串,调用如下方法。方法调用位置跟3.1.1一样。这里就省略了。
MainActivity:
newIntent.putExtra("test2", "value2");
startActivity(newIntent); //启动新的Activity
NewActivity:
String str = intent.getStringExtra("test2");
传递的数据是引用类型
上述的方法只能传递基本类型,如果要传递引用类型。需要用到Serializable序列化。
原因:安卓Activity中无法将一个对象的引用传给另一个Activity。我们需要将这些对象放到一个Bundle里面,如不上述的方法,然后再传递,这时候就用到了序列化。
举例,新建Share类,需要传递的内容,自由发挥。这里只是用String字符串说明怎么使用Serializable来传递数据
public class Share implements Serializable {
private static final long serialVersionUID = -4194111910182754014L;
public String mBtAddr;
void setBluetoothAddr(String addr) {
mBtAddr = addr;
}
public String getBluetoothAddr() {
return mBtAddr;
}
// 定义内部的static类
private static class shareHolder {
// 在导入Share类时,保证INSTANCE只被实例化一次
static final Share INSTANCE = new Share();
}
static public Share getInstance() {
return shareHolder.INSTANCE;
}
// private默认构造函数:避免外界直接使用new来实例化对象
private Share() {
}
}
在当前Activity
private Share mShare = Share.getInstance();
mShare.mBtAddr = xxxx; //放入要传递的对象
newIntent.putExtra("share", mShare);
startActivity(newIntent); //启动
需要跳转到的Activity,在onCreate方法中获取传递过来的Share对象
String str = intent.getStringExtra("test2");
Serializable se = intent.getSerializableExtra("share");
// 用instanceof运算符,测试se是否为Share类的实例
if (se instanceof Share) {
Share Share = (Share) se;
mBtDevice = mBtAdapter.getRemoteDevice(Share.mBtAddr);
}
作为学习笔记,记录下来。