有关onActivityResult提前调用的问题

http://blog.csdn.net/danericola/article/details/7532425#comments




天准备在自己的游戏中加入蓝牙功能,于是将Android SDK Sample中的BluetoothChat看了看,发现基本上大部分的代码都可以复用,于是乎乾坤大挪移了一番,总算没有错误了,可是在我的Nexus上一运行,悲剧了,蓝牙明明打开了,可是却不能进入到DeviceListActivity,看了看代码,我是在onActivityResult中判断蓝牙打开成功后,才会启动DeviceListActivity,难道这么简单的代码都会出错吗?没办法只好调试一下了,一调试才发现,原来调用startActivityForResult(enableIntent, REQUEST_ENABLE_BLUETOOTH)后,请求开启蓝牙的对话框刚弹出来,onActivityResult函数就已经被调用了,而且其resultCode还是Activity.RESULT_CANCELED,而当在对话框上选择开启蓝牙后,onActivityResult函数反而不会被调用了,我了个擦,这是怎么回事。

代码如下:

	private void enableBluetooth() {
		if (D) Log.d(TAG, "enable bluetooth");
		Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
		startActivityForResult(enableIntent, REQUEST_ENABLE_BLUETOOTH);
	}

	private void selectDevice() {
		Intent serverIntent = new Intent(Linkage.this, BtDeviceList.class);
		startActivityForResult(serverIntent, REQUEST_CONNECT_DEVICE);
	}

	private void enterVsMode() {
		if (mBtAdapter == null) return;
		if (mBtAdapter.isEnabled()) {
			selectDevice();
		} else {
			enableBluetooth();
		}
	}
	
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		switch (requestCode) {
		case REQUEST_ENABLE_BLUETOOTH:
			// When the request to enable Bluetooth returns
			if (resultCode == Activity.RESULT_OK) {
				selectDevice();
			} else {
				// User did not enable Bluetooth or an error occured
				Toast.makeText(this, R.string.bt_open_failed, Toast.LENGTH_SHORT).show();
			}
		case REQUEST_CONNECT_DEVICE:
			// When DeviceListActivity returns with a device to connect
			if (resultCode == Activity.RESULT_OK) {
				// Get the device MAC address
				String address = data.getExtras().getString(BtDeviceList.EXTRA_DEVICE_ADDRESS);
				// Get the BLuetoothDevice object
				BluetoothDevice device = mBtAdapter.getRemoteDevice(address);
				// Attempt to connect to the device
				mBtService.connect(device);
			}
			break;
		}
	}
仔细对比了一下自己的代码和BluetoothChat的代码,并没有发现什么可疑之处,直到比较了一下AndroidManifest.xml文件,才发现我的工程多了一处属性:android:launchMode="singleInstance",去掉之后一切正常了,后来在google上发现也有同胞发现了类似的问题,他是多加了一句代码:intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);也会导致一样的结果,回过头来翻了翻开发指南,才恍然大悟,里面有句话是这么说的:一个“singleInstance”模式的activity将会是它所在的任务中唯一的activity。如果它启动了别的activity,那个activity将会依据它自己的加载模式加载到其它的任务中去——如同在intent中设置了FLAG_ACTIVITY_NEW_TASK 标记一样的效果。是的,也就是说这两种情况下,新开启的Activity一定在新的任务(进程)中,和原来的Activity不在同一进程中,我想这应该就是onActivityResult函数表现异常的原因吧,看来自己还是基本功不够扎实啊。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值