您的位置:首页 > 移动开发 > Android开发

android基础笔记----Activity的启动与之间的信息传递

2016-09-24 18:03 633 查看

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.csdn.net/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将以下三个因素作为选择的参考标准。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: