牛骨文教育服务平台(让学习变的简单)

Intent的定义:

Android中提供了Intent机制来协助应用间的交互与通讯,或者采用更准确的说法是,Intent不仅可用于应用程序之间,也可用于应用程序内部的activity, service和broadcast receiver之间的交互。Intent这个英语单词的本意是“目的、意向、意图”。

使用Intent启动系统组件:

三种应用程序基本组件——activity, service和broadcast receiver——是使用称为intent的消息来激活的。Intent消息传递是一种组件间运行时绑定的机制. intent是Intent对象, 它包含了需要做的操作的描述, 或者, 对于广播来说, 包含了正在通知的消息内容. 对于向这三种组件发送intent有不同的机制:

使用Context.startActivity() 或 Activity.startActivityForResult(), 传入一个intent来启动一个activity. 使用 Activity.setResult(), 传入一个intent来从activity中返回结果.

将intent对象传给Context.startService()来启动一个service或者传消息给一个运行的service. 将intent对象传给 Context.bindService()来绑定一个service.

将intent对象传给 Context.sendBroadcast(), Context.sendOrderedBroadcast(),或者Context.sendStickyBroadcast()等广播方法,则它们被 传给 broadcast receiver.

在上述三种情况下, android系统会自己找到合适的activity, service, 或者 broadcast receivers来响应intent. 三者的intent相互独立互不干扰.

Intent的属性:

component(组件):目的组件
action(动作):用来表现意图的行动
category(类别):用来表现动作的类别
data(数据):表示与动作要操纵的数据
type(数据类型):对于data范例的描写
extras(扩展信息):扩展信息
Flags(标志位):期望这个意图的运行模式

1,component(组件):目的组件

Component属性明确指定Intent的目标组件的类名称。(属于直接Intent)

ComponentName对象包含的构造器:

ComponentName(String pkg,String cls)创建在pkg所在报下的cls类所对应的组件

ComponentName(Context pkg,String cls)创建在pkg所在报下的cls类所对应的组件

ComponentName(Context pkg,Class cls)创建在pkg所在报下的cls类所对应的组件

一个ComponentName需要指定包名和类名--这就可以唯一确定一个组件类

另外Intent可以根据给定的组件类去启动特定的组件,Intent有下面的方法:

setClass(Context packageContext,Class cls):设置该Intent将要启动的组件对应的类

setClassName(Context packageContext,String className):设置该Intent将要启动的组件对应的类

setClassName(String packageContext,String className):设置该Intent将要启动的组件对应的类

以上方法中的两个参数其实就确定了一个Component组件

Intent类型分为显式Intent(直接类型)、隐式Intent(间接类型)。官方建议使用隐式Intent。上述属性中,component属性为直接类型,其他均为间接类型。

启动第二个Activity时:


// 为bn按钮绑定事件监听器
		bn.setOnClickListener(new OnClickListener()
		{
			@Override
			public void onClick(View arg0)
			{
				// 创建一个ComponentName对象
				ComponentName comp = new ComponentName(ComponentAttr.this,
						SecondActivity.class);
				Intent intent = new Intent();
				// 为Intent设置Component属性
				intent.setComponent(comp);
//				Intent intent = new Intent(ComponentAttr.this,
//					SecondActivity.class);
				startActivity(intent);
			}
		});

可以这样写:


Intent intent = new Intent();
                 //setClass函数的第一个参数是一个Context对象
                 //Context是一个类,Activity是Context类的子类,也就是说,所有的Activity对象,都可以向上转型为Context对象
                 //setClass函数的第二个参数是一个Class对象,在当前场景下,应该传入需要被启动的Activity类的class对象
                intent.setClass(MainActivity.this, SecondActivity.class);
                 startActivity(intent);

还可以这样写:


Intent intent = new Intent(MainActivity.this,SecondActivity.class);
  startActivity(intent);

2、Action(动作):用来表现意图的行动

Action 是一个用户定义的普通字符串,代表该Intent索要完成的一个抽象“动作”。用于描述一个 Android 应用程序组件,一个 Intent Filter 可以包含多个 Action。在 AndroidManifest.xml 的Activity 定义时,可以在其 节点指定一个 Action列表用于标识 Activity 所能接受的“动作”

    Action要完成的知识一个抽象的动作,这个动作具体由哪个组件(Activity,Service,BroadcastReceiver)来完成,Action这个字符不管。比如Android提供的标准Action:Intent.ACTION_VIEW,它值表示一个抽象的查看动作,但具体什么,启动哪个Activity来看,Intent.ACTION_VIEW并不知道---这取决于Activity的配置,只要某个Activity的配置中包含了该ACTION_VIEW,该Activity就有可能被启动。

一句话总就是说,哪个Activity的intent-filter...>配置中有Intent设置的Action属性,就可能被启动。

MainActivity .java


public class MainActivity extends Activity {
    public final static String ACTION="com.hust.actiontest";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button btn=(Button) findViewById(R.id.button1);
        btn.setOnClickListener(new OnClickListener(){

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Intent intent=new Intent();
				intent.setAction(MainActivity.ACTION);
				startActivity(intent);
			}
        	
        });
    }

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.hust.actionattrtest"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="20"
        android:targetSdkVersion="22" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".SeclondActivity"
            android:label="@string/title_activity_seclond" >
             <intent-filter>
                 <!-- 指定该Activity能响应Action为指定字符串的Intent -->
                <action android:name="com.hust.actiontest" /> 
                <!-- 指定该Action能响应Category属性为指定字符串的Intent -->
				<category android:name="android.intent.category.DEFAULT" />              
            </intent-filter>
        </activity>
    </application>

</manifest>


SecondActivity.java


public class SeclondActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_seclond);
		TextView show = (TextView) findViewById(R.id.show);
		// 获取该Activity对应的Intent的Action属性
		String action = getIntent().getAction();
		// 显示Action属性
		show.setText("Action为:" + action);
	}


因为SeclondActivity的的action有com.hust.actiontest所以就可能被MainActivity启动

使用Intent的Action属性启动组件的过程大概是:主Activity的Intent的Action属性设置为一个字符串str比如“com.hust.edu”,然后再去Manifest.xml中查找各个Activity组件的的action是否有这个字符串str=com.hust.edu,如果有,这个Activity可能被启动。