Android入门之Activity间互相传值详解

目录
  • 介绍
  • Android中的传值
  • 课程目标
  • 全代码
    • 前端
    • 后端代码
  • 附、工程结构

介绍

今天的课程会比较好玩,我们在之前的Service篇章中看到了一种putExtras和getExtras来进行activity与service间的传值。而恰恰这种传值其实也是Android里的通用传值法。它同样可以适用在activity与activity间传值。

Android中的传值

传单个值

传多个值

具体我们来结合例子来看吧

课程目标

正向传值到下一个activity上

反向传值到调用activity上

  • 正向传值用:Intent+Bundle传值;
  • 反向传值我们使用:registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {回调,并判断这个result.getResultCode();
  • 同时,我们制作了一个ActivityCollector extends Application来注册所有打开的activity,然后通过这个控制类来实现一键关闭所有打开的activity;

来看代码实现吧

全代码

前端

表格控制中用到的item_list.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="5dp">

    <ImageView
        android:id="@+id/iconImg"
        android:layout_width="64dp"
        android:layout_height="64dp"
        android:layout_centerInParent="true"
        android:src="@drawable/icon_1_128"
        />

    <TextView
        android:id="@+id/iconText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/iconImg"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="30dp"
        android:text="text"
        android:textSize="18sp"
        />

</RelativeLayout>

表格控制用到的GenericAdapter(这个在我们之前讲Adapter的篇章中已经写过)

package org.mk.android.demo;

import android.content.Context;
import android.util.Log;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;

public abstract class
GenericAdapter <T> extends BaseAdapter {
    private List<T> data;
    private int layoutRes;

    public GenericAdapter() {
    }

    public GenericAdapter(List<T> data, int layoutRes) {
        this.data = data;
        this.layoutRes = layoutRes;
    }

    @Override
    public int getCount() {
        Log.i("app",">>>>>>data.size: "+data.size());
        if(data!=null) {
            return data.size();
        }
        return 0;
    }

    @Override
    public T getItem(int position) {
        return data.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        Log.i("app",">>>>>>into getView");
        ViewHolder holder = ViewHolder.bind(parent.getContext(), convertView, parent, layoutRes
                , position);
        bindView(holder, getItem(position));
        return holder.getItemView();
    }

    //添加一个元素
    public void add(T item) {
        if (data == null) {
            data = new ArrayList<>();
        }
        data.add(item);
        notifyDataSetChanged();
    }

    //往特定位置,添加一个元素
    public void add(int position,T item){
        if (data == null) {
            data = new ArrayList<>();
        }
        data.add(position, item);
        notifyDataSetChanged();
    }

    public void remove(T item) {
        if(data != null) {
            data.remove(item);
        }
        notifyDataSetChanged();
    }

    public void remove(int position) {
        if(data != null) {
            data.remove(position);
        }
        notifyDataSetChanged();
    }

    public void clear() {
        if(data != null) {
            data.clear();
        }
        notifyDataSetChanged();
    }

    public abstract void bindView(ViewHolder holder, T obj);

    public static class ViewHolder {

        private SparseArray<View> mViews;   //存储ListView 的 item中的View
        private View item;                  //存放convertView
        private int position;               //游标
        private Context context;            //Context上下文

        //构造方法,完成相关初始化
        private ViewHolder(Context context, ViewGroup parent, int layoutRes) {
            mViews = new SparseArray<>();
            this.context = context;
            View convertView = LayoutInflater.from(context).inflate(layoutRes, parent,false);
            convertView.setTag(this);
            item = convertView;
        }
        public static ViewHolder bind(Context context, View convertView, ViewGroup parent,
                                      int layoutRes, int position) {
            ViewHolder holder;
            if(convertView == null) {
                holder = new ViewHolder(context, parent, layoutRes);
            } else {
                holder = (ViewHolder) convertView.getTag();
                holder.item = convertView;
            }
            holder.position = position;
            return holder;
        }
        public <T extends View> T getView(int id) {
            T t = (T) mViews.get(id);
            if(t == null) {
                t = (T) item.findViewById(id);
                mViews.put(id, t);
            }
            return t;
        }
        /**
         * 获取当前条目
         */
        public View getItemView() {
            return item;
        }

        /**
         * 获取条目位置
         */
        public int getItemPosition() {
            return position;
        }

        /**
         * 设置文字
         */
        public ViewHolder setText(int id, CharSequence text) {
            View view = getView(id);
            if(view instanceof TextView) {
                ((TextView) view).setText(text);
            }
            return this;
        }

        /**
         * 设置图片
         */
        public ViewHolder setImageResource(int id, int drawableRes) {
            View view = getView(id);
            if(view instanceof ImageView) {
                ((ImageView) view).setImageResource(drawableRes);
            } else {
                view.setBackgroundResource(drawableRes);
            }
            return this;
        }

        /**
         * 设置标签
         */
        public ViewHolder setTag(int id, Object obj) {
            getView(id).setTag(obj);
            return this;
        }

        public ImageView iconImg;
        public TextView iconText;
    }
}

activity_home_page.xml文件

  • activity_main.xml文件里点击【注册】按钮跳到activity_home_page.xml文件。
  • 然后把activity_main.xml文件中的内容显示在activity_home_page.xml的toast中。
  • 在activity_home_page.xml文件中选择一个图标后返回activity_main.xml,并显示用户选择的内容;
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="5dp"
    tools:context=".HomePageActivity">
    <!--numColumns设置每行显示多少个-->
    <GridView
        android:id="@+id/gridPhoto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:numColumns="3" />
</RelativeLayout>

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

    <TableRow>

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="请输入注册信息:"
            android:textSize="18dp" />
    </TableRow>

    <TableRow>

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="用户名:"
            android:textSize="18dp" />

        <EditText
            android:id="@+id/edTextLoginName"
            android:layout_width="200dp"
            android:layout_height="wrap_content"
            android:inputType="text"
            android:text="" />
    </TableRow>

    <TableRow>

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center_vertical"
            android:text="性别:"
            android:textSize="18dp" />

        <RadioGroup
            android:id="@+id/rgGroup"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center_vertical"

            android:orientation="horizontal">

            <RadioButton
                android:id="@+id/radioMan"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:layout_marginRight="30dip"
                android:text="男性" />

            <RadioButton
                android:id="@+id/radioWoman"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="女性" />
        </RadioGroup>
    </TableRow>

    <TableRow>

        <Button
            android:id="@+id/buttonRegister"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_span="2"
            android:text="注册"
            android:textSize="18dp" />
    </TableRow>

    <TableRow>

        <ImageView
            android:id="@+id/selectedImg"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_span="2" />
    </TableRow>
</TableLayout>

后端代码

ActivityCollector

用于收集和一键关闭所有打开的Activity用

package org.mk.android.demo;

import android.app.Activity;
import android.app.Application;
import android.util.Log;

import java.util.LinkedList;
import java.util.List;

public class ActivityCollector extends Application {
    //运用list来保存们每一个activity是关键
    private List<Activity> mList = new LinkedList<Activity>();
    //为了实现每次使用该类时不创建新的对象而创建的静态对象
    private static ActivityCollector instance;

    //构造方法
    private ActivityCollector() {
    }

    //实例化一次
    public synchronized static ActivityCollector getInstance() {
        if (null == instance) {
            instance = new ActivityCollector();
        }
        return instance;
    }

    //addActivity
    public void addActivity(Activity activity) {
        mList.add(activity);
    }

    //removeOneActivity
    public void removeActivity(Activity activity) {
        mList.remove(activity);
    }

    //关闭每一个list内的activity
    public void exit() {
        try {
            if (mList != null && mList.size() > 0) {
                Log.i("app", ">>>>>>activity size->" + mList.size());
                for (Activity activity : mList) {
                    if (activity != null)
                        Log.i("app", ">>>>>>remove activity...");
                    activity.finish();
                }
            } else {
                Log.i("app", ">>>>>>there is no activity need to be closed!");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            System.exit(0);
        }
    }

    //杀进程
    public void onLowMemory() {
        super.onLowMemory();
        System.gc();
    }
}

IconBean.java

package org.mk.android.demo;

import java.io.Serializable;

public class IconBean implements Serializable {
    public IconBean(int imgId, String iconText) {
        this.imgId = imgId;
        this.iconText = iconText;
    }

    private int imgId;
    private String iconText = "";

    public int getImgId() {
        return imgId;
    }

    public void setImgId(int imgId) {
        this.imgId = imgId;
    }

    public String getIconText() {
        return iconText;
    }

    public void setIconText(String iconText) {
        this.iconText = iconText;
    }
}

HomePageActivity.java

package org.mk.android.demo;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;

public class HomePageActivity extends AppCompatActivity {

    private String loginName;
    private int gender;
    private Context ctx;
    private GridView gridPhoto;
    private BaseAdapter adapter = null;
    private List<IconBean> data = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home_page);
        ActivityCollector.getInstance().addActivity(this);
        Intent it = getIntent();
        Bundle bd = it.getExtras();
        loginName = bd.getString("loginName");
        gender = bd.getInt("gender");
        Toast.makeText(HomePageActivity.this, "当前输入内容,性别:" + gender + " 登录名:" + loginName, Toast.LENGTH_LONG).show();

        gridPhoto = (GridView) findViewById(R.id.gridPhoto);

        data = new ArrayList<IconBean>();
        data.add(new IconBean(R.drawable.icon_1_128, "星爸爸"));
        data.add(new IconBean(R.drawable.icon_2_128, "金拱门"));
        data.add(new IconBean(R.drawable.icon_3_128, "机器人"));
        data.add(new IconBean(R.drawable.icon_4_128, "小企鹅"));
        data.add(new IconBean(R.drawable.icon_5_128, "凯瑞肯"));
        data.add(new IconBean(R.drawable.icon_6_128, "小肥皂"));
        data.add(new IconBean(R.drawable.icon_7_128, "流浪者"));
        adapter = new GenericAdapter<IconBean>(data, R.layout.item_list) {
            @Override
            public void bindView(ViewHolder holder, IconBean obj) {
                holder.setImageResource(R.id.iconImg, obj.getImgId());
                holder.setText(R.id.iconText, obj.getIconText());
            }
        };
        gridPhoto.setAdapter(adapter);
        gridPhoto.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Intent it = getIntent();
                Bundle bd = new Bundle();
                bd.putInt("selectedId",data.get(position).getImgId());
                bd.putString("selectedText",data.get(position).getIconText());
                it.putExtras(bd);
                setResult(101,it);
                finish();
            }
        });
    }
    @Override
    protected void onDestroy(){
        super.onDestroy();
        ActivityCollector.getInstance().removeActivity(this);
    }
}

