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

在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);
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值