zoukankan      html  css  js  c++  java
  • Android 中的 Intent 简介

    Intent是Android程序中各组件之间进行交互的一种重要方式,它不仅可以指明当前组件想要执行的动作,还可以在不同组件之间传递数据。

    -----------------------------------------------显示Intent------------------------------------------------

    Intent有多个构造器函数的重载,其中一个是Intent( Context packageContent , Class<?>cls )

    第一个参数Context要求提供一个启动活动的上下文,第二个参数class则是指定想要启动的目标活动。

     Intent intent = new Intent(FirstActivity.this,SecondActivity.class);

    通过Intent的构造函数可以构建出Intent的意图。

    Activity类中提供了一个startActivity()方法,这个方法是专门用于启动活动的,它接收一个Intent参数。

     startActivity(intent);

    将构建好的Intent传入startActivity()方法就可以启动目标活动了。

    修改FirstActivity中按钮的点击事件,代码如下:

      button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
                    startActivity(intent);
                }
            });

    如果你想回到上一个活动中,按下Back键就可以销毁当前活动,从而返回到上一个活动(或者显示调用finish()方法销毁活动)

    -----------------------------------------隐式Intent---------------------------------------------------

    相比于显示Intent,隐式Intent并不明确指定启动某一个活动,而是指定了一系列更为抽象的action和category信息,

    然后交由系统去分析这个Intent并帮助我们找出合适的活动去启动。

    首先通过在<activity>标签下配置<intent-filter>的内容,可以指定当前活动能够响应的action和category。

    向AndroidManifest.xml中的<application>元素下添加:

            <activity android:name=".ThirdActivity">
                <intent-filter>
                    <action android:name="com.example.activitytest.ACTION_START" />
                    <category android:name="android.intent.category.DEFAULT" />
                    <category android:name="com.example.activitytest.MY_CATEGORY" />
                </intent-filter>
            </activity>

    只有<action>和<category>中的内容同时能够匹配上Intent中指定的action和category时,这个活动才能响应该Intent。

    否则程序抛出: android.content.ActivityNotFoundException: No Activity found to handle Intent

                public void onClick(View v) {
                    //启动能够响应com.example.activitytest.ACTION_START这个action的活动
                    Intent intent = new Intent("com.example.activitytest.ACTION_START");
                    //调用Intent中的addCatgory方法添加一个category
                    intent.addCategory("com.example.activitytest.MY_CATEGORY");
                    startActivity(intent);
                }

    注意:每个Intent中只能指定一个action,但却能指定多个category。

     ------------------------------------------隐式Intent的简单应用--------------------------------------------------------

    打开百度:

                public void onClick(View v) {
                    //Intent,ACTION_VIEW是一个Android系统的内置动作
                    Intent intent = new Intent(Intent.ACTION_VIEW);
                    //通过Uri.parse()方法,将字符串解析成Uri对象
                    intent.setData(Uri.parse("http://www.baidu.com"));
                    startActivity(intent);
                }

    原理:浏览器中的Manifest intent-filter配置正好响应我们的Intent

            <activity android:name=".FirstActivity">
                <intent-filter>
                    <action android:name="android.intent.action.VIEW" />
                    <category android:name="android.intent.category.DEFAULT" />
                    <date android:scheme="http" />
                </intent-filter>
            </activity>

    拨打10086:

                public void onClick(View v) {
                    //Intent.ACTION_DIAL是Android系统的内置动作
                    Intent intent = new Intent(Intent.ACTION_DIAL);
                    intent.setData(Uri.parse("tel:10086"));
                    startActivity(intent);
                }

     -----------------------------------------------Intent的数据传递---------------------------------------------------

    启动活动时传递数据:

    Intent中提供了一系列putExtra()方法的重载,可以把我们想要传递的数据暂存在Intent中,启动了另一个活动后,只需要把这些数据Intent中取出即可。

    发送数据:

                public void onClick(View v) {
                    String data = "你好啊,小娜";
                    Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
                    //传递字符串data
                    intent.putExtra("my_data",data);
                    startActivity(intent);
                }

    接收数据:

            Intent intent = getIntent();
            //接收字符串数据(getXxxExtra("key"))
            String data = intent.getStringExtra("my_data");
            //弹出消息提示
            Toast.makeText(this,data,Toast.LENGTH_SHORT).show();

    返回数据给上一个活动:

    Activity中有一个startActivityForResult()方法,这个方法期望在活动销毁的时候能够返回一个结果给上一个活动。

    startActivityForResult()方法接收两个参数,第一个参数还是Intent,第二个参数是请求码,用于判断数据的来源。

    示例:SecondActivity   -->   ThirdActivity    -->  SecondActivity

     //SecondActivity点击事件
    btn1.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(SecondActivity.this,ThirdActivity.class);
                    startActivityForResult(intent,1);
                }
            });
            //ThirdActivity点击返回
            btn1.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent();
                    intent.putExtra("data_return", "CMCC");
                    setResult(RESULT_OK, intent);
                    finish();
                }
            });  
       //SecongActivity中重写onActivityResult方法
         protected void onActivityResult(int requestCode,int resultCode,Intent data){
            switch (requestCode){
                case 1:
                    if(resultCode == RESULT_OK){
                        String returnedData = data.getStringExtra("data_return");
                        Toast.makeText(this,returnedData,Toast.LENGTH_SHORT).show();
                    }
                    break;
                default:
            }
        }

    但是上面这种方式当用户通过Back返回键回到SecondActivity时会失效,我们可以通过重写onBackPressed()方法解决这个问题,试一试吧。

  • 相关阅读:
    近期前端中的 一些常见的面试题
    一道前端学习题
    前端程序员容易忽视的一些基础知识
    web前端工程师入门须知
    Web前端知识体系精简
    面试分享:一年经验初探阿里巴巴前端社招
    抽象类、抽象函数/抽象方法详解
    C#语法-虚方法详解 Virtual 虚函数
    面向对象语言:继承关系教程
    C#动态创建Xml-LinQ方式
  • 原文地址:https://www.cnblogs.com/woider/p/5116750.html
Copyright © 2011-2022 走看看