首页 > 系统 > Android > 正文

Android之旅-Intent与Intent Filter[上]

2019-11-17 03:20:09
字体:
来源:转载
供稿:网友

Android之旅-Intent与Intent Filter[上]

Intent代表了Android应用的启动“意图”,Android应用将会根据Intent来启动指定组件,至于到底启动哪个组件,取决于Intent的各个属性。

一、显式的Intent

明确指定了要启动的组件的Intent我们称为显式的Intent

例如:

java代码
  1. packagecom.example.testintent;
  2. importandroid.app.Activity;
  3. importandroid.content.ComponentName;
  4. importandroid.content.Intent;
  5. importandroid.os.Bundle;
  6. importandroid.view.View;
  7. importandroid.view.View.OnClickListener;
  8. importandroid.widget.Button;
  9. publicclassMainActivityextendsActivity{
  10. Buttonbutton;
  11. @Override
  12. PRotectedvoidonCreate(BundlesavedInstanceState){
  13. super.onCreate(savedInstanceState);
  14. setContentView(R.layout.activity_main);
  15. button=(Button)findViewById(R.id.button1);
  16. button.setOnClickListener(newOnClickListener(){
  17. @Override
  18. publicvoidonClick(Viewarg0){
  19. ComponentNamecomp=newComponentName(MainActivity.this,SecondActivity.class);
  20. Intentintent=newIntent();
  21. intent.setComponent(comp);
  22. startActivity(intent);
  23. }
  24. });
  25. }
  26. }

注意在manifest文件里注册SecondActivity

Intent的Componet属性需要接收一个ComponentName对象,ComponetName对象其实是一个指定包和要启动的Activity路径的类,有如下几个构造

Java代码收藏代码
  1. componentName(Stringpkg,Stringcls)
  2. componentName(Contextpkg,Stringcls)
  3. componentName(Contextpkg,Class<?>cls)

componentName(Parcel in)

除了这个属性之外Intent还包含了如下三个方法:

Java代码
  1. setClass(ContextpackageContext,Class<?>cls)
  2. setClassName(ContextpackageContext,StringclassName)
  3. setClassName(StringpackageName,StringclassName)

上面的代码可以简化为如下代码:

Java代码
  1. Intentintent=newIntent(MainActivity.this,SecondActivity.class);
  2. startActivity(intent);

二、隐式的Intent

没有明确指定要启动的组件的Intent我们称为隐式的Intent

Intent除了上面的Componet属性外还有Action、Category属性

Action代表Intent所要完成的一个抽象动作,而Category则是动作附加的类别信息。

例如:

Java代码
  1. packagecom.example.testintent;
  2. importandroid.app.Activity;
  3. importandroid.content.ComponentName;
  4. importandroid.content.Intent;
  5. importandroid.os.Bundle;
  6. importandroid.view.View;
  7. importandroid.view.View.OnClickListener;
  8. importandroid.widget.Button;
  9. publicclassMainActivityextendsActivity{
  10. Buttonbutton;
  11. @Override
  12. protectedvoidonCreate(BundlesavedInstanceState){
  13. super.onCreate(savedInstanceState);
  14. setContentView(R.layout.activity_main);
  15. button=(Button)findViewById(R.id.button1);
  16. button.setOnClickListener(newOnClickListener(){
  17. @Override
  18. publicvoidonClick(Viewarg0){
  19. Intentintent=newIntent();
  20. intent.setAction("com.example.intent.action.TEST_ACTION");
  21. startActivity(intent);
  22. }
  23. });
  24. }
  25. }

manifest文件中配置

Java代码
  1. <activity
  2. android:name=".SecondActivity">
  3. <intent-filter>
  4. <actionandroid:name="com.example.intent.action.TEST_ACTION"/>
  5. <categoryandroid:name="android.intent.category.DEFAULT"/>
  6. </intent-filter>
  7. </activity>

一个Intent只能指定一个Action属性,可以包含多个Category属性,当程序创建时,默认启动category为DEFAULT的组件。

接下来我们来看看Category属性的用法

Java代码收藏代码
  1. publicvoidonClick(Viewarg0){
  2. Intentintent=newIntent();
  3. intent.setAction("com.example.intent.action.TEST_ACTION");
  4. intent.addCategory("android.intent.category.TEST_CATEGERY");
  5. startActivity(intent);
  6. }

manifest文件中配置

Java代码收藏代码
  1. <activity
  2. android:name=".SecondActivity">
  3. <intent-filter>
  4. <actionandroid:name="com.example.intent.action.TEST_ACTION"/>
  5. <categoryandroid:name="android.intent.category.DEFAULT"/>
  6. <categoryandroid:name="android.intent.category.TEST_CATEGERY"/>
  7. </intent-filter>
  8. </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

三、一个获取通讯录的实例:

Java代码收藏代码
  1. packagecom.example.testintent;
  2. importandroid.app.Activity;
  3. importandroid.content.Intent;
  4. importandroid.database.Cursor;
  5. importandroid.net.Uri;
  6. importandroid.os.Bundle;
  7. importandroid.provider.ContactsContract;
  8. importandroid.provider.ContactsContract.Contacts;
  9. importandroid.support.v4.content.CursorLoader;
  10. importandroid.util.Log;
  11. importandroid.view.View;
  12. importandroid.view.View.OnClickListener;
  13. importandroid.widget.Button;
  14. publicclassMainActivityextendsActivity{
  15. privatestaticfinalStringTAG="MainActivity";
  16. Buttonbutton;
  17. finalintPICK_CONTACT=0;
  18. @Override
  19. protectedvoidonCreate(BundlesavedInstanceState){
  20. super.onCreate(savedInstanceState);
  21. setContentView(R.layout.activity_main);
  22. button=(Button)findViewById(R.id.button1);
  23. button.setOnClickListener(newOnClickListener(){
  24. @Override
  25. publicvoidonClick(Viewarg0){
  26. Intentintent=newIntent();
  27. intent.setAction(Intent.ACTION_GET_CONTENT);
  28. intent.setType("vnd.android.cursor.item/phone");
  29. startActivityForResult(intent,PICK_CONTACT);
  30. }
  31. });
  32. }
  33. @Override
  34. protectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata){
  35. super.onActivityResult(requestCode,resultCode,data);
  36. switch(requestCode){
  37. casePICK_CONTACT:
  38. if(resultCode==Activity.RESULT_OK){
  39. //获取返回数据
  40. UricontactData=data.getData();
  41. CursorLoadercursorLoader=newCursorLoader(this,contactData,null,null,null,null);
  42. Cursorcursor=cursorLoader.loadInBackground();
  43. if(cursor.moveToFirst()){
  44. StringcontactId=cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
  45. Stringname=cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME));
  46. Log.i(TAG,"姓名:"+name);
  47. //根据联系人查看详细信息
  48. Cursorphones=getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,
  49. ContactsContract.CommonDataKinds.Phone.
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表