MainActivity.java

package org.mk.android.demo;

import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.appcompat.app.AppCompatActivity;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.Toast;

import java.util.LinkedList;

public class MainActivity extends AppCompatActivity {

    private Button buttonRegister;
    private RadioGroup genderRG;
    private EditText edTextLoginName;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ActivityCollector.getInstance().addActivity(this);
        buttonRegister = (Button) findViewById(R.id.buttonRegister);
        genderRG = (RadioGroup) findViewById(R.id.rgGroup);
        edTextLoginName = (EditText) findViewById(R.id.edTextLoginName);
        buttonRegister.setOnClickListener(new OnClickListener());
    }

    @Override
    protected void onDestroy(){
        super.onDestroy();
        ActivityCollector.getInstance().exit();
    }

    //下面这段是配合着老式的startActivityForResult(homeIt,101);的写法,当我们用了registerForActivityResult
    //下面这种onActivityResult就不需要写了。
    //@Override
    //protected void onActivityResult(int requestCode, int resultCode,
    //        Intent data) {
    //    super.onActivityResult(requestCode, resultCode, data);
    //    if (requestCode == 101 && resultCode == 101) {
    //        Bundle bd = data.getExtras();
    //        int imgid = bd.getInt("selectedId");
    //        String selectedContent = bd.getString("selectedText");
    //        ImageView img = (ImageView) findViewById(R.id.selectedImg);
    //        img.setImageResource(imgid);
    //        Toast.makeText(MainActivity.this, "你刚才选择的是:" + selectedContent,
    //        Toast.LENGTH_LONG).show();
    //    }
    //}

    private ActivityResultLauncher launcher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
        if (result.getResultCode() == 101) {
            Bundle bd = result.getData().getExtras();
            int imgid = bd.getInt("selectedId");
            String selectedContent = bd.getString("selectedText");
            ImageView img = (ImageView) findViewById(R.id.selectedImg);
            img.setImageResource(imgid);
            Toast.makeText(MainActivity.this, "你刚才选择的是:" + selectedContent, Toast.LENGTH_LONG).show();
        }
    });

    private class OnClickListener implements View.OnClickListener {
        private int gender = -1;
        private String loginName = "";

        @Override
        public void onClick(View v) {
            for (int i = 0; i < genderRG.getChildCount(); i++) {
                RadioButton rb = (RadioButton) genderRG.getChildAt(i);
                if (rb.isChecked()) {
                    switch (i) {
                        case 0:
                            gender = 0;
                            break;
                        case 1:
                            gender = 1;
                            break;
                    }
                    break;
                }
            }
            loginName = edTextLoginName.getText().toString();
            //Toast.makeText(MainActivity.this, "当前输入内容,性别:" + gender + "
            // 登录名: " + loginName, Toast.LENGTH_SHORT).show();
            Log.i("app", "当前输入内容,性别:" + gender + " 登录名:" + loginName);
            transferToHomePage(loginName, gender);
        }

        private void transferToHomePage(String loginName, int gender) {
            Intent homeIt = new Intent(MainActivity.this, HomePageActivity.class);
            Bundle bd = new Bundle();
            bd.putString("loginName", loginName);
            bd.putInt("gender", gender);
            homeIt.putExtras(bd);
            //startActivity(homeIt);
            //startActivityForResult(homeIt,101);
            // 这种写法已经废弃用新的registerForActivityResult会非常优雅且不用去覆盖onActivityResult
            launcher.launch(homeIt);
        }
    }
}

