Intent代表了Android应用的启动“意图”,Android应用将会根据Intent来启动指定组件,至于到底启动哪个组件,取决于Intent的各个属性。
一、显式的Intent
明确指定了要启动的组件的Intent我们称为显式的Intent
例如:
package com.example.testintent; import android.app.Activity; import android.content.ComponentName; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class MainActivity extends Activity { Button button; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button = (Button)findViewById(R.id.button1); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { ComponentName comp = new ComponentName(MainActivity.this, SecondActivity.class); Intent intent = new Intent(); intent.setComponent(comp); startActivity(intent); } }); } }
注意在manifest文件里注册SecondActivity
Intent的Componet属性需要接收一个ComponentName对象,ComponetName对象其实是一个指定包和要启动的Activity路径的类,有如下几个构造
componentName(String pkg, String cls) componentName(Context pkg, String cls) componentName(Context pkg, Class<?> cls)
componentName(Parcel in)
除了这个属性之外Intent还包含了如下三个方法:
setClass(Context packageContext, Class<?> cls ) setClassName(Context packageContext, String className) setClassName(String packageName, String className )
上面的代码可以简化为如下代码:
Intent intent = new Intent(MainActivity.this, SecondActivity.class); startActivity(intent);
二、隐式的Intent
没有明确指定要启动的组件的Intent我们称为隐式的Intent
Intent除了上面的Componet属性外还有Action、Category属性
Action代表Intent所要完成的一个抽象动作,而Category则是动作附加的类别信息。
例如:
package com.example.testintent; import android.app.Activity; import android.content.ComponentName; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class MainActivity extends Activity { Button button; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button = (Button)findViewById(R.id.button1); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { Intent intent = new Intent(); intent.setAction("com.example.intent.action.TEST_ACTION"); startActivity(intent); } }); } }
manifest文件中配置
<activity android:name=".SecondActivity"> <intent-filter > <action android:name="com.example.intent.action.TEST_ACTION"/> <category android:name="android.intent.category.DEFAULT"/> </intent-filter> </activity>
一个Intent只能指定一个Action属性,可以包含多个Category属性,当程序创建时,默认启动category为DEFAULT的组件。
接下来我们来看看Category属性的用法
public void onClick(View arg0) { Intent intent = new Intent(); intent.setAction("com.example.intent.action.TEST_ACTION"); intent.addCategory("android.intent.category.TEST_CATEGERY"); startActivity(intent); }
manifest文件中配置
<activity android:name=".SecondActivity"> <intent-filter > <action android:name="com.example.intent.action.TEST_ACTION"/> <category android:name="android.intent.category.DEFAULT"/> <category android:name="android.intent.category.TEST_CATEGERY"/> </intent-filter> </activity>
可以看出其实是根据Action和Category两个属性共同决定启动哪个Activity的,Category可以有多个,只要满足其中的一个即可。
实际上Intent不仅可以启动我们定义的Activity,也可以启动系统和其他应用的Activity
ACTION_MAIN 应用程序入口
ACTION_VIEW 显示指定数据
ACTION_ATTACH_DATA 指定某块数据将被附加到其他地方
ACTION_EDIT 编辑指定数据
ACTION_PICK 从列表中选择某项,并返回所选数据
ACTION_CHOOSER 显示一个Activity选择器
ACTION_GET_CONTENT 让用户选择数据,并返回所选数据
ACTION_DIAL 显示拨号面板
ACTION_CALL 直接向指定用户打电话
ACTION_SEND 向其他人发送数据
ACTION_SENDTO 向其他人发送消息
ACTION_ANSWER 应答电话
ACTION_INSERT 插入数据
ACTION_DELETE 删除数据
ACTION_RUN 运行数据
ACTION_SYNC 执行数据同步
ACTION_PICK_ACTIVITY 用于选择Activity
ACTION_SEARCH 执行搜索
ACTION_WEB_SEARCH 执行web搜索
ACTION_FACTORY_TEST 工厂测试的入口点
这里仅列出部分更多关于Action和Category属性请参阅:http://developer.android.com/reference/android/content/Intent.html
三、一个获取通讯录的实例:
package com.example.testintent; import android.app.Activity; import android.content.Intent; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.provider.ContactsContract; import android.provider.ContactsContract.Contacts; import android.support.v4.content.CursorLoader; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class MainActivity extends Activity { private static final String TAG = "MainActivity"; Button button; final int PICK_CONTACT = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button = (Button)findViewById(R.id.button1); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { Intent intent = new Intent(); intent.setAction(Intent.ACTION_GET_CONTENT); intent.setType("vnd.android.cursor.item/phone"); startActivityForResult(intent, PICK_CONTACT); } }); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (requestCode) { case PICK_CONTACT: if(resultCode == Activity.RESULT_OK){ //获取返回数据 Uri contactData = data.getData(); CursorLoader cursorLoader = new CursorLoader(this, contactData, null, null, null, null); Cursor cursor = cursorLoader.loadInBackground(); if(cursor.moveToFirst()){ String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID)); String name = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME)); Log.i(TAG, "姓名:" + name); //根据联系人查看详细信息 Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + contactId, null, null); if(phones.moveToFirst()){ System.out.println("进来了"); String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); Log.i(TAG, "电话:" + phoneNumber); } //关闭游标 phones.close(); } //关闭游标 cursor.close(); } break; default: break; } } }
相关推荐
通过"Android-example-ok"中的这些实例,初学者可以逐步建立起Android开发的基本概念,掌握核心技术和最佳实践,从而顺利踏上Android开发之旅。每一个项目都是一次宝贵的实践机会,深入研究和模仿这些示例将加速学习...
6. **Intent Filter**:Intent Filter用于匹配Intent,它指定了接收者可以处理的Intent类型。通常在AndroidManifest.xml文件中定义。 7. **Intent Receiver**:Intent Receiver是一种特殊的Broadcast Receiver,...
2. **Hello World程序**:每个编程学习之旅都始于"Hello, World!",在Android中,这涉及到创建一个新的Android项目,编写第一个Activity,以及在布局文件中添加TextView来显示文本。 3. **AndroidManifest.xml**:...
10. **Android组件间的通信与协作**:理解Activity间的启动模式,理解如何通过Intent Filter实现Activity的启动,以及如何使用Binder机制进行Service之间的通信。 通过《超爽Android中文教程》,初学者可以系统地...
**:每个编程之旅通常都从打印"Hello, World!"开始。在Android中,这涉及到创建一个新的Android项目,编写一个简单的Activity(应用程序的主要组件)和布局XML文件,展示一个TextView显示“Hello, World!”。 3. **...
在Android开发领域,Activity是应用中的核心组件之一,它代表了用户与...通过深入研究"Android从初级到高级代码九"中的Activity_07,你将能够更好地理解和掌握Activity的运用,为你的Android开发之旅打下坚实的基础。
在Android开发领域,从零开始学习是一个挑战但充满乐趣的过程。本资源"Android从0到1教学示例大全.zip...无论你是计算机科学专业的学生,还是对移动开发感兴趣的人,这套教程都能为你的Android开发之旅提供宝贵的指导。
通过本书,你可以系统地学习Android开发的核心概念,从而开启你的移动应用开发之旅。 首先,Android环境的搭建是所有Android开发的起点。书中会详细介绍如何安装和配置Android Studio,这是一个强大的集成开发环境...
2. **Hello World**:每个编程之旅的起点,通常是从打印“Hello, World!”开始。学生将学习创建一个新的Android项目,编写简单的主Activity,显示欢迎信息。 3. **基本UI组件**:了解Android布局管理器如线性布局、...
Activity是Android应用程序中的一个关键组件,它代表用户可见的屏幕或界面,用户与之交互以完成特定任务。在这个过程中,我们将深入探讨如何使用Java语言来创建和理解Activity。 首先,我们需要在项目的`src/main/...