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

星组游戏论坛

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

QQ登录

只需一步,快速开始

查看: 1080|回复: 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 编辑
$ V  c$ n; s. x6 t, P- A
# j0 J; r) f/ H& k/ s

使用IntentIntentFile进行通信

1 使用Intent启动系统组件

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

1.bmp

2.bmp

1 @  [/ H( ^3 |" M4 Z# T2 b7 Z

& \3 h/ M1 I! L$ J7 I, E5 W- m4 ], b. \* N
/ G) A, [/ l$ _1 D

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

: J8 p& l' A" W( X" A- ?. ]

2 Intent的属性及intent-filter配置


7 s+ N* R# I" ]' g; K

2.1 Component属性

Intent的Component属性需要接受一个ComponentName对象,ComponentName对象包含如下几个构造器。
8 e- C: n, }) I7 l% X" DComponentName(String pkg,String cls):创建pkg所在包下的cls类所对应的组件。
- X+ ?; _" d. L6 p) f  TComponentName(Context pkg,String cls):创建pkg所对应的包下的cls类所对应的组件。
7 f. d" P3 X. x, B6 ?8 b1 I! k4 JComponentName(Context pkg,Class<?>  cls):创建pkg所对应的包下的cls类所对应的组件。+ J6 F" `: Y4 s7 |& R0 A3 S
上面所构造的组件本质就有一个,这说明创建ComponentName需要制定包名和类名——这就可唯一的确定一个组件类,这样应用程序即可根据给定的组件去启动特定的组件了。
- F4 |9 O# D3 z9 T: j. q1 P/ M下面程序段示范了如何通过Intent的Component属性来启动另一个Activity。
" ]8 s/ G5 ~* M/ a            //创建一个ComponentName对象" O$ d8 o$ @& X$ P; w" B$ l, \) @
                            ComponentNamecomp = new ComponentName(ComponentAttr.this0 f2 H' C# }' G$ H
                                   ,SecondActivity.class);4 i( @/ d' V1 r8 y! C. a
                            Intentintent = new Intent();
+ u6 V- e' t; t# {                            //为Intent设置Component属性7 a5 T; p* j  f" W
                            intent.setComponent(comp);; r' I/ I9 E1 d6 r# D, K2 L
                            startActivity(intent);; s& M& {* d( m
2.2 Action、Category属性与intent-filter配置
- {2 `) a1 K0 B9 O) fIntent的Action、Category属性都是一个普通的字符串,其中Action代表该Intent所要完成的一个抽象“动作”,而Category则用于为Action增加额外的附加类别信息/ ^- i/ z' f0 ~$ k/ b* w! G' L
Action要完成的只是一个抽象的动作,这个动作的具体由哪个组件来完成,Action这个字符串本身并不管。具体看什么、启动哪个Activity取决于Activity的<intent-filter…>配置。* r( R$ H. E. }6 Z/ W  T0 ?" w
            //创建Intent对象
. F' r4 t, o. d; _8 V  ^                            Intentintent = new Intent();, |5 f" P* ^1 m
                            //为Intent设置Action属性(属性值就是一个普通字符串)
