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);
}

作为学习笔记,记录下来。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值