public class MainActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}

public void openActivity(View v){//这个按钮的点击注册事件
//打开新的Activity,可以明确指定打开哪个,就是显式意图,不指定哪个只是指定Action、Category、Data的由系统匹配的就是隐式意图。
Intent intent = new Intent(this, OtherActivity.class);//激活组件,显示意图:明确指定了组件名称的意图叫显示意图
//关于指定组件名称,还有很多写法
//1> intent.setClass(this, OtherActivity.class);//指定要激活的组件名称
//2> intent.setClassName(this, "cn.itcast.activitys.OtherActivity");
//3> intent.setComponent(new ComponentName(this, OtherActivity.class));
/*
intent.putExtra("company", "传智播客");
intent.putExtra("age", 5);
*/
Bundle bundle = new Bundle();
bundle.putString("company", "CSDN");
bundle.putInt("age", 11);
intent.putExtras(bundle);

//startActivity(intent);//不需要返回数据的

startActivityForResult(intent, 100);//需要返回数据的,onActivityResult中接收数据

}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
String result = data.getStringExtra("result");
Toast.makeText(getApplicationContext(),result, 1).show();

super.onActivityResult(requestCode, resultCode, data);
}


}


public class OtherActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.other);

TextView textView = (TextView) this.findViewById(R.id.textView);

Intent intent = getIntent();//获取用于激活它的意图对象
/* String company = intent.getStringExtra("company");
int age = intent.getIntExtra("age", 0);
*/
Bundle bundle = intent.getExtras();
String company = bundle.getString("company");
int age = bundle.getInt("age");

textView.setText("公司名称:"+ company+ ",年限:"+ age);
}

public void closeActivity(View v){
Intent intent = new Intent();
intent.putExtra("result", "老方与丽丽的故事,后面省略2000字");
setResult(20, intent);//设置返回数据
finish();//关闭Activity(关闭窗口)
}
}

组件就必须在AndroidManifest.xml中注册


Bundle的作用

Bundle类用作携带数据,它类似于Map,用于存放key-value名值对形式的值。相对于Map,它提供了各种常用类型的putXxx()/getXxx()方法,如:putString()/getString()putInt()/getInt()putXxx()用于往Bundle对象放入数据,getXxx()方法用于从Bundle对象里获取数据。Bundle的内部实际上是使用了HashMap<String,Object>类型的变量来存放putXxx()方法放入的值:

public final class Bundle implements Parcelable, Cloneable {

......

Map<String,Object> mMap;

public Bundle() {

mMap= new HashMap<String,Object>();

......

}

public void putString(String key, String value) {

mMap.put(key,value);

}

public String getString(String key) {

Objecto = mMap.get(key);

return (String) o;

........//类型转换失败后会返回null,这里省略了类型转换失败后的处理代码

}

}

在调用Bundle对象的getXxx()方法时,方法内部会从该变量中获取数据,然后对数据进行类型转换,转换成什么类型由方法的Xxx决定,getXxx()方法会把转换后的值返回。


Intent附加数据的两种写法

第一种写法用于批量添加数据到Intent

Intent intent = new Intent();

Bundle bundle = new Bundle();//该类用作携带数据

bundle.putString("name", "传智播客");

intent.putExtras(bundle);//为意图追加额外的数据,意图原来已经具有的数据不会丢失,但key同名的数据会被替换

第二种写法:这种写法的作用等价于上面的写法,只不过这种写法是把数据一个个地添加进Intent,这种写法使用起来比较方便,而且只需要编写少量的代码。

Intent intent = new Intent();

intent.putExtra("name", "传智播客");

Intent提供了各种常用类型重载后的putExtra()方法,如:putExtra(String name, String value)putExtra(String name, long value),在putExtra()方法内部会判断当前Intent对象内部是否已经存在一个Bundle对象,如果不存在就会新建Bundle对象,以后调用putExtra()方法传入的值都会存放于该Bundle对象,下面是IntentputExtra(String name, String value)方法代码片断:

public class Intent implementsParcelable {

private Bundle mExtras;

public Intent putExtra(String name, String value) {

if (mExtras== null) {

mExtras = new Bundle();

}

mExtras.putString(name, value);

return this;

}


Inflate由资源xml解析成View

1.获取LayoutInflater对象有三种方法

LayoutInflaterinflater=LayoutInflater.from(this);
LayoutInflaterinflater=getLayoutInflater();
LayoutInflaterinflater=(LayoutInflater)this.getSystemService(LAYOUT_INFLATER_SERVICE);

2.使用inflater或者View生成界面View

View.inflate



得到新打开Activity关闭后返回的数据

如果你想在Activity中得到新打开Activity关闭后返回的数据,你需要使用系统提供的startActivityForResult(Intent intent,int requestCode)方法打开新的Activity,新的Activity关闭后会向前面的Activity 传回数据,为了得到传回的数据,你必须在前面的Activity中重写onActivityResult(int requestCode, intresultCode, Intent data)方法:

publicclass MainActivity extends Activity {

@Override protectedvoid onCreate(Bundle savedInstanceState){

.......

Buttonbutton =(Button) this.findViewById(R.id.button);

button.setOnClickListener(new View.OnClickListener(){//点击该按钮会打开一个新的Activity

publicvoid onClick(View v) {

//第二个参数为请求码,可以根据业务需求自己编号

startActivityForResult (new Intent(MainActivity.this, NewActivity.class), 1);

}});

}

//第一个参数为请求码,即调用startActivityForResult()传递过去的值

//第二个参数为结果码,结果码用于标识返回数据来自哪个新Activity

@Override protected voidonActivityResult(int requestCode, int resultCode, Intent data) {

String result = data.getExtras().getString(“result”));//得到新Activity 关闭后返回的数据

}

} 当新Activity关闭后,新Activity返回的数据通过Intent进行传递,android平台会调用前面ActivityonActivityResult()方法,把存放了返回数据的Intent作为第三个输入参数传入,在onActivityResult()方法中使用第三个输入参数可以取出新Activity返回的数据。



使用startActivityForResult(Intent intent, intrequestCode)方法打开新的Activity,新Activity关闭前需要向前面的Activity返回数据需要使用系统提供的setResult(intresultCode, Intent data)方法实现:

public class NewActivityextendsActivity {

@Overrideprotected void onCreate(Bundle savedInstanceState) {

......

button.setOnClickListener(new View.OnClickListener(){

public void onClick(View v) {

Intentintent = new Intent();//数据是使用Intent返回

intent.putExtra(“result”, “传智播客的学生很可爱”);//把返回数据存入Intent

NewActivity.this.setResult(RESULT_OK,intent);//设置返回数据

NewActivity.this.finish();//关闭Activity

}});

}

}

setResult()方法的第一个参数值可以根据业务需要自己定义,上面代码中使用到的RESULT_OK是系统Activity类定义的一个常量值为-1,代码片断如下:

public class android.app.Activityextends......{

public static final int RESULT_CANCELED = 0;

public staticfinal intRESULT_OK = -1;

public static final int RESULT_FIRST_USER = 1;

}



请求码的作用请求来自哪儿?

使用startActivityForResult(Intent intent, intrequestCode)方法打开新的Activity,我们需要为startActivityForResult()方法传入一个请求码(第二个参数)。请求码的值是根据业务需要由自已设定,用于标识请求来源。例如:一个Activity有两个按钮,点击这两个按钮都会打开同一个Activity,不管是那个按钮打开新Activity,当这个新Activity关闭后,系统都会调用前面ActivityonActivityResult(intrequestCode, intresultCode, Intent data)方法。在onActivityResult()方法如果需要知道新Activity是由那个按钮打开的,并且要做出相应的业务处理,这时可以这样做:

@Overridepublic void onCreate(Bundle savedInstanceState) {

....

button1.setOnClickListener(new View.OnClickListener(){

public void onClick(Viewv) {

startActivityForResult (new Intent(MainActivity.this, NewActivity.class), 1);

}});

button2.setOnClickListener(new View.OnClickListener(){

public void onClick(Viewv) {

startActivityForResult (new Intent(MainActivity.this, NewActivity.class), 2);

}});

@Override protected void onActivityResult(intrequestCode, intresultCode, Intent data) {

switch(requestCode){

case 1:

//来自按钮1的请求,作相应业务处理

case 2:

//来自按钮2的请求,作相应业务处理

}

}

}


结果码的作用回复来自哪儿?

在一个Activity中,可能会使用startActivityForResult()方法打开多个不同的Activity处理不同的业务,当这些新Activity关闭后,系统都会调用前面ActivityonActivityResult(intrequestCode, intresultCode, Intent data)方法。为了知道返回的数据来自于哪个新Activity,在onActivityResult()方法中可以这样做(ResultActivityNewActivity为要打开的新Activity)

public class ResultActivity extends Activity {

.....

ResultActivity.this.setResult(1, intent);

ResultActivity.this.finish();

}

public class NewActivity extends Activity {

......

NewActivity.this.setResult(2, intent);

NewActivity.this.finish();

}

public class MainActivity extends Activity { // 在该Activity会打开ResultActivityNewActivity

@Override protected void onActivityResult(intrequestCode, intresultCode, Intent data) {

switch(resultCode){

case 1:

// ResultActivity的返回数据

case 2:

// NewActivity的返回数据

}

}

}


更多相关文章

  1. SpringBoot 2.0 中 HikariCP 数据库连接池原理解析
  2. 一句话锁定MySQL数据占用元凶
  3. 数据库查询多少条数据
  4. Android(安卓)之gson字符串转java bean
  5. Android(安卓)柱状图的实现 简单化的
  6. android 数据库查询记录
  7. listView采用vprogressDIalog加载数据
  8. Android的ViewPager,ViewPager配合Fragment的用法
  9. 使用Intent实现页面跳转 (另一种方法)

随机推荐

  1. android 屏幕截屏源码分享
  2. Android(安卓)获取存储空间
  3. Android仿iphone开关按钮
  4. Android(安卓)DOC文档分析——ContentPro
  5. ContentPRovider示例
  6. 自定义数据适配器
  7. Android(安卓)Studio 添加Assets目录
  8. android fragment addToBackStack bug
  9. 关于android API中的android.app.Pending
  10. android 按钮点击事件