当前位置: 首页 > news >正文

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());
 

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

 

四、效果:

有参数的响应:

五、代码:

ackage 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);
   }
}
复制代码
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);
   }
}
复制代码
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());
        }
}

 

 
复制代码
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());
        }
}
复制代码

清单文件
<?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>

布局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: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>

   
Second布局文件
<?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>

 

相关文章:

  • Daily Scrum - 11/19
  • 标签禁用之readonly和disabled
  • 利用shell实现批量添加用户
  • 关机--小程序
  • Elaticsearch REST API常用技巧
  • eclipse控制台乱码的解决方法
  • QT信号槽机制
  • Nginx 配置详解
  • Monitor traffic to localhost from IE or .NET
  • scala可变长度参数(二)
  • js中replace用法
  • 【转载】强大的命令行工具wmic
  • kendo grid应用经验总结
  • SurfaceView和View区别
  • sql语句之一维二维
  • [译] 怎样写一个基础的编译器
  • [译]CSS 居中(Center)方法大合集
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • 10个确保微服务与容器安全的最佳实践
  • ES6系统学习----从Apollo Client看解构赋值
  • OSS Web直传 (文件图片)
  • Spring-boot 启动时碰到的错误
  • swift基础之_对象 实例方法 对象方法。
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • 动态魔术使用DBMS_SQL
  • 给第三方使用接口的 URL 签名实现
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 缓存与缓冲
  • 基于组件的设计工作流与界面抽象
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 爬虫进阶 -- 神级程序员:让你的爬虫就像人类的用户行为!
  • 使用agvtool更改app version/build
  • 学习ES6 变量的解构赋值
  • 云大使推广中的常见热门问题
  • 做一名精致的JavaScripter 01:JavaScript简介
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • 阿里云ACE认证学习知识点梳理
  • 关于Android全面屏虚拟导航栏的适配总结
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • #define、const、typedef的差别
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • $.proxy和$.extend
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (2)(2.10) LTM telemetry
  • (NSDate) 时间 (time )比较
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (转)创业的注意事项
  • (转)为C# Windows服务添加安装程序
  • .bat批处理出现中文乱码的情况