android之双向传递数据

向下一个活动传递数据

使用Intent对象中的putExtra()方法,可以把我们想要专递的数据暂存在Intent中,启动另一个活动后,只需要将这些数据从Intent中取出即可。

Bundle可以传递多种数据,是一种类似map的key-value数据结构

通常我们可以使用Bundle存储数据,然后再讲Bundle放入Intent中


向上一个活动传递数据

我们可以使用Activity中的startActivityForResult()方法用于启动活动,但这个方法期望在活动销毁的时候能够返回一个结果给上一个活动。


下面我们就使用案例来实现向下传递数据和向上传递数据(求和案例)

首先我们需要设置布局:

<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.extrademo.MainActivity"
    android:stretchColumns="1"
    tools:ignore="MergeRootFrame">
    
    <TableRow>
        <TextView 
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
			android:text="@string/txt1"
        />
        
        <EditText 
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:hint="@string/hint_num1"
            android:id="@+id/num1"
            />
    </TableRow>
    <TableRow>
        <TextView 
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
			android:text="@string/txt2"
        />
        <EditText 
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:hint="@string/hint_num2"
            android:id="@+id/num2"
            />
    </TableRow>
    
    <TableRow>
		<Button 
		    android:layout_width="match_parent"
		    android:layout_height="wrap_content"
		    android:text="@string/btn1"
		    android:layout_span="2"
		    android:id="@+id/btn1"
		    />        
    </TableRow>
    
    <TableRow>
        <TextView 
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
			android:text="@string/sum"
			android:id="@+id/sum"            
            />
    </TableRow>
    
</TableLayout>

然后再创建一个活动SecondActivity,并在Mainifest注册

<!-- 第二个活动 -->
<activity
	android:name="com.example.extrademo.SecondActivity">
</activity>

然后我们开始在主活动中写入逻辑代码,将数据传入到SecondActivity

public class MainActivity extends ActionBarActivity {

    private EditText ed_a;
	private EditText ed_b;
	private TextView tv;

	@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        //获取对应的视图
        ed_a = (EditText)findViewById(R.id.num1);
        ed_b = (EditText)findViewById(R.id.num2);
        Button btn = (Button)findViewById(R.id.btn1);
        tv = (TextView)findViewById(R.id.sum);
        
        //添加点击事件
        btn.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View view) {
				String a = ed_a.getText().toString();
				String b = ed_b.getText().toString();
				//创建意图
				Intent intent = new Intent(MainActivity.this,SecondActivity.class);
				//设置Bundle对象用于存储数据,然后将Bundle存入intent中
				Bundle bundle = new Bundle();
				bundle.putString("a", a);
				bundle.putString("b", b);
				//将Bundle存入intent中
				intent.putExtras(bundle);
				//开启活动并发送一个200的请求码
				startActivityForResult(intent, 200);
			}
		});
    }
	/**
	 * 回调方法
	 * @param requestCode 请求码
	 * @param resultCode 结果码
	 * @param data 数据
	 */
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		super.onActivityResult(requestCode, resultCode, data);
		//当请求码为200结果码和返回的结果码相同则获取数据,显示数据
		if (requestCode == 200) {
			if (resultCode == RESULT_OK) {
				Bundle bundle = data.getExtras();
				int result = bundle.getInt("result");
				tv.setText("结果:" + result);
			}
		}
	}
}

再然后我们在SecondActivity中将MainActivity传递的数据获取,处理,并将结果返回到MainActivity中显示出来

public class SecondActivity extends Activity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		//获取到启动SecondActivity的Intent
		Intent intent = this.getIntent();
		//获取传输过来的数据
		Bundle bundle = intent.getExtras();
		String a = bundle.getString("a");
		String b = bundle.getString("b");
		//将传入过来的结果进行转型   在这里如果不输入数字将会报错,由于只是了解方法,我们就不再进行优化了
		int result = Integer.parseInt(a) + Integer.parseInt(b);
		//求和的结果放入bundle中
		bundle.putInt("result", result);
		//将bundle放入intent中
		intent.putExtras(bundle);
		//设置返回结果的结果码和意图
		setResult(RESULT_OK, intent);
		//销毁活动
		finish();
	}
}

下面是string.xml文件中的数据

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">求和</string>
    <string name="action_settings">Settings</string>
    <!-- 左边提示文本 -->
    <string name="txt1">数字1</string>
    <string name="txt2">数字2</string>
    <!-- 提示文字 -->
    <string name="hint_num1">请输入第一个数字</string>
	<string name="hint_num2">请输入第二个数字</string>
	<!-- 按钮名字 -->
	<string name="btn1">求和</string>
	
	<!-- 显示数据 -->
	<string name="sum">求和:</string>
</resources>

运行结果如下:




这两天下了一个使用UDP传输目录内文件的程序,发出来给大家一起看看,共同进步。有问题请指教。 由于udp丢包比较厉害,因此使用了自定义的内部协议,进行双方的确认。 程序跑起来后,看网络状况,有时候会一卡一卡的。 以下是程序说明: * 本程序集成了数据导出端(服务器端)和数据导入端(客户端),使用UDP进行文件传递 * 服务器端的文件来源目录,见Tools中SOURCEPATH的设置 * 客户端的文件保存目录,见Tools中DESTINATIONPATH的设置,可以根据自己需要进行调整 * * 由于UDP存在丢包问题,因此Server和Client的通讯需要来回包进行确认,协议包头如下: * 1. "55 aa 99 01",表示客户端发起广播请求,请求服务器响应 * 2. "55 aa 99 02 + 服务器的设备名称",表示服务器接收到广播后,响应客户端请求,把此包指定IP发送客户端(此指定IP地址可以UDP广播信息包中获取) * 3. "55 aa 99 03",表示客户端接收到服务器的响应,接着向服务器指定IP请求:需要传递的文件总数目和文件总容量(单位为KB) * 4. "55 aa 99 04 + 4字节文件总数目和4字节的文件总容量",表示服务器接收到客户端的0x03请求,统计SOURCEPATH中的所有文件数目和文件总容量,发送指定IP地址的客户端 * 5. "55 aa 99 05",客户端接收到文件总数目和文件总容量,请求服务器发送文件具体内容 * 6. "55 aa 99 10 + 文件名称",服务器发送文件名称 * 7. "55 aa 99 11",客户端响应,表示接收到服务器发送的0x10包 * 8. "55 aa 99 12+文件内容",服务器端发送具体文件内容 * 9. "55 aa 99 13",客户端响应,表示接收到服务器发送的0x12包 * 10."55 aa 99 14",服务端高速客户端发送完毕 * * 注意:服务器发送0x10包后,收到客户端的0x11响应包,将把文件具体内容拆分成N个0x12包,每个包的大小见Tools.byteSize的设置,目前设置为10K, * 服务器没收到一个0x13响应包,才能继续发下一个0x12包,已放置UDP的丢包,另外每个0x12包最多发送10次而无0x13包的响应,则发送进程结束,界面提示 * * 本程序已经封装好,调用见TransportFilesActivity.java文件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值