04 Activity窗口间的切换及参数的传递

来源:互联网 发布:上帝已死 知乎 编辑:程序博客网 时间:2024/05/29 18:00

在Android系统里,App间的通信和一个App内的Activity间的通信都是由Intent类对象来完成的. Android是一个高度中央集权制管理的系统, 基本上所有的操作都是向系统发出请求,由系统来完成的. 这种向系统的请求操作就是由Intent来实现.

Intent负责描述向系统请求操作的具体行为,涉及的参数及附带的数据等信息, Android系统根据Intent的描述信息作相应的操作。

Intent功能比较复杂, 其中用于Activity启动有两种方式:
1 显式启动的方式,即在创建Intent对象时,指定由当前的对象和要用于创建出对象的类. 然后用startActivity(Intent对象)来启动, 并可以启动前可用Intent的putExtras(..)设置要传递的参数

2 隐式启动的方式。 显式在启动时需要具体指定哪个类对象, 隐式启动只需指定一种系统操作, 至于这操体具体是由哪个类对象完成,这个不是由程序指定而是由系统及用户决定.
如实现需要打开www.baidu.com的页面, 至于使用哪个浏览器由系统决定:

  Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.baidu.com"));  startActivity(intent);


用显式启动的方式实现两个Activity窗口跳转,并传递参数:
1 MyActivity窗口作主窗口,窗口只有一个按钮”START OTHERACTIVITY”, 点击按钮后出现另一个窗口OtherActivity窗口。 在OtherActivity窗口上只有一个TextView,显示”this is other activity”及显示从主窗口接收到的参数

2 主窗口创建Intent对象,并在创建时指定使用当前窗口对象创建出OtherActivity窗口, 并在启动窗口前设置传送字符串参数。

       Intent intent = new Intent(MyActivity.this, OtherActivity.class);       intent.putExtra("what", "hello others"); //"what"是用于区分参数内容的关键字,接收时使用此关键接收相应的参数值       startActivity(intent); //根据Intent描述信息启动窗口

3 在OtherActivity窗口里获取参数值:

String str = this.getIntent().getStringExtra("what");

完整代码:

/* MyActivity.java */package com.example.jk.a01hello;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.LinearLayout;public class MyActivity extends Activity {    private Button btn;    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState); //调用父类的功能        LinearLayout hlayout;        hlayout = new LinearLayout(this);        hlayout.setOrientation(LinearLayout.HORIZONTAL);         btn = new Button(this);         btn.setText("start OtherActivity");         hlayout.addView(btn);         setContentView(hlayout);         btn.setOnClickListener(new View.OnClickListener() {             @Override             public void onClick(View view) {                 Intent intent = new Intent(MyActivity.this, OtherActivity.class);                 intent.putExtra("what", "hello others"); //"what"是用于区分参数内容的关键字,接收时使用此关键接收相应的参数值                 startActivity(intent);             }         });    }}
/* OtherActivity.java */package com.example.jk.a01hello;import android.app.Activity;import android.os.Bundle;import android.widget.LinearLayout;import android.widget.TextView;public class OtherActivity extends Activity {    private TextView  label;    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        String str = this.getIntent().getStringExtra("what");        LinearLayout layout = new LinearLayout(this);        layout.setOrientation(LinearLayout.VERTICAL);        label = new TextView(this);        label.setText("this is other activity : " + str);        layout.addView(label);        setContentView(layout);    }}

同时需要修改AndroidManifest.xml文件,声明两个Activity:

        <activity android:name=".MyActivity">            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>        <activity android:name=".OtherActivity">        </activity>




如需实现主窗口接收OtherActivity窗口的返回结果时,基于上面例子的更改:
MyActivity:
1 用startActivityForResult(intent, int requestCode)来启动Intent, requestCode用于区分接收多个启动窗口的返回结果

2 实现抽像函数void onActivityResult(int requestCode, int resultCode, Intent data), 当有启动窗口的返回结果时会自动触发此函数, 通过参数就可以得到具体的返回值

OtherActivity:
只要在窗口关闭前用setResult设置返回值即可


基于上面的例子修改,OtherActivity增加一个按钮, 点击按钮时设置返回结果,并关闭窗口.

/* MyActivity.java */package com.example.jk.a01hello;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.LinearLayout;public class MyActivity extends Activity {    private Button btn;    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState); //调用父类的功能        LinearLayout hlayout;        hlayout = new LinearLayout(this);        hlayout.setOrientation(LinearLayout.HORIZONTAL);         btn = new Button(this);         btn.setText("start OtherActivity");         hlayout.addView(btn);         setContentView(hlayout);         btn.setOnClickListener(new View.OnClickListener() {             @Override             public void onClick(View view) {                 Intent intent = new Intent(MyActivity.this, OtherActivity.class);                 intent.putExtra("what", "hello others"); //"what"是用于区分参数内容的关键字,接收时使用此关键接收相应的参数值                 startActivityForResult(intent, 77); // 77 为request_code             }         });    }    public void onActivityResult(int requestCode, int resultCode, Intent data) {            System.out.printf("requestCode:%d, resultCode:%d, data=%s\n", requestCode, resultCode, data.getStringExtra("return"));    }}
/* OtherActivity.java */package com.example.jk.a01hello;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.LinearLayout;import android.widget.TextView;public class OtherActivity extends Activity {    private TextView  label;    private Button btn;    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        String str = this.getIntent().getStringExtra("what");        LinearLayout layout = new LinearLayout(this);        layout.setOrientation(LinearLayout.VERTICAL);        label = new TextView(this);        label.setText("this is other activity : " + str);        btn = new Button(this);        btn.setText("close");        btn.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                setResult(RESULT_OK, new Intent().putExtra("return", "returning string"));                finish();            }        });        layout.addView(label);        layout.addView(btn);        setContentView(layout);    }}
原创粉丝点击