设为首页收藏本站
机战Z2破界篇 星组汉化 下载

星组游戏论坛

 找回密码
 注册(QQ注册+邀请注册)

QQ登录

只需一步,快速开始

查看: 1124|回复: 2

[心得] Intent总结 [复制链接]

Rank: 11Rank: 11Rank: 11Rank: 11

UID
98176
星币
29
积分
13
阅读权限
90
注册时间
2013-4-11
最后登录
2014-8-26
发表于 2013-5-28 16:17:20 |显示全部楼层
本帖最后由 独自等待 于 2013-5-28 16:29 编辑 5 q2 I# i0 R) g9 {7 j1 b
( a9 u7 f) _% l/ ]2 `' L

使用IntentIntentFile进行通信

1 使用Intent启动系统组件

Android的应用程序包含三种重要组件:ActivityServiceBroadcastReceiver,应用程序采用了一致的方式来启动他们——都是依靠Intent来进行启动的,Intent就封装了程序想要启动程序的意图,不仅如此,intent还可以用于被启动组件交换信息。

1.bmp

2.bmp

+ m% W9 C* y; Y) m$ z5 C! P: y

* E* }  B' D& I1 h# c! r3 N
! i* i* _) l9 S! }5 O. \7 K3 @3 T; z& R

Intent对象大致包含Component、Action、Category、Data、Type、Extra、和Flag这七种属性。其中Component用于明确指定需要启动的目标组件,而Extra则用于“携带”需要交换的数据。

; Y- u  D. ~; @. _

2 Intent的属性及intent-filter配置


+ h* A' t( k& }7 O6 K' T

2.1 Component属性

Intent的Component属性需要接受一个ComponentName对象,ComponentName对象包含如下几个构造器。
+ m0 ?  \* Z$ i8 oComponentName(String pkg,String cls):创建pkg所在包下的cls类所对应的组件。
  [  X2 s9 b' x# \( b% r$ \ComponentName(Context pkg,String cls):创建pkg所对应的包下的cls类所对应的组件。: l5 h8 y/ Z' Z+ \9 `1 o
ComponentName(Context pkg,Class<?>  cls):创建pkg所对应的包下的cls类所对应的组件。
" `8 X$ B. U, b3 ]6 x2 L9 P上面所构造的组件本质就有一个,这说明创建ComponentName需要制定包名和类名——这就可唯一的确定一个组件类,这样应用程序即可根据给定的组件去启动特定的组件了。9 M* I7 |' b" U3 R
下面程序段示范了如何通过Intent的Component属性来启动另一个Activity。4 A7 v3 ^8 Y. H  L
            //创建一个ComponentName对象
0 w  \, a' i6 Y, H& w                            ComponentNamecomp = new ComponentName(ComponentAttr.this4 U/ f1 K# y  P% y2 v% s& y9 c
                                   ,SecondActivity.class);
* ?0 b6 Y* e3 s8 O, C% a# w                            Intentintent = new Intent();
) d. e, f+ W1 W& u8 ^                            //为Intent设置Component属性/ s1 }# Y) S( _
                            intent.setComponent(comp);( s' }4 |6 R2 {& G# \8 s. [
                            startActivity(intent);
" V: M" y" I0 h5 |) u8 q3 z+ U2.2 Action、Category属性与intent-filter配置
+ i+ V  `% y& O( u# MIntent的Action、Category属性都是一个普通的字符串,其中Action代表该Intent所要完成的一个抽象“动作”,而Category则用于为Action增加额外的附加类别信息
6 a- e& f5 H* kAction要完成的只是一个抽象的动作,这个动作的具体由哪个组件来完成,Action这个字符串本身并不管。具体看什么、启动哪个Activity取决于Activity的<intent-filter…>配置。
" I1 Y* [- b) S* P            //创建Intent对象
$ f/ Z8 k- J4 k8 V0 X  \7 {" L& s                            Intentintent = new Intent();0 f5 W& u0 h$ G! Q! A) L7 G: _
                            //为Intent设置Action属性(属性值就是一个普通字符串)
# O& {9 l7 Q$ z5 z# T$ J                            intent.setAction(ActionAttr.CRAZYIT_ACTION);& X, ^0 r1 x' T# Q* Z+ y
                            startActivity(intent);/ P- |6 m; b- v) c, f
   上面的程序段根据Intent来启动Activity——但该Intent并未以硬编码的方式指定启动哪个Activity
4 j/ b# o6 ^6 n0 G- `需要指出的是,一个Intent对象最多只能包括一个Action属性,程序可调用Intent的setAction(String str)方法来设置Action属性值;但一个Intent对象可以包含多个Category属性,程序可以调用Intent的addCategory(String str)方法来添加Category属性。
  ~8 X7 a+ o/ \
) k: w1 Y7 q/ I5 n4 G  C5 `4 P* {" z( A

2.3 指定Action、Category调用系统Activity


) d, z4 n$ S! k% ^3 ]; w% N 3.bmp
4.bmp
5.bmp

. d$ `5 t! N7 p6 [! E
! v% h: Z! B! B3 s6 }# q/ H; l% p

2.4 DataType属性与intent-filter配置