传递值到子activity-HomePageActivity里使用putExtras自然没得话说。关键在于我们运行sub activity的launcher.launch(homeIt);方法。这个方法通过一个registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result ->来判断当子activity返回即调用了finish()生命周期后,可以得到子activity在finish()语句前setResult(101,it);中的内容即实现了子activity中的值回传上一层activity了。

自己请动一下手试试看吧。

附、工程结构

到此这篇关于Android入门之Activity间互相传值详解的文章就介绍到这了,更多相关Android Activity互相传值内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Android 中两个Activity 之间的传值问题

    Android 中两个Activity 之间的传值问题 在Android项目中,有时需要一些全局的静态变量来保存一些数据,这样在关闭赋值界面后,其他的页面还可以调用这些数据. 但是我们知道,在Java中全局静态变量(java中没有全局变量这一个概念,但是java提供了public static关键字来实现一些类似于全局变量的关键字)都是在程序加载时就放人到内存中,它是存储在方法区里的.如果程序不结束,它将一直存在.这是会影响到系统的性能的.那么在android中可不可以不通过这种方式来传递值呢?

  • Android开发两个activity之间传值示例详解

    目录 使用Inten的putExtra传递 使用Intention的Bundle传递 使用Activity销毁时传递数据 SharedPreferences传递数据 使用序列化对象Seriazable 使用静态变量传递数据 handler 使用Inten的putExtra传递 第一个Activity中 //创建意图对象 Intent intent = new Intent(this,MainActivity2.class); //设置传递键值对 intent.putExtra("name&quo

  • Android学习笔记--使用剪切板在Activity中传值示例代码

    在Activity之间传递数据还可以利用一些技巧,不管windows还是Linux操作系统,都会支持一种叫剪切板的技术,也就是某一个程序将一些数据复制到剪切板上,然后其他的任何程序都可以从剪切板中获取数据,在Android系统中也存在此技术. 使用剪切板会用到,ClipboardManager对象,这个对用剪切板会用到,ClipboardManager象用来操作剪切板,但是没有提供public的构造函数(单例模式),需要使用Activity.getSystemService(Context.CL

  • Android 多个Activity之间的传值

    下面是主Activity的代码: 开发:Activity之间的传值 - 51CTO.COM 复制代码 代码如下: package com.chaoyang.activity; import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.text.style.BulletSpan;import android.view.View;import android.wi

  • Android入门之Activity间互相传值详解

    目录 介绍 Android中的传值 课程目标 全代码 前端 后端代码 附.工程结构 介绍 今天的课程会比较好玩,我们在之前的Service篇章中看到了一种putExtras和getExtras来进行activity与service间的传值.而恰恰这种传值其实也是Android里的通用传值法.它同样可以适用在activity与activity间传值. Android中的传值 传单个值 传多个值 具体我们来结合例子来看吧 课程目标 正向传值到下一个activity上 反向传值到调用activity上

  • Android入门之Handler的使用教程详解

    目录 简介 项目结构 代码 前端 后端 简介 我们在前面的Android教程中已经提到过这么一件事:Android在启动后会有一个主线程.它不允许任何子线程去改变主UI线程里的内容. 这么做是为了妨止,万一有一个带有大事务的线程导致了渲染组件时间过长最终导致Android UI出现“闪退”.“崩溃”的保护机制. 而实际我们在Android操作里的确是会有一些“耗时”的事情而采用异步线程,如:首页打开时调用第三方地图定位API.调用第三方银行API来显示你的余额.调用第三方社保显示你的当前社保缴纳

  • Android入门之使用SharedPreference存取信息详解

    目录 简介 SharedPreference原理 SharedPreference的存储 后端代码 SharedPreferenceHelper.java HomePage.java MainActivity.java 简介 上一篇我们介绍了在android里如何读写本地文件.我们有一种场景,类似网页的cookie,要把用户的一些储如上一次登录.使用的痕迹等信息保存下来以便于每次不需要做重复“填表单”的操作,当在这种场景下我们如果也使用本地文件读写的话显然是“太重”了.因此android提供了一

  • Android开发之activity的生命周期详解

    本文实例讲述了Android activity的生命周期.分享给大家供大家参考,具体如下: activity类处于android.app包中,继承体系如下: 1.Java.lang.Object 2.android.content.Context 3.android.app.ApplicationContext 4.android.app.Activity activity是单独的,用于处理用户操作.几乎所有的activity都要和用户打交道,所以activity类创建了一个窗口,开发人员可以通

  • Android Activity的跳转与传值详解

    Android Activity的跳转与传值详解 Activity跳转与传值,主要是通过Intent类来连接多个Activity,以及传递数据. Intent是Android一个很重要的类.Intent直译是"意图",什么是意图呢?比如你想从这个Activity跳转到另外一个Activity,这就是一个意图.Intent类在Android系统中的作用很大,在此不详细说了,后面有文章介绍! Activity跳转,无返回结果 这是最简单的Activity跳转方式.从一个Activity启动

  • Android入门教程之组件Activity的生命周期详解

    目录 返回栈 Activity 状态 1. 运行状态 2. 暂停状态 3. 停止状态 4. 销毁状态 Activity 的生存期 onCreate() onStart() onResume() onPause() onStop() onDestroy() onRestart() 完整生存期 可见生存期 前台生存期 Activity 回收处理 返回栈 Android 中的 Activity 是可以层叠的,我们每启动一个新的 Activity,就会覆盖在原有的 Activity 之上,然后点击 Ba

  • Android入门之Activity四种启动模式(standard、singleTop、singleTask、singleInstance)

    当应用运行起来后就会开启一条线程,线程中会运行一个任务栈,当Activity实例创建后就会放入任务栈中.Activity启动模式的设置在AndroidManifest.xml文件中,通过配置Activity的属性android:launchMode=""设置. 一.启动模式介绍 启动模式简单地说就是Activity启动时的策略,在AndroidManifest.xml中的标签的android:launchMode属性设置: 启动模式有4种,分别为standard.singleTop.s

  • Android开发Activity的生命周期详解

    目录 前言 典型情况下的生命周期分析 前言 Android生命周期分为两部分: (1)典型情况下的生命周期. (2)异常情况下的生命周期. 典型情况下的生命周期分析 图1 Activity的生命周期图解 图2 Activity生命周期的金字塔图 (1)典型情况下的生命周期指在有用户参与的情况下,Activity所经过的生命周期的改变,正常情况下,Activity的常用生命周期有以下几种情况: onCreate():Activity启动后第一个被调用的函数,常用来进行Activity的初始化,如创

  • Android开发使用HttpURLConnection进行网络编程详解【附源码下载】

    本文实例讲述了Android开发使用HttpURLConnection进行网络编程.分享给大家供大家参考,具体如下: --HttpURLConnection URLConnection已经可以非常方便地与指定站点交换信息,URLConnection下还有一个子类:HttpURLConnection,HttpURLConnection在URLConnection的基础上进行改进,增加了一些用于操作HTTP资源的便捷方法. setRequestMethod(String):设置发送请求的方法 get

  • Android开发使用URLConnection进行网络编程详解

    本文实例讲述了Android开发使用URLConnection进行网络编程.分享给大家供大家参考,具体如下: URL的openConnection()方法将返回一个URLConnection,该对象表示应用程序和URL之间的通信连接,程序可以通过URLConnection实例向该URL发送请求,读取URL引用的资源.通常创建一个和URL的连接,并发送请求,读取此URL引用的资源. 需要如下步骤: a)通过调用URL对象openConnection()方法来创建URLConnection对象 b)

随机推荐