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

时间: 2024-10-03 14:51:30

android之intent显式,显式学习的相关文章

Android开发:显式/隐式Intent意图跳转Activity总结

显式跳转 在已知包名和类名的情况下常用的跳转方法: 是 nt mIntent = new Intent(); mIn Int etent.setClassName("com.android.settings","com.android.settings.Settings"); mContext.startActivity(mIntent); 我们也常这么用: y.class); startActivity(intent); 这是跳转到当前应用的某个Activity,

Android中Intent笔记

Intent是一种运行时绑定(run-time binding)机制,它能在程序运行过程中连接两个不同的组件.通过Intent,你的程序可以向Android表达某种请求或者意愿,Android会根据意愿的内容选择适当的组件来完成请求.比如,有一个Activity希望打开网页浏览器查看某一网页的内容,那么这个Activity只需要发出WEB_SEARCH_ACTION给Android,Android就会根据Intent的请求内容,查询各组件注册时声明的IntentFilter,找到网页浏览器的Ac

Android开发- Intent和Broadcast Receiver

Intent是一种消息传递机制,可以在应用程序内使用,也可以在应用程序间使用.可以用于: 使用类名显示启动一个特定的Service或者Activity. 启动Activity或者Service来执行一个动作的Intent,通常需要使用特定的数据,或者对特定的数据执行动作. 广播某个时间已经发生. 使用Intent来启动Activity 显式启动新的Activity Intent intent = new Intent(MyActivity.this, SelectHorseActivity.cl

Android中Intent对象与Intent Filter过滤匹配过程详解

如果对Intent不是特别了解,可以参见博文<Android中Intent概述及使用>,该文对本文要使用的action.category以及data都进行了详细介绍. 本文内容有点长,希望大家可以耐心读完. 本文在描述组件在manifest中注册的Intent Filter过滤器时,统一用intent-filter表示. 概述 我们知道,Intent是分两种的:显式Intent和隐式Intent.如果一个Intent明确指定了要启动的组件的完整类名,那么这个Intent就是显式Intent,否

Android中Intent概述及使用

Android中的Intent是一个非常重要且常用的类,可以用来在一个组件中启动App中的另一个组件或者是启动另一个App的组件,这里所说的组件指的是Activity.Service以及Broadcast. Intent的用途 Intent主要有以下几种重要用途: 1. 启动Activity:可以将Intent对象传递给startActivity()方法或startActivityForResult()方法以启动一个Activity,该Intent对象包含了要启动的Activity的信息及其他必

《Android笔记3.5》 在 Android 中 Intent 的概念及应用

课程背景:Intent 是 Android 开发中的非常重要的基础概念,想要成为一个 Android 开发者,Intent 是必学的内容. 核心内容:1.隐式 Intent 2.显式 Intent 可以通过隐式Intent,从外部启动某个APP的Activity: 在AndroidManifest.xml中设置action,或设置禁止导出Activity不允许其他APP启动. Intent 过滤器相关选项 当同一个APP或不同APP中的Activity里的action相同的时候,启动时会提示选择

Android 之 Intent(意图)

Intent是 Android中重要的桥梁之一,它分为显式意图和隐式意图.接下来分别针对这两种意图进行讲解. 显式意图:通过指定一组数据或动作,激活应用内部的 activity:(相比隐式意图,此做法更安全) Intent intent = new Intent(); intent.setClass(MainActivity.this,Main2Activity.class); //第一个参数指的就是要跳转的那个Activity:第二个指的是跳到的那个Activity startActivity

Android笔记 Intent用法总结

Intent: 官方解释: An intent is an abstract description of an operation to be performed. It can be used with startActivity to launch an Activity, broadcastIntent to send it to any interested BroadcastReceiver components, and startService(Intent) or bindSe

android的intent使用方法

1.     说明Android中提供了Intent机制来协助应用间或者应用程序内部的交互与通讯.Intent的两种基本用法:一种是显式的Intent,即在构造Intent对象时就指定接收者,这种方式与普通的函数调用类似:另一种是隐式的Intent,即Intent的发送者在构造Intent对象时,并不知道接收者是谁,只是指出接收者的一些特性(比如说启动音乐播放软件) 2.     使用方法 1)         启动服务 a)          关键函数context.startService(