7 n( ]) D4 e8 a8 C- Z                            intent.setAction(ActionAttr.CRAZYIT_ACTION);
  `. T" g. N6 s                            startActivity(intent);0 O( H7 v3 f; b6 Y% u
   上面的程序段根据Intent来启动Activity——但该Intent并未以硬编码的方式指定启动哪个Activity2 f- J4 a* W5 V# S6 Q
需要指出的是,一个Intent对象最多只能包括一个Action属性,程序可调用Intent的setAction(String str)方法来设置Action属性值;但一个Intent对象可以包含多个Category属性,程序可以调用Intent的addCategory(String str)方法来添加Category属性。
7 T, _! C  c/ P; t8 \6 T ) D0 A0 ^, l" r! u

2 p3 ^% f: G# ]6 j+ X

2.3 指定Action、Category调用系统Activity

+ Y* ]3 h0 |0 ]
3.bmp
4.bmp
5.bmp
9 l2 T3 u  ]6 r- p+ T

! C) v0 j% \7 B4 h& @7 t

2.4 DataType属性与intent-filter配置

Data属性通常用于向Action属性提供操作的数据。, F( N1 X! P8 P" ~. _
Type属性则用于明确指定Data属性所指定数据的类型或MIME类型,通常来说,当Intent不指定Data属性的时候Type属性才会起作用,否则Android系统将会根据Data属性值来分析数据的类型,因此无需指定Type属性
0 ?8 e8 \6 w/ D
! \9 B- X) C4 H

2.5Extra属性

IntentExtra属性通常用于在多个Action之间进行数据交换,IntentExtra属性值应该是一个Bundle对象,Bundle对象可以存入多组key-value对,这样可以就通过Intent在不同Activity之间进行数据交换了
0 z0 L0 Z+ f4 U' m3 l. A  K* t. S! p- C8 h" b


/ y0 l+ h" F" d) Y- h2 B

总结个人理解

, p8 }! {7 I3 j$ E9 r

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

主要介绍下不同Activity间跳转:
/ @3 P0 i2 ^; B. [上面介绍了Intent的属性,这些属性说白了就是控制Intent跳转的不同方式
6 p* i2 V. s- d, U& L- z( H2 ?# ?# i& O( m* ^0 T  E

1 我们通常用的

Intent intent = new Intent();; X9 x8 d5 W7 F& |+ }! `) l
intent.setClass(DengLu.this,FormStuffActivity.class);
6 ]$ u. Y3 `: k9 h4 X9 sstartActivity(intent);
( C1 t8 w8 I" B5 X9 ^9 j  {4 T  l1 h5 z( C. G. [

2 用Component属性的跳转

ComponentName comp = newComponentName(ComponentAttr.this, SecondActivity.class);
. n1 ~9 w! Y* |6 EIntent intent = new Intent();
3 W# E0 }4 `+ j8 r  L1 _/ _6 ?4 cintent.setComponent(comp); //Intent设置Component属性
' Z9 h; E/ n2 ~5 Q8 n3 DstartActivity(intent);
5 ^6 v% e; E0 k# @其实这个的简写和我们常用的很相似
5 \1 H# ?8 y7 A+ D0 A( a0 @Intent intent = newIntent(ComponentAttr.this, SecondActivity.class);
7 d8 w% I8 ?9 Q8 d4 [0 DstartActivity(intent);9 m/ ^: J  G( f# W, K: K& _" `
这个属性主要是通过包名、类名来确定唯一的Activity进行跳转
: v  Q& N) `( P& E6 W) o4 K" g0 C: ]4 f. N5 g+ z% l/ O

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

例如:
" B6 f# \' N; W9 B0 e: KIntent intent = new Intent();
) i/ L4 f% z6 _# u! ointent.setAction(ActionAttr.CRAZYIT_ACTION);7 P# i$ V  X. }4 }, ~$ c- h0 O
startActivity(intent);1 B/ Q* _8 K, y( q8 `% t
编码并没有指定要跳到哪个Activity,要知道跳到哪个Activity,就要看哪个Activity满足他的跳转条件,本程序就是跳到在<intent-filter>中有这样设置的Activity
2 I4 w9 `9 l0 o<actionandroidname=”org.crazyit.intent.action.CRAZYIT_ACTION”/>
' k4 U- ?7 S9 r" f, O上面也提到了些ActionCategory标准
& O; l8 p- e3 C' q: c 再举个例子
% C. R' I' V( z1 V: YIntent.setActionIntent.ACYION_MAIN;
( U$ e) W( ?( ^8 k- |Intent.addCategoryIntent.CATEGORY_HOME);- Z3 ^. |9 T* i3 u* V; w
这样设置后将跳转到桌面,因为同时满足条件的就是HOME桌面
7 P5 t: ]* d/ ]6 M7 q! u) U- J5 O

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

例如:String data=”http://www.baidu.com”;9 m& J6 T+ p0 Q- Y1 i) @( A" Z
Uriuri=Uri.parse(data);* {- H) v6 E- o' ]9 n) e
Intent.setAction(Intent.ACTION_VIEW);
$ z3 Z: e1 t: R2 K7 T$ UIntent.setData(uri);6 J; M! F7 b' h- C9 I
将会打开指定网页,当然地址也可以是本地的系统信息2 g2 l- ^# o' P0 G0 g0 a0 Q' ?$ k

% v6 H7 U( c6 I
4 I- m; k6 G+ i2 M4 w2 F9 O( k
头像被屏蔽

禁止发言

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-8-17 19:47

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部