`
gaotong1991
  • 浏览: 93025 次
  • 来自: 北京
社区版块
存档分类
最新评论

Android之旅-Intent与Intent Filter[上]

阅读更多

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和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;  
        }  
    }  
}  

 

1
0
分享到:
评论
1 楼 从此醉 2014-02-25  
很少见有用ComponentName 的

相关推荐

    Android-example-ok.rar_android_example andro

    通过"Android-example-ok"中的这些实例,初学者可以逐步建立起Android开发的基本概念,掌握核心技术和最佳实践,从而顺利踏上Android开发之旅。每一个项目都是一次宝贵的实践机会,深入研究和模仿这些示例将加速学习...

    android framework

    6. **Intent Filter**:Intent Filter用于匹配Intent,它指定了接收者可以处理的Intent类型。通常在AndroidManifest.xml文件中定义。 7. **Intent Receiver**:Intent Receiver是一种特殊的Broadcast Receiver,...

    Android实例开发完全手册_part1

    2. **Hello World程序**:每个编程学习之旅都始于"Hello, World!",在Android中,这涉及到创建一个新的Android项目,编写第一个Activity,以及在布局文件中添加TextView来显示文本。 3. **AndroidManifest.xml**:...

    超爽android中文教程

    10. **Android组件间的通信与协作**:理解Activity间的启动模式,理解如何通过Intent Filter实现Activity的启动,以及如何使用Binder机制进行Service之间的通信。 通过《超爽Android中文教程》,初学者可以系统地...

    Android开发教程&笔记

    **:每个编程之旅通常都从打印"Hello, World!"开始。在Android中,这涉及到创建一个新的Android项目,编写一个简单的Activity(应用程序的主要组件)和布局XML文件,展示一个TextView显示“Hello, World!”。 3. **...

    Android从初级到高级代码九

    在Android开发领域,Activity是应用中的核心组件之一,它代表了用户与...通过深入研究"Android从初级到高级代码九"中的Activity_07,你将能够更好地理解和掌握Activity的运用,为你的Android开发之旅打下坚实的基础。

    Android从0到1教学示例大全.zip

    在Android开发领域,从零开始学习是一个挑战但充满乐趣的过程。本资源"Android从0到1教学示例大全.zip...无论你是计算机科学专业的学生,还是对移动开发感兴趣的人,这套教程都能为你的Android开发之旅提供宝贵的指导。

    android开发

    通过本书,你可以系统地学习Android开发的核心概念,从而开启你的移动应用开发之旅。 首先,Android环境的搭建是所有Android开发的起点。书中会详细介绍如何安装和配置Android Studio,这是一个强大的集成开发环境...

    GHP:我踏入Android应用开发世界的第一步

    2. **Hello World**:每个编程之旅的起点,通常是从打印“Hello, World!”开始。学生将学习创建一个新的Android项目,编写简单的主Activity,显示欢迎信息。 3. **基本UI组件**:了解Android布局管理器如线性布局、...

    CreateActivity1

    Activity是Android应用程序中的一个关键组件,它代表用户可见的屏幕或界面,用户与之交互以完成特定任务。在这个过程中,我们将深入探讨如何使用Java语言来创建和理解Activity。 首先,我们需要在项目的`src/main/...

Global site tag (gtag.js) - Google Analytics