Android--Intent组件带参传递与返回

Posted 雲淡、風輕

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android--Intent组件带参传递与返回相关的知识,希望对你有一定的参考价值。

Android 是 单例模式:

  表示 application 唯一的。每个应用被启动的时候,其实是 application 被创建。

 

Context 上下文:

  context 是 Application 和 activity 的父类。很多方法中,传递的都是上下文,而不是具体的 Activity 或者 Application。

 

AndroidManifest.xml :

  每一个 activity 都必须在 androidManifest.xml 中配置。否则出现 ActivityNotFound 异常。

 

  常用主题:

    默   认:    @android:style/Theme.Holo.Light.DarkActionBar

    启动页: @android:style/Theme.Holo.Light.NoActionBar.Fullscreen 

    窗体化: @android:style/Theme.Holo.Light.Dialog

 

      exported :可以被其他应用程序访问。

      launchMode :启动模式

        &&  lable 决定应用程序桌面的名称, icon 决定应用程序图标。 activity 中的属性设置 会覆盖 application 中的属性。

 

Activity 的生命周期:

   onCreate  -->  onStart  -->  onResume      正常运行期 (又称 “可见期 ”、“ 聚焦期 ”)

   onPause   -->  暂停期  (“ 失焦期 ”):指 activity 被覆盖了一部分 (或者 有透明窗体中上面 ) ,准备退出时执行。

   onStop   -->  停止期  : 指 activity 完全看不到了

   onDestory  -->  activity 已经被销毁

      &&  onRestart  -->   从 onPause 回到 onResume  或者  从 onStop  回到  onStart

      &&  想要在 创建 时 销毁,只需要在 onCreate 方法中调用 onDestory

              

 

 

创建一个Activity:

   1、新建 java 类 --> 继承 Activity

   2、重写 onCreate 方法, 加载布局 (setContentView)

   3、在androidManifest 中注册该 activity

     &&  finish()  关闭一个activity 。

 

onBackPressed() :

   -- 当 activity 中 返回键 被按下时调用该方法。

     例如: 双击退出当前页面, 代码如下:

long lastTime = 0;
        if (System.currentTimeMillis() - lastTime < 2000) {
            finish();
        } else {
            Toast.makeText(this, "再按一次推出", Toast.LENGTH_SHORT).show();
            lastTime = System.currentTimeMillis();
        }
//思路: 当前系统时间 - 按返回键时的系统时间,若间隔小于两秒,退出。

 

 

监听事件:

   每个组件 都有 监听事件。

   View有 三个监听器:

    1、onClickListener 点击事件

    2、onLongClickListener  长按事件

    3、onTouchListener  触摸监听

 

 

 

Activity 带参跳转 :

    Bundle: 专门用来携带数据的一个类,里面可以存放各种基本数据类型 和 序列化 的对象。

    Intent : intent 有一个 Bundle 的成员变量, 所有数据实际存放在 Bundle。

    所以,Intent 可以传递 (put) 的数据类型有: 8种基本数据类型 及其 数组、String 和 String数组、两种序列化对象 Serializable 、Parcelable

  

  例子,代码如下:

  // 第一个页面

public class MainActivity extends Activity implements OnClickListener {

    private EditText et_user, et_pwd;
    private Button btn_login;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        init();
    }

    private void init() {
        et_user = (EditText) findViewById(R.id.et_user);
        et_pwd = (EditText) findViewById(R.id.et_pwd);
        btn_login = (Button) findViewById(R.id.btn_login);

        btn_login.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {

        Intent intent = new Intent(MainActivity.this, MainActivity2.class);

        String name = et_user.getText().toString();
        String password = et_pwd.getText().toString();
        
        intent.putExtra("username", name);
        intent.putExtra("password", password);
        // 传递基本数据类型
        intent.putExtra("name", "张三");
        intent.putExtra("age", 50);

        // 传递ArrayList数组
        ArrayList<String> list = new ArrayList<String>();
        list.add("中国");
        list.add("广东");
        list.add("深圳");
        list.add("南山");
        intent.putStringArrayListExtra("list", list);

        // 传递 User类型的对象 必须是 序列化对象
        User user = new User("李四", "123456");
        intent.putExtra("user", user);

        // 传递 一组User类型的对象,用ArrayList装载
        ArrayList<User> userList = new ArrayList<User>();
        userList.add(new User("王五", "000000"));
        userList.add(new User("赵六", "111111"));
        userList.add(new User("田七", "222222"));
        userList.add(new User("王八", "333333"));
        intent.putExtra("userList", userList);

        startActivity(intent);
    }
}

 

  // 第二个页面

public class MainActivity2 extends Activity implements OnClickListener {

