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

来源:互联网 发布:网络机柜的尺寸 编辑:程序博客网 时间:2024/04/28 22:07

Activity的启动与之间的信息传递

  1. 新建类Aty1继承自Activity,建立新layout布局文件aty1
  2. 在MainActivity,通过intent构造方法传入启动信息.
  3. 通过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传递
@Overridepublic 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将以下三个因素作为选择的参考标准。

0 0