全栈工程师开发手册 (作者:栾鹏)
安卓使用intent切换窗口,并从子窗口中获取返回数据
切换到应用内部同级窗口,同时传递数据
窗口 Intent_Activity 切换到应用内同级窗口 Intent_SubActivity
在Intent_Activity.java中调用下面函数,在切换中可以通过Bundle传递数据,
public void to_activity()
{
Intent myintent = new Intent();
Bundle data = new Bundle();
data.putString("mykey", "myvalue"); //向intent写入数据
myintent.putExtras(data); //将数据模块放入切换类中
myintent.setClass(Intent_Activity.this,Intent_SubActivity.class);
startActivity(myintent); //启动新页面
Log.v("窗口切换", "主窗口:"+"myvalue");
finish();
}
在Intent_SubActivity.java中调用下面函数,通过getIntent,getData,getExtras获取数据
public void getdata() {
Intent intent = this.getIntent(); //getIntent返回最初用来创建activity的Intent
String action = intent.getAction(); //读取动作
Uri data = intent.getData(); //读取数据
Bundle local_data=intent.getExtras(); //读取本地intent中的数据模块
String myvalue=local_data.getString("mykey"); //读取数据模块中的数据值
Log.v("窗口切换", "同胞窗口:"+myvalue);
//startNextMatchingActivity(intent); //将intent传递给下一个匹配的activity
}
切换到应用内部子窗口,并接收子窗口关闭后的返回数据
1、窗口 Intent_Activity 切换到应用内子窗口 Intent_SubActivity
在Intent_Activity.java中调用下面函数,在切换中可以通过Bundle传递数据。
父窗口启动子窗口时,设置请求码,用来区别同一个父窗口请求的不同子窗口,或对同一个子窗口不同状况下不同类别的请求。
private final int request_type1=1; //一般不同的请求码使用终态int型表示。
public void to_activity_result()
{
Intent myintent = new Intent();
Bundle data = new Bundle();
data.putString("mykey", "myvalue"); //向intent写入数据
myintent.putExtras(data); //将数据模块放入切换类中
myintent.setClass(Intent_Activity.this,Intent_SubActivity.class);
startActivityForResult(myintent, request_type1); //参数11表示请求码,可以自己传递一个int型数据,用于区别打开多个不同的子窗口
Log.v("窗口切换", "父窗口发送到子窗口:"+"myvalue");
}
2、在子窗口Intent_SubActivity.java中调用下面函数,接收父窗口传来的数据,并设置返回数据。
子窗口返回到应用内部父窗口时,结果码用来区别同一个子窗口对不同父窗口的响应,或不同情况下的响应
public void back()
{
Intent intent = this.getIntent(); //getIntent返回最初用来创建activity的Intent
Bundle local_data=intent.getExtras(); //读取本地intent中的数据模块
String myvalue=local_data.getString("mykey"); //读取数据模块中的数据值
Log.v("窗口切换", "子窗口接收到父窗口:"+myvalue);
Intent backintent = new Intent();
Bundle backdata = new Bundle();
backdata.putString("mykey1", "back_value"); //向intent写入数据
backintent.putExtras(backdata); //将数据模块放入切换类中
setResult(101,backintent); //参数101表示结果码,自己传递一个int型数据,用于区别同一个子窗口的多种可能的返回结果
Log.v("窗口切换", "子窗口发送到父窗口:"+"back_value");
finish();
}
3、父窗口Intent_Activity.java重写onActivityResult结果函数,收集子窗口返回的数据。
在onActivityResult通过请求码和结果码区别不同的请求下,不同的应答。
@Override
protected void onActivityResult(int requestCode,int resultCode,Intent data){ //requestCode打开子窗口时的请求码,resultCode子窗口返回的响应码,data目标窗口返回的intent
super.onActivityResult(requestCode, resultCode, data);
if (requestCode==request_type1) {
if (resultCode==101) {
Bundle backdata = data.getExtras(); //取得来自子窗口的数据模块
String backstr = backdata.getString("mykey1");
Log.v("窗口切换", "父窗口接收到子窗口:"+backstr);
}if (resultCode==102) {
Bundle backdata = data.getExtras(); //取得来自子窗口的数据模块
String backstr = backdata.getString("mykey2");
Log.v("窗口切换", "父窗口接收到子窗口:"+backstr);
}
}
}