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