Android菜鸟日记3 intent

Android菜鸟日记3

intent
intent的概念:
intent是具有相关的数据负载的操作,intent 是你告诉android调用什么的一种操作。
个人理解:intent是用于在活动中调用其他活动的组件。在androidmainifest.xml中对活动注册好他的intent,然后就可以通过intent名来调用此方法。[个人认为intent就是方便活动调用其他活动的工具]

Intent实例:
[Android的NotePad例子的androidmainifest.xml片段]
<activity android:name="NotesList" android:label="@string/title_notes_list">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
//intent名
<action android:name="android.intent.action.EDIT" />
//intent名
<action android:name="android.intent.action.PICK" />
//intent名
<category android:name="android.intent.category.DEFAULT" />
//intent类别
<data android:mimeType="vnd.android.cursor.dir/vnd.google.note" />
//intent MIME数据类型
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.GET_CONTENT" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="vnd.android.cursor.item/vnd.google.note" />
</intent-filter>
</activity>


一、Intent注册
使用intent前需要在 androidmianifest.xml注册
Intent 注册是在活动注册内部的。
如上例。
注意:
Intent名称一般约定为<>.intent.action.活动名称。[action为活动集合[view之类的定义活动] 活动名称为继承activty的类名]
Android随带了一些预制程序。可以通过intent调用他们。

二、使用intent调用活动的方法
1. 显示操作启动。
描述:将需要调用的intent 名在实例化intent时传入。
Ex:Intent x = new Intent(“com.androidbook.intent.action.ShowBasicView”);

2. 使用一般操作加url 来启动。
描述:创建intent时只传入到 action类别的参数[“intent.ACTION_CALL”],然后靠传入uri去分辨具体活动。

Q:因为只传入到类别android如何知道调用此类别的哪个活动执行呢?
Answer:
Android通过URI的性质。查看此URI询问注册在当前action当前类别的活动哪个可以处理,然后调用它。为此在androidmianifest.xml 活动中注册intent时。需要注册此intent接受的URI协议。

EX:
<intent-filter>
<action android:name="android.intent.action.GET_CONTENT" />
<data android:scheme="http” />
//注册此intent接受的URI协议
</intent-filter>


3. 使用组件直接调用活动
描述:实例化intent时用无参方法然后再对实例化对象设置活动的完整类名。
设置调用活动的方法:
Intent.setComponent(ComponentName name)
Intent.setClassName(String 包名,String 完整类名);
Intent.setClassName(Context context,String classNameInThatContext)
Setclass(Context context,Class classObjectInthatContext)

PS: ComponentName 是将包名和类名包装在一起的
New ComponentName(“com.android.contacts”,”com.android.contacts.xxxxx”);

Ex:使用组件直接调用活动
Intent xx= new intent();//先用无参构造方法。
xx. setComponent(New ComponentName(“com.android.contacts”,”com.android.contacts.xxxxx”))//然后设置调用的方法。
startActivity(xx);


三、使用extra信息
描述:通过extra可以向intent组将提供更多的信息。Extra以键值的形式表示。
键名称应该以包名称开头,值任意数据类型或者对象,只要他实现了android.os.Parcelable
Extra信息使用Android类android.os.bundle表示。
Intent取出extra
Intent.getExtras();//返回intent的extras 为bundle对象
Intent放入extra
Intent.putExtra(bundle xx);

Intent.putExtra(键,值);

注意:
Putextra传入数据不是传入引用,是复制进去。所以对传入后的数据修改是无法修改到出入extra内部的数据。

四、组件设计人员的最佳实践
Intent的设计模式:
Contacts.intent;
Contacts.intent.Insert;//内部类
Contacts.intent.UI;//内部类

顶级类 cantact.Intents定义了contacts应用程序将响应的主要intent,以及应用程序在运行过程发生的事件。[定义一些字符串 内容是contacts应用程序需要调用的intents名称]
Ex:
public final class Contacts$Intents
{
……
public static final String EXTRA_CREATE_DESCRIPTION = "com.android.contacts.action.CREATE_DESCRIPTION";
……
public Contacts$Intents()
{
throw new RuntimeException("Stub!");
}
}


