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

星组游戏论坛

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

QQ登录

只需一步,快速开始

查看: 1222|回复: 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 编辑 ) a2 G6 P! h: `( u

' C& N8 m1 S* Q

使用IntentIntentFile进行通信

1 使用Intent启动系统组件

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

1.bmp

2.bmp


  I  m/ [: a* Y! H% W; x. @1 N3 V$ n
- |; g7 \' Q" o7 x) K% E# K

/ G! V% M! A* {; _7 X' U

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

7 s" t3 y4 Y& C3 X+ {& c

2 Intent的属性及intent-filter配置

- Y6 D. d5 I' f  X. W% I, a  {  T

2.1 Component属性

Intent的Component属性需要接受一个ComponentName对象,ComponentName对象包含如下几个构造器。
9 f& B6 O: x9 o7 m9 kComponentName(String pkg,String cls):创建pkg所在包下的cls类所对应的组件。
2 W" @2 g" ^' dComponentName(Context pkg,String cls):创建pkg所对应的包下的cls类所对应的组件。) @! K; T( ]7 }9 Z8 k  D7 [
ComponentName(Context pkg,Class<?>  cls):创建pkg所对应的包下的cls类所对应的组件。/ }" o$ `6 A( N" n* b2 o. S2 P! M
上面所构造的组件本质就有一个,这说明创建ComponentName需要制定包名和类名——这就可唯一的确定一个组件类,这样应用程序即可根据给定的组件去启动特定的组件了。
4 v0 C5 i2 \5 H5 k# `下面程序段示范了如何通过Intent的Component属性来启动另一个Activity。
$ J' Q- L* ?7 {* f6 [. d7 X            //创建一个ComponentName对象
' v( D+ }4 ]. N                            ComponentNamecomp = new ComponentName(ComponentAttr.this
+ h6 G) \& v. J. Q, D9 D4 r% ]                                   ,SecondActivity.class);) I! H0 E7 j+ f; _2 O! U
                            Intentintent = new Intent();3 G8 [$ i. D( |5 V/ N
                            //为Intent设置Component属性9 A8 G& q9 W% z; f0 }; A
                            intent.setComponent(comp);
! n; P$ |8 V; u. v8 Q                            startActivity(intent);
; q( k/ |  d" N/ E3 J  D1 T7 V2.2 Action、Category属性与intent-filter配置) M& f6 h: f0 {6 a( R' z" u8 J
Intent的Action、Category属性都是一个普通的字符串,其中Action代表该Intent所要完成的一个抽象“动作”,而Category则用于为Action增加额外的附加类别信息
" d2 d, j0 H! c( \3 |. oAction要完成的只是一个抽象的动作,这个动作的具体由哪个组件来完成,Action这个字符串本身并不管。具体看什么、启动哪个Activity取决于Activity的<intent-filter…>配置。4 o) P: X) L5 `* }$ T, K1 S/ `
            //创建Intent对象& `3 B; \5 q9 b5 s7 y
                            Intentintent = new Intent();
' Z( v; G, d) T                            //为Intent设置Action属性(属性值就是一个普通字符串)& U$ T. R" X8 l) I/ x
                            intent.setAction(ActionAttr.CRAZYIT_ACTION);1 D8 P& b1 c' I
                            startActivity(intent);
* q* a, r5 l; D2 `4 H# a3 n* V   上面的程序段根据Intent来启动Activity——但该Intent并未以硬编码的方式指定启动哪个Activity
- A5 r) Q) q0 I2 J, j需要指出的是,一个Intent对象最多只能包括一个Action属性,程序可调用Intent的setAction(String str)方法来设置Action属性值;但一个Intent对象可以包含多个Category属性,程序可以调用Intent的addCategory(String str)方法来添加Category属性。: b1 h$ {0 q  @0 _3 B/ O
9 ?# a; Z& u% m6 S  G

* {' ]; ?7 S. D8 R+ `

2.3 指定Action、Category调用系统Activity


2 L$ y* C" h/ {1 E1 J% g2 M' a 3.bmp
4.bmp
5.bmp

& N4 n) X( N6 t; t7 b! y% g+ i
; A, K1 B- r* v6 {0 `  E  B; V( U  s

2.4 DataType属性与intent-filter配置

Data属性通常用于向Action属性提供操作的数据。: z( u5 p1 c' a$ S" T9 W4 c
Type属性则用于明确指定Data属性所指定数据的类型或MIME类型,通常来说,当Intent不指定Data属性的时候Type属性才会起作用,否则Android系统将会根据Data属性值来分析数据的类型,因此无需指定Type属性5 Y$ ]2 W2 A( u0 H8 d- p4 K
% Y" G* J/ k1 A5 f- h8 J3 P! P

2.5Extra属性

IntentExtra属性通常用于在多个Action之间进行数据交换,IntentExtra属性值应该是一个Bundle对象,Bundle对象可以存入多组key-value对,这样可以就通过Intent在不同Activity之间进行数据交换了
/ ?- Q, |* Q& r% `6 r" Q8 U" M7 `4 m$ k) T% f- [5 L# H6 k( g/ O7 N


2 B5 B( y! m  q7 {) }

总结个人理解


7 |2 E. ?4 z8 y3 g2 [) Z

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

主要介绍下不同Activity间跳转:
9 K( w! n* C& u# p) G8 q上面介绍了Intent的属性,这些属性说白了就是控制Intent跳转的不同方式; Y6 b8 W  m4 Q" t; b# E( Z  {

- ^" J! L: L- m- W- @8 r/ q

1 我们通常用的

Intent intent = new Intent();. f) {* [5 i& D+ s
intent.setClass(DengLu.this,FormStuffActivity.class);
. u4 b# O+ ^2 f$ ^6 NstartActivity(intent);2 Z0 d  ^# K* n) \9 x# P

" }: B2 x: _6 q; l1 f4 T

2 用Component属性的跳转

ComponentName comp = newComponentName(ComponentAttr.this, SecondActivity.class);
- l8 ~9 O; T6 ^3 J* R5 N" kIntent intent = new Intent();
/ K) x- i$ P1 @. f0 bintent.setComponent(comp); //Intent设置Component属性
  c- I& F( a2 k/ jstartActivity(intent);: H4 r4 m1 |+ X/ u0 z+ C+ R, v5 o
其实这个的简写和我们常用的很相似/ M' m0 H" e+ l1 h
Intent intent = newIntent(ComponentAttr.this, SecondActivity.class);
" `7 O* q8 e, J% ]& N8 p6 WstartActivity(intent);& h" R, j+ h& E2 G& Q: F' b
这个属性主要是通过包名、类名来确定唯一的Activity进行跳转  f$ O  m( u  A. g
/ v" T# Y7 v+ e* L% Z

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

例如:5 A' m- {9 W; R& L
Intent intent = new Intent();1 k1 ]; `2 M4 F( U9 K4 I9 c
intent.setAction(ActionAttr.CRAZYIT_ACTION);2 c0 M+ H  r+ |3 @, ?
startActivity(intent);( d$ ]2 O9 |2 n
编码并没有指定要跳到哪个Activity,要知道跳到哪个Activity,就要看哪个Activity满足他的跳转条件,本程序就是跳到在<intent-filter>中有这样设置的Activity  a2 e. U& v1 P0 I
<actionandroidname=”org.crazyit.intent.action.CRAZYIT_ACTION”/>
3 L2 G5 W! c( v( q上面也提到了些ActionCategory标准
/ T. i9 D! ?& X  x 再举个例子
  i' @6 s5 J7 W) e- f( {Intent.setActionIntent.ACYION_MAIN;8 f- v& b9 D# L: O4 F& s
Intent.addCategoryIntent.CATEGORY_HOME);
% K4 V; T7 A; _4 z9 m这样设置后将跳转到桌面,因为同时满足条件的就是HOME桌面
3 B4 }% Z7 B! p3 \" |0 Y
6 @  J% m# ^2 K) p

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

例如:String data=”http://www.baidu.com”;/ ^( N" \, @* T2 b( ?1 m
Uriuri=Uri.parse(data);' Z/ O, X  S$ Z& T$ K
Intent.setAction(Intent.ACTION_VIEW);& U) v/ P% f' e' [8 z+ s& _
Intent.setData(uri);
- n; x* _" C( q) ]6 f  `将会打开指定网页,当然地址也可以是本地的系统信息3 L0 e# ^! s+ X- P0 x' K

7 W5 w  \) h/ c/ {) H: Z
1 I; Q9 h, V' o; G6 b0 [
头像被屏蔽

禁止发言

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

Rank: 4

UID
115225
星币
59
积分
348
阅读权限
40
注册时间
2016-7-25
最后登录
2017-10-24
发表于 2016-8-12 22:01:41 |显示全部楼层
百年不遇的好帖子,不得不顶% p8 H3 |: D5 `( \

9 m2 D# f* {) L3 x  M
6 _# {) w2 G- `. F+ K$ t8 p7 y! O9 z* A% J, f7 j8 t- W. S3 A

" Z7 o/ T# C5 s7 |/ G0 ]& g5 B( R5 X8 \9 x. ^. m: K, B& u

3 j, h) k0 F: ]9 i# A* E, J. z  ], f0 s/ k- d$ F

3 T  f8 u) K, _7 T* |1 U7 x& |# F9 M4 D9 q3 q4 w/ O
. g+ G/ |, _2 K

% \8 B" Z3 o2 U; B0 s: n: H* g, _! ~; m( a+ ]  L
广西特产 广西同心米粉 网狼藤县米粉
发帖际遇:tsexe01 在网吧通宵,花了 1 星币.幸运榜 / 衰神榜

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

GMT+8, 2019-2-22 20:30

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部