Data属性通常用于向Action属性提供操作的数据。8 F: |! {+ b) ?% u) o8 U- t- L
Type属性则用于明确指定Data属性所指定数据的类型或MIME类型,通常来说,当Intent不指定Data属性的时候Type属性才会起作用,否则Android系统将会根据Data属性值来分析数据的类型,因此无需指定Type属性
. Z- d- {* u1 l* m1 J
% j! S8 }* ^. y9 Q7 F: [6 ~

2.5Extra属性

IntentExtra属性通常用于在多个Action之间进行数据交换,IntentExtra属性值应该是一个Bundle对象,Bundle对象可以存入多组key-value对,这样可以就通过Intent在不同Activity之间进行数据交换了9 g, k$ D) E7 m0 l: M1 D/ I" L4 n2 P/ E7 m
  ]5 d9 U* S. x. E- ?


9 S% x2 ~4 s+ c* I+ r9 D, I! C

总结个人理解


" R5 l) @/ \2 q1 c

Intent主要应用于跳转activity以及不同组件间的跳转,还可以组件间的通讯,两个Activity可以把数据封装在Bundle对象,然后使用Intent来携带Bundle对象

主要介绍下不同Activity间跳转:
5 l: j' s+ K# N上面介绍了Intent的属性,这些属性说白了就是控制Intent跳转的不同方式
8 N* c& r" N# U5 A( t  [0 h9 ?& A. j3 f/ A& Y

1 我们通常用的

Intent intent = new Intent();
& N* i) e  `9 {intent.setClass(DengLu.this,FormStuffActivity.class);( \/ y% _0 i: G1 k* {
startActivity(intent);: y3 D6 A/ g. `' k+ z

* x1 C* V( \- U/ k+ A- _

2 用Component属性的跳转

ComponentName comp = newComponentName(ComponentAttr.this, SecondActivity.class);
, v4 Y* Z  H. {  b% Q" Q! xIntent intent = new Intent();2 N2 p2 W0 `, n# o& E
intent.setComponent(comp); //Intent设置Component属性
6 _6 q0 m. ]; YstartActivity(intent);; @' P* I" @$ y$ F& x. s6 h+ V' h
其实这个的简写和我们常用的很相似
0 w/ I4 V5 q4 D+ n1 ~# O7 p+ T8 ^0 }Intent intent = newIntent(ComponentAttr.this, SecondActivity.class);
+ t% @) m& c0 {9 \9 u6 @: o' rstartActivity(intent);
, ?) O% U. ~, e6 L* B# X+ `& j这个属性主要是通过包名、类名来确定唯一的Activity进行跳转: _, Q! N& F% Y8 U3 {" F

) e: U% B5 T# h: X. ~& y

3.至于ActionCategory属性,更像是通过设定条件来跳转到指定的Activity

例如:* P& {8 D9 `$ u* q" f
Intent intent = new Intent();
6 s* @( T$ q) Y! d; ^$ z1 Y/ Y" Bintent.setAction(ActionAttr.CRAZYIT_ACTION);$ p+ K  X9 \4 w9 _1 `. k! Q% @
startActivity(intent);
) B. T: L& U9 g3 `8 o4 E2 a# L编码并没有指定要跳到哪个Activity,要知道跳到哪个Activity,就要看哪个Activity满足他的跳转条件,本程序就是跳到在<intent-filter>中有这样设置的Activity1 @, j3 J1 J- _# z8 _$ n- Z
<actionandroidname=”org.crazyit.intent.action.CRAZYIT_ACTION”/>/ D8 W0 n: ~% F" ?: t; S
上面也提到了些ActionCategory标准
. q, T8 F* H$ i6 D. l; I( V 再举个例子
) d* w; |# a, cIntent.setActionIntent.ACYION_MAIN;
; I8 X: r9 j  N' MIntent.addCategoryIntent.CATEGORY_HOME);
0 W$ v! y* F. j# }; u/ t" W& H% l这样设置后将跳转到桌面,因为同时满足条件的就是HOME桌面
8 B$ d3 c( \" d+ j1 j, z$ ?+ F+ ]' b$ _0 t6 s

4 DateType属性更接近跳到一个由data数据指定的地址

例如:String data=”http://www.baidu.com”;
5 e0 d' k) m  X) r  ~Uriuri=Uri.parse(data);5 W9 [! i& O1 `
Intent.setAction(Intent.ACTION_VIEW);& w0 u; G, Q" k8 u# f5 G
Intent.setData(uri);( }' k, _9 b$ S  n
将会打开指定网页,当然地址也可以是本地的系统信息$ m: x0 B/ k; ]

" f) K6 T( a& }2 ?6 m3 W' u& b
% p  ^9 j6 T& T
头像被屏蔽

禁止发言

UID
114664
星币
11
积分
1
阅读权限
0
注册时间
2016-2-29
最后登录
2016-10-25
发表于 2016-3-12 23:17:51 |显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
头像被屏蔽

禁止发言

UID
115225
星币
59
积分
348
阅读权限
0
注册时间
2016-7-25
最后登录
2017-10-24
发表于 2016-8-12 22:01:41 |显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

Archiver|星组游戏论坛 ( 京公网安备110403080002 )  

GMT+8, 2018-10-23 15:31

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部