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()方法解决这个问题,试一试吧。

  • 相关阅读:
    2.12 使用@DataProvider
    2.11 webdriver中使用 FileUtils ()
    Xcode8 添加PCH文件
    The app icon set "AppIcon" has an unassigned child告警
    Launch Image
    iOS App图标和启动画面尺寸
    iPhone屏幕尺寸、分辨率及适配
    Xcode下载失败 使用已购项目页面再试一次
    could not find developer disk image
    NSDate与 NSString 、long long类型的相互转化
  • 原文地址:https://www.cnblogs.com/woider/p/5116750.html
Copyright © 2011-2022 走看看