嵌套类 Contacts.intent.Insert定义了支持的intent和其他常量的插入操作。[也是定义一些字符串 内容为需要调用的intent名称]
public final class Contacts$Intents$Insert
{
public static final String ACTION = "android.intent.action.INSERT";
public static final String FULL_MODE = "full_mode";
public static final String NAME = "name";
public static final String PHONETIC_NAME = "phonetic_name";
public static final String COMPANY = "company";
public static final String JOB_TITLE = "job_title";
public static final String NOTES = "notes";
public static final String PHONE = "phone";
public static final String PHONE_TYPE = "phone_type";
public static final String PHONE_ISPRIMARY = "phone_isprimary";
public static final String SECONDARY_PHONE = "secondary_phone";
public static final String SECONDARY_PHONE_TYPE = "secondary_phone_type";
public static final String TERTIARY_PHONE = "tertiary_phone";
public static final String TERTIARY_PHONE_TYPE = "tertiary_phone_type";
public static final String EMAIL = "email";
public static final String EMAIL_TYPE = "email_type";
public static final String EMAIL_ISPRIMARY = "email_isprimary";
public static final String SECONDARY_EMAIL = "secondary_email";
public static final String SECONDARY_EMAIL_TYPE = "secondary_email_type";
public static final String TERTIARY_EMAIL = "tertiary_email";
public static final String TERTIARY_EMAIL_TYPE = "tertiary_email_type";
public static final String POSTAL = "postal";
public static final String POSTAL_TYPE = "postal_type";
public static final String POSTAL_ISPRIMARY = "postal_isprimary";
public static final String IM_HANDLE = "im_handle";
public static final String IM_PROTOCOL = "im_protocol";
public static final String IM_ISPRIMARY = "im_isprimary";

public Contacts$Intents$Insert()
{
throw new RuntimeException("Stub!");
}
}

嵌套类 : Contacts.intent.UI 定义一些调用UI的方式。还包含了他们所需要的extra信息。
[也就是说定义的字符串 内容是一些调用ui的intent和这些intent需要用到得extra的键名(简单的说就是字符串存UI intent和这些UI intent需要用到的extra键名,这样用到intent时同时可以去除extra内容给intent用)]
package android.provider;

@Deprecated
public final class Contacts$Intents$UI
{
public static final String LIST_DEFAULT = "com.android.contacts.action.LIST_DEFAULT";
public static final String LIST_GROUP_ACTION = "com.android.contacts.action.LIST_GROUP";
public static final String GROUP_NAME_EXTRA_KEY = "com.android.contacts.extra.GROUP";
public static final String LIST_ALL_CONTACTS_ACTION = "com.android.contacts.action.LIST_ALL_CONTACTS";
public static final String LIST_CONTACTS_WITH_PHONES_ACTION = "com.android.contacts.action.LIST_CONTACTS_WITH_PHONES";
public static final String LIST_STARRED_ACTION = "com.android.contacts.action.LIST_STARRED";
public static final String LIST_FREQUENT_ACTION = "com.android.contacts.action.LIST_FREQUENT";
public static final String LIST_STREQUENT_ACTION = "com.android.contacts.action.LIST_STREQUENT";
public static final String TITLE_EXTRA_KEY = "com.android.contacts.extra.TITLE_EXTRA";
public static final String FILTER_CONTACTS_ACTION = "com.android.contacts.action.FILTER_CONTACTS";
public static final String FILTER_TEXT_EXTRA_KEY = "com.android.contacts.extra.FILTER_TEXT";

public Contacts$Intents$UI()
{
throw new RuntimeException("Stub!");
}
}

在设计ContentProvider和对它们进行操作的活动时,用到此模式,在接口或类中定义intent常量使intent明确.[也就是说在资源包装器中设置好资源包装器需要调用的intent]

五、intent类别
描述:在注册时可以设置intent类别
<intent-filter>
<action android:name="android.intent.action.GET_CONTENT" />
<data android:scheme="http” />
//注册此intent接受的URI协议
<category android:name="类别" />
//注册此intent类别
</intent-filter>


通过PacKageManager对象可以获得与某intent匹配的活动。
Intent mainIntent = new Intent(intent.xx,null);// intent.xx活动集合
mainIntent.addCategory(intent.类别c);//定义类别
PacKageManager pm = getPackageManager();
List<ResolverInfo> list=pm.queryIntentActivities(mainIntent,0);

上面代码可以获得所有在xx活动种类下的intent且类别是类别C的intent集合list.

即在定义的intent的活动集合下寻找类别是x[自己定义的]intent

六、intent解析组件规则
名称->特性->数据->类别;
如果名称只对应一个组件则执行,否则进入特性。
如果特性下只有一个组件则执行,如果有多个则提供活动选择器。
如果没有特写设置,则进入数据,根据uri查看数据选择可以执行此uri的组件。
如果没有设置特性,和数据则进入类别,android挑选与类别匹配的活动。

七、startActivity()与starActivityForResult()
前者无返回,后者有返回
starActivityForResult(intent x,int requestCode);
使用starActivityForResult是会调用onActivityResult(3参数)方法

八、GET_CONTENT操作
通过设置传入的intent的MIME类别来获得一个特定的MIME类型项。
在注册时需要对intent设置它能具有的MIME类别。
<intent-filter android:label="@string/resolve_edit">
<action android:name="android.intent.action.VIEW" />
<data android:mimeType="vnd.android.cursor.item/vnd.google.note" />
//MIME类别
</intent-filter>


2011-7-1
poolo
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值