    private TextView tv_userName, tv_password, tv_list, tv_user, tv_userLiset,
            tv_zhangsan, tv_choose, tv_choose2;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity2_main);
        init();
        show();
    }
    private void show() {
        // 获取Intent 中传递的数据 getIntent()
        Intent intent = getIntent();
        String username = intent.getStringExtra("username");
        String password = intent.getStringExtra("password");

        String name = intent.getStringExtra("name");
        int age = intent.getIntExtra("age", 1);

        // 接收ArrayList数组  getStringArrayListExtra()
        ArrayList<String> list = intent.getStringArrayListExtra("list");

        // 接收序列化对象 getSerializableExtra()
        User user = (User) intent.getSerializableExtra("user");

        @SuppressWarnings("unchecked")
        // 接收 序列化 数组对象 getSerializableExtra()
        ArrayList<User> userList = (ArrayList<User>) intent
                .getSerializableExtra("userList");

        // 将获取到的数据 设置到相应的 组件上
        tv_userName.setText(username);
        tv_password.setText(password);
        tv_zhangsan.setText(name + "  " + age);
        tv_list.setText(list.toString());
        System.out.println(list);
        tv_user.setText(user.toString());
        tv_userLiset.setText(userList.toString());
    }

    private void init() {
        tv_userName = (TextView) findViewById(R.id.username);
        tv_password = (TextView) findViewById(R.id.password);
        tv_list = (TextView) findViewById(R.id.list);
        tv_user = (TextView) findViewById(R.id.user);
        tv_userLiset = (TextView) findViewById(R.id.userlist);
        tv_zhangsan = (TextView) findViewById(R.id.zhangsan);
        tv_choose = (TextView) findViewById(R.id.tv_choose);
        tv_choose2 = (TextView) findViewById(R.id.tv_choose2);
    }
}

 

 

重点方法 摘要:

    intent.put(key,value);    -- put 方法,根据所传类型的不同,调用不同的传递方法。如: putStringArrayListExtra

    getIntent(); -- get 方法, 根据所获取的数据类型,选用不同的方法。如: getStringArrayListExtra 、getSerializableExtra

 

 

 

Activity 带参返回:

    启动方法为 : startActivityForResult(intent,requestCode);   -- requestCode,请求识别码

    需要重写 Activity 的 onActivityResult 的方法来接收 返回数据

    在返回数据的页面中 调用 setResult(resultCode,data);  -- resultCode 结果识别码, data 返回的数据,同样以 Intent 传递

 

  例子,代码如下:

  // 接收页面部分代码(第一个页面)

@Override
    public void onClick(View v) {
        if (v.getId() == R.id.btn_car) {
            Intent intent = new Intent(MainActivity2.this,BrandMainActivity.class);
            // 特殊的启动方法  startActivityForResult
            startActivityForResult(intent, BRAND_RESULT_CODE);
        }
    }
    
    //需要重写的方法 onActivityResult --用于接收数据  requestCode 请求码, resultCode 结果码, data Intent传递的数据
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(requestCode == BRAND_RESULT_CODE){
            if(resultCode == RESULT_OK){
                String brand = data.getStringExtra("result");
                tv_choose.setText(brand);
            }
        }
    }

 

  // 返回数据页面部分代码(第二个页面)

Intent intent = new Intent();
        // intent 依旧传递数据 put方法 ,区别在于,不需要指定页面跳转 如:Intent intent = new Intent(MainActivity.this, MainActivity2.class);
        intent.putExtra("result", result);
        // 返回结果的特殊方法 setResult  
        setResult(RESULT_OK, intent);
        // 必须调用该方法,结束当前页面
        finish();

 

重点方法 摘要:

   startActivityForResult   -- 特殊的启动方法

   onActivityResult   -- 接收返回数据 所 需要重写的 方法

   setResult   -- 将数据 返回 的特殊方法

 

 

反射:

   通过 for循环  反射 来获取对象。  (只是简化我们的代码,实际效率比普通方法低) 

   可以减少 findViewById 、 setOnClickListener 等方法的次数。 

 

   代码如下: 

// 使用反射来关联对象
    TextView[] subject = new TextView[10];

// 反射方式获取组件
    private void reflectFindViewById() {
        for (int i = 0; i <= subject.length; i++) {
            try {
                // 反射的反射 获取 R 文件中的 .class文件 ,返回Int值
                int id = R.id.class.getField("tv_subject_" + (i+1)).getInt(null);
                subject[i] = (TextView) findViewById(id);
                subject[i].setOnClickListener(this);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

  // 普通方法  代码如下:

// 普通的方法获取组件
    private void NomfindViewById() {
         subject[0] = (TextView) findViewById(R.id.tv_subject_1);
         subject[1] = (TextView) findViewById(R.id.tv_subject_2);
         subject[2] = (TextView) findViewById(R.id.tv_subject_3);
         subject[3] = (TextView) findViewById(R.id.tv_subject_4);
         subject[4] = (TextView) findViewById(R.id.tv_subject_5);
         subject[6] = (TextView) findViewById(R.id.tv_subject_6);
         subject[7] = (TextView) findViewById(R.id.tv_subject_7);
         subject[8] = (TextView) findViewById(R.id.tv_subject_8);
         subject[9] = (TextView) findViewById(R.id.tv_subject_9);
         subject[10] = (TextView) findViewById(R.id.tv_subject_10);
         subject[0].setOnClickListener(this);
         subject[1].setOnClickListener(this);
         subject[2].setOnClickListener(this);
         subject[3].setOnClickListener(this);
         subject[4].setOnClickListener(this);
         subject[5].setOnClickListener(this);
         subject[6].setOnClickListener(this);
         subject[7].setOnClickListener(this);
         subject[8].setOnClickListener(this);
         subject[9].setOnClickListener(this);
         subject[10].setOnClickListener(this);
    }

 

  &&  注意: 组件 ID 必须要 有序     --   R.id.class.getField().getInt()

 

以上是关于Android--Intent组件带参传递与返回的主要内容,如果未能解决你的问题,请参考以下文章

Android--Intent(意图)

[Android]Intent的使用

Android(Intent 学习)

11) 十分钟学会android--Intent消息处理与传递详解

Android Intent详解

Android Intent基本使用