码迷,mamicode.com
首页 > 移动开发 > 详细

android之intent显式,显式学习

时间:2015-11-17 23:26:18      阅读:333      评论:0      收藏:0      [点我收藏+]

标签:

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

 

android之intent显式,显式学习

标签:

原文地址:http://www.cnblogs.com/shuqingstudy/p/4973111.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!