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