Android Intent意图

2018-02-20 18:10 更新

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..."));

以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号