Activity的启动与之间的信息传递
- 新建类Aty1继承自Activity,建立新layout布局文件aty1
- 在MainActivity,通过intent构造方法传入启动信息.
- 通过startActivity(intent)方法,启动活动.
官方文档 :
Create an intent for a specific component. All other fields (action, data,
type, class) are null, though they can be modified later with explicit
calls. This provides a convenient way to create an intent that is
intended to execute a hard-coded class name, rather than relying on the
system to find an appropriate class for you; see setComponent(android.content.ComponentName)
for more information on the repercussions of this.
第一个参数是上下文,通常指当前活动,第二个参数是要启动的活动.
例:在mainactivity利用一个按钮调用startActivity()方法启动新活动:
btnStaryAty1 = (Button) findViewById(R.id.statAty1);
btnStaryAty1.setOnClickListener(new View.OnClickListener() {`
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this,Aty1.class);
//数据......处理
startActivity(intent);
}
});
- 传递数据方法1:
调用intent.putExtra(“Key”,”“Value);传入数据
通过getIntent().getStringExtra(“Key”);获取相应Value字符串. - 传递数据方法2:
用Bundle传递
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this,Aty1.class); //Bundle数据处理
data.putString("Key","天马流星拳");
//intent 填入Bundle类型
intent.putExtras(data);
startActivity(intent);
}
});
}
获取:
通过Bundle data = getIntent().getExtras();
String value = data.getString(“Key”);获取字符串
Aty1设置:
//②获取Bundle
Bundle data = getIntent().getExtras();
tvout.setText(data.getString("Key"));
- 通过Activity返回值传回数据:
则不能用startActivity
引入一个方法startActivityForResult
官方文档 : public void startActivityForResult(Intent intent,int requestCode)
Launch an activity for which you would like a result when it finished. When this activity exits, your **onActivityResult(int requestCode, int resultCode, Intent data) **method will be called with the given requestCode. Using a negative requestCode is the same as calling startActivity(android.content.Intent) (the activity is not launched as a sub-activity).
大概意思是:当requestCode大于0作为参数传入并且启动活动之后,在活动结束之后会自动调用 onActivityResult(int requestCode, int resultCode, Intent data) 方法,你可以在这个方法中执行你要的操作.
注意requestCode的作用,参考这位老兄的博客: http://blog.youkuaiyun.com/jiangwei0910410003/article/details/16983049
假如一个活动有两个按钮,同样可以启动一个活动, requestCode可以用于区分不同按钮启动同一个活动并且做出不同处理.
@Override
public void onCreate(Bundle savedInstanceState) {
....
button1.setOnClickListener(newView.OnClickListener(){
public void onClick(View v) {
startActivityForResult (newIntent(MainActivity.this, NewActivity.class), 1);
}});
button2.setOnClickListener(newView.OnClickListener(){
public void onClick(View v) {
startActivityForResult (newIntent(MainActivity.this, NewActivity.class), 2);
}});
@Override protected voidonActivityResult(int requestCode, int resultCode, Intent data) {
switch(requestCode){
case 1:
//来自按钮1的请求,作相应业务处理
case 2:
//来自按钮2的请求,作相应业务处理
}
}
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this,Aty1.class);
//Bundle数据处理
data.putString("Key","天马流星拳");
//intent 填入Bundle类型
intent.putExtras(data);
startActivityForResult( intent , 7);
//参数2 requestCode 传给 onActivityResult区分不同启动对象
}
});
//处理Act1活动返回的数据
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
//通过Key获取值
String resultString = data.getStringExtra("Result_Key");
tvoutTextView.setText(resultString+"请求:"+ requestCode +"结果:" + resultCode);
super.onActivityResult(requestCode, resultCode, data);
}
在Act1 finish之前传入
Intent i = new Intent();
i.putExtra("Result_Key", "我来自Aty1,Hello 主活动");
setResult(0,i);
//参数1 resultCode,参数2 intent 传给 onActivityResult
finish(); //关闭当前方法
隐式intent与显示intent–参考blog(http://tompig.iteye.com/blog/1096603)
- 显式Intent定义:对于明确指出了目标组件名称的Intent,我们称之为显式Intent。
- 隐式Intent定义:对于没有明确指出目标组件名称的Intent,则称之为隐式Intent。
隐式Intent由于没有明确的目标组件名称,所以必须由Android系统帮助应用程序寻找与Intent请求意图最匹配的组件。
Android系统寻找与Intent请求意图最匹配的组件具体的选择方法是:Android将Intent的请求内容和一个叫做IntentFilter的过滤器比较,IntentFilter中包含系统中所有可能的待选组件。
如果IntentFilter中某一组件匹配隐式Intent请求的内容,那么Android就选择该组件作为该隐式Intent的目标组件。
Android如何知道应用程序能够处理某种类型的Intent请求呢?这需要应用程序在AndroidManifest.xml中声明自己所含组件的过滤器(即可以匹配哪些Intent请求)。
一个没有声明Intent-Filter的组件只能响应指明自己名字的显式Intent请求,而无法响应隐式Intent请求。
而一个声明了IntentFilter的组件既可以响应显式Intent请求,也可以响应隐式Intent请求。在通过和 IntentFilter比较来解析隐式Intent请求时,Android将以下三个因素作为选择的参考标准。