Intent对象详解(一)

来源:互联网 发布:oppo商城软件下载 编辑:程序博客网 时间:2024/06/03 19:24

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(){@Overridepublic 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 定义时,可以在其 <intent-filter >节点指定一个 Action列表用于标识 Activity 所能接受的“动作”

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

一句话总就是说,哪个Activityintent-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(){@Overridepublic void onClick(View v) {// TODO Auto-generated method stubIntent 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 {@Overrideprotected 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的<intent-filter>的action有com.hust.actiontest所以就可能被MainActivity启动

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



0 0