首页 > 代码库 > Android之startActivity、startActivityForResult和setResult详解

Android之startActivity、startActivityForResult和setResult详解

[PS:还是以GOOGLE原生的BluetoothChat为例]

1. startActivitystartActivityForResult的区别

startActivity( ) 仅仅是跳转到目标页面,若是想跳回当前页面,则必须再使用一次startActivity( )。

startActivityForResult( ) 可以一次性完成这项任务,当程序执行到这段代码的时候,假若从T1Activity跳转到下一个Text2Activity,

而当这个Text2Activity调用了finish()方法以后,程序会自动跳转回T1Activity,并调用前一个T1Activity中的onActivityResult( )方法。

例如在BluetoothChat类中,对跳转到DeviceListActivity类采用的是startActivityForResult( ) 方式:

  @Override    public boolean onOptionsItemSelected(MenuItem item) {        Intent serverIntent = null;        switch (item.getItemId()) {        case R.id.secure_connect_scan:            // Launch the DeviceListActivity to see devices and do scan            serverIntent = new Intent(this, DeviceListActivity.class);            startActivityForResult(serverIntent, REQUEST_CONNECT_DEVICE_SECURE);            return true;        case R.id.insecure_connect_scan:            // Launch the DeviceListActivity to see devices and do scan            serverIntent = new Intent(this, DeviceListActivity.class);            startActivityForResult(serverIntent, REQUEST_CONNECT_DEVICE_INSECURE);            return true;        case R.id.discoverable:            // Ensure this device is discoverable by others            ensureDiscoverable();            return true;        }        return false;    }

在DeviceActivity中则使用setResult()方法返回值:

  // The on-click listener for all devices in the ListViews    private OnItemClickListener mDeviceClickListener = new OnItemClickListener() {        public void onItemClick(AdapterView<?> av, View v, int arg2, long arg3) {            // Cancel discovery because it‘s costly and we‘re about to connect            mBtAdapter.cancelDiscovery();            // Get the device MAC address, which is the last 17 chars in the View            String info = ((TextView) v).getText().toString();            String address = info.substring(info.length() - 17);            // Create the result Intent and include the MAC address            Intent intent = new Intent();            intent.putExtra(EXTRA_DEVICE_ADDRESS, address);            // Set result and finish this Activity            setResult(Activity.RESULT_OK, intent);            finish();        }    };

但是,要注意,如果在startActivityForResult跳转到的Activity里面设置setResult,结果并不会马上返回给parent的Activity,只有当前Activity被finish,

结果才会被发送给parent的onActivityResult去处理:

  public void onActivityResult(int requestCode, int resultCode, Intent data) {        if(D) Log.d(TAG, "onActivityResult " + resultCode);        switch (requestCode) {        case REQUEST_CONNECT_DEVICE_SECURE:            // When DeviceListActivity returns with a device to connect            if (resultCode == Activity.RESULT_OK) {                connectDevice(data, true);            }            break;        case REQUEST_CONNECT_DEVICE_INSECURE:            // When DeviceListActivity returns with a device to connect            if (resultCode == Activity.RESULT_OK) {                connectDevice(data, false);            }            break;        case REQUEST_ENABLE_BT:            // When the request to enable Bluetooth returns            if (resultCode == Activity.RESULT_OK) {                // Bluetooth is now enabled, so set up a chat session                setupChat();            } else {                // User did not enable Bluetooth or an error occurred                Log.d(TAG, "BT not enabled");                Toast.makeText(this, R.string.bt_not_enabled_leaving, Toast.LENGTH_SHORT).show();                finish();            }        }    }

 

Android之startActivity、startActivityForResult和setResult详解