Android Intent意图
intent是具有其相关联数据的动作。
Android使用Intents调用组件。Android中的组件包括
- activities (UI组件),
- services服务 (后台代码),
- broadcast receivers广播接收器,
- content providers内容提供者。
你可以使用intent来调用外部应用程序或内部组件。
你可以使用intent来引发事件,使别人可以以类似于发布-订阅模型的方式进行响应。
你可以使用intent引发警报。
例子
以下代码显示了如何使用Intent打开一个Activity。
假设你进行了以下活动:
public class BasicViewActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ... } }
然后,你在清单文件中注册这个activity,使其可供其他应用程序调用。
<activity android:name=".BasicViewActivity" android:label="Basic View Tests"> <intent-filter> <action android:name="cn.w3cschool.intent.action.ShowBasicView"/> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
要使用intent调用此BasicViewActivity:
public static void invokeMyApplication(Activity parentActivity) { String actionName= "cn.w3cschool.intent.action.ShowBasicView"; Intent intent = new Intent(actionName); parentActivity.startActivity(intent); }
注意
动作名称的一般约定是
<your-package-name>.intent.action.YOUR_ACTION_NAME
BasicViewActivity可以获取调用它的intent。
class BasicViewActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ... ... Intent intent = this.getIntent(); if (intent == null) { Log.d("test tag", "This activity is invoked without an intent"); } } }
Intent组合
intent有四个部分:
- name
- data
- type
- category
在Android中,intent通常是成对的:动作和数据。
该动作描述了要执行什么,例如编辑项目,查看项目的内容等等。
数据指定受影响的内容,例如联系人数据库中的人员。
数据被指定为Uri对象。
一些行动的例子如下:
- ACTION_VIEW
- ACTION_DIAL
- ACTION_PICK
数据的一些示例包括以下:
- www.w3cschool.cn
- tel:+9991231234
- geo:37.999900,-122.999970
- content://contacts
动作和数据对描述了要执行的操作。
例如,要拨打电话号码,你将使用对 ACTION_DIAL/tel:+999234567
。
要显示存储在手机中的联系人列表,请使用对ACTION_VIEW/content://contacts
。
要从联系人列表中选择联系人,请使用对ACTION_PICK/content://contacts
。
使用intent category
你可以使用intent过滤器中的< category>
元素将activity分组。
AndroidManifest.xml文件:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="cn.w3cschool.Intents" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="14" /> <uses-permission android:name="android.permission.CALL_PHONE"/> <uses-permission android:name="android.permission.INTERNET"/> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <activity android:label="@string/app_name" android:name=".IntentsActivity" > <intent-filter > <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".MyBrowserActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.VIEW" /> <action android:name="cn.w3cschool.MyBrowser" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="cn.w3cschool.Apps" /> <data android:scheme="http" /> </intent-filter> </activity> </application> </manifest>
以下代码将直接调用MyBrowerActivity:
Intent i = new Intent(android.content.Intent.ACTION_VIEW, Uri.parse ("http://www.w3cschool.cn")); i.addCategory("cn.w3cschool.Apps"); startActivity(Intent.createChooser(i, "Open URL using..."));
如果省略 addCategory()
语句,上述代码仍然会调用MyBrowerActivity,因为它仍然匹配默认类别 android.intent.category.DEFAULT
。
对于以下代码,它不匹配在intent过滤器中定义的类别,因此不会启动任何activity。
以下代码引用类别cn.w3cschool.OtherApps,它不匹配intent过滤器中的任何类别,因此如果不使用intent类的createChoose()方法,将会引发运行时异常。
Intent i = new Intent(android.content.Intent.ACTION_VIEW,Uri.parse ("http://www.w3cschool.cn")); //i.addCategory("cn.w3cschool.Apps"); //this category does not match any in the intent-filter i.addCategory("cn.w3cschool.OtherApps"); startActivity(Intent.createChooser(i, "Open URL using..."));
更多建议: