zoukankan      html  css  js  c++  java
  • android之intent显式,显式学习

    intent,意图 当从一个Activity到另一个Activity时调用,这里重点学习显式,隐式的使用

    使用语句上的区别:

      隐式意图:                            显式意图:

            setAction                                            跳转到其他应用:setClassName

            setData                 跳转到自己应用:setClass

           addCategory(当为DEFAULT时可无)          

    一、无参时的显式、隐式举例

          显式-到自己应用(最简单情况):

    /*
        * 跳转到自己的应用activity
        * 在本应用中跳转:ActivitySecond.java
        * 显式跳转:直接指定目标Activity的包名和类名
        */
       public void onClick2(View v){
           Intent intent = new Intent();
           //上下文对象:this
           //cls:直接指定目标Activity的类名:ActivitySecond
           intent.setClass(this, ActivitySecond.class);
           
           startActivity(intent);
       }

         显式-到其他应用(记得加权限):

      /*
        * 显式跳转至拨号器
        */
       public void onClick3(View v){
           Intent intent = new Intent();
           //指定目标的Activity的包名和类名
           intent.setClassName("com.android.dialer", "com.android.dialer.DialtactsActivity");
           startActivity(intent);
       }

       隐式(无参数传递,最简单情况)

      /*
        * 隐式跳转至拨号器
        */
       public void onClick4(View v){
           Intent intent = new Intent();
           //隐式设置拨号器的动作
           intent.setAction(Intent.ACTION_DIAL);
           startActivity(intent);
       }

    二、有参数时隐式传递

        三个参数:清单文件的:name  《=====》java文件的setAction  

                                      scheme《=====》              setData

                mimeType《=====》              setType

    必须保证一一匹配,必须一一对应

    当然还有两个并列原则:

                     (1)外部: <intent-filter >  </intent-filter >和<intent-filter >  </intent-filter >并列

                     (2)内部:<intent-filter >  </intent-filter >中如

              <action android:name="com.wsq.dial"/>
              <action android:name="com.wsq.dial1"/>

              <data android:scheme="wsq" />
              <data android:scheme="wsq1" />两个中任意匹配一个即可

      

    举例说明:

    1)需改变清单文件(隐式跳转至自己应用(无类型)匹配第一对intent-filter

    此时清单文件第一对intent-filter:

       <!-- 并列匹配第一种情况 (没有加类型) -->
                 <intent-filter >
                     <action android:name="com.wsq.dial"/>
                     <action android:name="com.wsq.dial1"/>
                     <data android:scheme="wsq" />
                     <data android:scheme="wsq1" />
               
                     <category android:name="android.intent.category.DEFAULT"></category>  
                 </intent-filter>

    java中对应代码为:

    /*
        * 隐式跳转至拨号器
        * 需要在清单文件添加东西
        */
       public void onClick5(View v){
           Intent intent = new Intent();
         //下面两/三条语句的形参必须和清单文件中保持一致
           //隐式设置拨号器的动作
           //name=dial/dial1 ,scheme=wsq:**/wsq1:**任意匹配即可
           intent.setAction("com.wsq.dial");
           intent.setData(Uri.parse("wsq1:only "));
         //系统会自动添加默认的category(可有可无)
           intent.addCategory(Intent.CATEGORY_DEFAULT);
           startActivity(intent);
       }

    2)需改变清单文件(隐式跳转至自己应用(有 类型)匹配第二对intent-filter)

    此时清单文件第二对intent-filter:

     <!-- 并列匹配第二种情况 加类型 -->
                 <intent-filter >
                     <action android:name="com.wsq.dial3"/>
                     <data android:scheme="wsq3" android:mimeType="text/username"/>
                     
                     <category android:name="android.intent.category.DEFAULT"></category>  
                 </intent-filter>

    java中对应代码为:

    /*
        * 有类型参数传递
        * 隐式跳转至SecondActivity
        * 需要在清单文件添加东西
        * name=dial3 ,scheme=wsq:**,mimeType="text/username"
        */
       public void onClick6(View v){
           Intent intent = new Intent();
           //下面两/三条语句的形参必须和清单文件中保持一致
           //隐式设置拨号器的动作
           intent.setAction("com.wsq.dial3");
           
         /*  
          * 该两者不能共生,所以使用一个综合性的方法替代
          * intent.setData(Uri.parse("wsq:paopao"));
            intent.setType("text/username"); 
          */
           intent.setDataAndType(Uri.parse("wsq3:paopao"), "text/username");
           //系统会自动添加默认的category(可有可无)
           intent.addCategory(Intent.CATEGORY_DEFAULT);
           startActivity(intent);
       }

    注意的是intent.setData和intent.setType不能同时存在,使用综合方法代替了

    三、对上述两种传参的响应:

    在SecondActivity.java中接收意图intent,获取到启动这个Activity的意图:MainActivity中的Intent

       //,只针对5,6按钮,不针对第二个按钮因为无数据传过来,如果点击发生错误
                //获取到启动这个Activity的意图:MainActivity中的Intent
                Intent intent  = getIntent();
                Uri uri =intent.getData();
                //打印显示按钮6传过来的参数
                System.out.println(uri.toString());

    需要注意的是,第二个按钮(最简单情况无参传递)是无参的,所以该响应不能接收到数据,所以该响应只针对上述两种有参数传递的意图

    四、效果:

    有参数的响应:

    五、代码:

    package com.wsq.jumpSecondactivity;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.net.Uri;
    import android.os.Bundle;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.View;
    
    
    public class MainActivity extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
        }
       /*
        * 跳转到第二个activity:打电话
        * 隐式跳转
        * 使用setAction和setData
        */
       public void onClick1(View v){
           Intent intent = new Intent();
           //
           intent.setAction(Intent.ACTION_CALL);
           intent.setData(Uri.parse("tel:110")); //英文字符
           //跳转
           startActivity(intent);
       }
       /*
        * 跳转到自己的应用activity
        * 在本应用中跳转:ActivitySecond.java
        * 显式跳转:直接指定目标Activity的包名和类名
        */
       public void onClick2(View v){
           Intent intent = new Intent();
           //上下文对象:this
           //cls:直接指定目标Activity的类名:ActivitySecond
           intent.setClass(this, ActivitySecond.class);
           
           startActivity(intent);
       }
       /*
        * 显式跳转至拨号器
        */
       public void onClick3(View v){
           Intent intent = new Intent();
           //指定目标的Activity的包名和类名
           intent.setClassName("com.android.dialer", "com.android.dialer.DialtactsActivity");
           startActivity(intent);
       }
       
       /*
        * 隐式跳转至拨号器
        */
       public void onClick4(View v){
           Intent intent = new Intent();
           //隐式设置拨号器的动作
           intent.setAction(Intent.ACTION_DIAL);
           startActivity(intent);
       }
       
       /*
        * 隐式跳转至拨号器
        * 需要在清单文件添加东西
        */
       public void onClick5(View v){
           Intent intent = new Intent();
         //下面两/三条语句的形参必须和清单文件中保持一致
           //隐式设置拨号器的动作
           //name=dial/dial1 ,scheme=wsq:**/wsq1:**任意匹配即可
           intent.setAction("com.wsq.dial");
           intent.setData(Uri.parse("wsq1:only "));
         //系统会自动添加默认的category(可有可无)
           intent.addCategory(Intent.CATEGORY_DEFAULT);
           startActivity(intent);
       }
       /*
        * 有类型参数传递
        * 隐式跳转至SecondActivity
        * 需要在清单文件添加东西
        * name=dial3 ,scheme=wsq:**,mimeType="text/username"
        */
       public void onClick6(View v){
           Intent intent = new Intent();
           //下面两/三条语句的形参必须和清单文件中保持一致
           //隐式设置拨号器的动作
           intent.setAction("com.wsq.dial3");
           
         /*  
          * 该两者不能共生,所以使用一个综合性的方法替代
          * intent.setData(Uri.parse("wsq:paopao"));
            intent.setType("text/username"); 
          */
           intent.setDataAndType(Uri.parse("wsq3:paopao"), "text/username");
           //系统会自动添加默认的category(可有可无)
           intent.addCategory(Intent.CATEGORY_DEFAULT);
           startActivity(intent);
       }
    }
    MainActivity.java
    package com.wsq.jumpSecondactivity;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.net.Uri;
    import android.os.Bundle;
    
    public class ActivitySecond extends Activity {
         @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_second);
                //,只针对5,6按钮,不针对第二个按钮因为无数据传过来,如果点击发生错误
                //获取到启动这个Activity的意图:MainActivity中的Intent
                Intent intent  = getIntent();
                Uri uri =intent.getData();
                //打印显示按钮6传过来的参数
                System.out.println(uri.toString());
            }
    }
    ActivitySecond.java
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.wsq.jumpSecondactivity"
        android:versionCode="1"
        android:versionName="1.0" >
    
        <uses-sdk
            android:minSdkVersion="14"
            android:targetSdkVersion="19" />
        <uses-permission android:name="android.permission.CALL_PHONE"/>
    
        <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
            <!-- 主入口 -->
            <activity
                android:name=".MainActivity"
                android:label="@string/app_name" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
            
            <!-- 第二个入口, -->
            <!--.ActivitySecond 等价于android.intent.action.ActivitySecond  -->
            <activity android:name=".ActivitySecond">
                 <intent-filter >
                     <category android:name="android.intent.category.DEFAULT"></category>  
                 </intent-filter>
                <!-- 并列匹配第一种情况 (没有加类型) -->
                 <intent-filter >
                     <action android:name="com.wsq.dial"/>
                     <action android:name="com.wsq.dial1"/>
                     <data android:scheme="wsq" />
                     <data android:scheme="wsq1" />
               
                     <category android:name="android.intent.category.DEFAULT"></category>  
                 </intent-filter>
                 <!-- 并列匹配第二种情况 加类型 -->
                 <intent-filter >
                     <action android:name="com.wsq.dial3"/>
                     <data android:scheme="wsq3" android:mimeType="text/username"/>
                     
                     <category android:name="android.intent.category.DEFAULT"></category>  
                 </intent-filter>
            </activity>"
        </application>
    
    </manifest>
    清单文件.xml
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >
        
    
         <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="这是主activity" />
        
         <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="打电话(隐式跳转至其他应用)"
            android:onClick="onClick1" />
         <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="显式跳转至自己应用"
            android:onClick="onClick2" />
         <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="显式跳转至其他应用"
            android:onClick="onClick3" />
          <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="隐式跳转至其他应用"
            android:onClick="onClick4" />
             <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="需改变清单文件(隐式跳转至自己应用(无类型)匹配第一对intent-filter)"
            android:onClick="onClick5" />
             
              <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="需改变清单文件(隐式跳转至自己应用(有 类型)匹配第二对intent-filter)"
            android:onClick="onClick6" />
    </LinearLayout>
    
       
    Main布局文件
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >
    
        <TextView
            android:id="@+id/editText1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="第二个activity"
            android:ems="10" >
    
            
        </TextView>
    
    </LinearLayout>
    Second布局文件
  • 相关阅读:
    【笔记】网易微专业-Web安全工程师-04.WEB安全实战-7.SQL回显注入
    【笔记】网易微专业-Web安全工程师-04.WEB安全实战-6.文件上传
    【笔记】网易微专业-Web安全工程师-04.WEB安全实战-5.文件包含
    【笔记】网易微专业-Web安全工程师-04.WEB安全实战-4.CSRF
    zoom和transform:scale的区别
    图片上黑色透明遮罩的实现
    如何实现两行文本增多显示省略号
    H5如何实现一行三列布局
    H5瀑布流如何实现
    H5一行显示两个正方形
  • 原文地址:https://www.cnblogs.com/shuqingstudy/p/4973111.html
Copyright © 2011-2022 走看看