MyException - 我的异常网
当前位置:我的异常网» Android » Android初学者日记3 intent

Android初学者日记3 intent

www.MyException.Cn  网友分享于:2013-06-27  浏览:23次
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

文章评论

鲜为人知的编程真相
鲜为人知的编程真相
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
代码女神横空出世
代码女神横空出世
Java程序员必看电影
Java程序员必看电影
每天工作4小时的程序员
每天工作4小时的程序员
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
程序员应该关注的一些事儿
程序员应该关注的一些事儿
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
10个调试和排错的小建议
10个调试和排错的小建议
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
如何成为一名黑客
如何成为一名黑客
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
中美印日四国程序员比较
中美印日四国程序员比较
总结2014中国互联网十大段子
总结2014中国互联网十大段子
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
老程序员的下场
老程序员的下场
 程序员的样子
程序员的样子
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
漫画:程序员的工作
漫画:程序员的工作
程序员和编码员之间的区别
程序员和编码员之间的区别
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
为什么程序员都是夜猫子
为什么程序员都是夜猫子
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
那些争议最大的编程观点
那些争议最大的编程观点
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
一个程序员的时间管理
一个程序员的时间管理
我的丈夫是个程序员
我的丈夫是个程序员
程序员必看的十大电影
程序员必看的十大电影
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
编程语言是女人
编程语言是女人
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
程序员的鄙视链
程序员的鄙视链
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有