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

星组游戏论坛

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

QQ登录

只需一步,快速开始

查看: 1049|回复: 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 编辑 2 q: Z5 x0 ~0 K
" Z3 P+ ?* C7 G  @# C' b

使用IntentIntentFile进行通信

1 使用Intent启动系统组件

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

1.bmp

2.bmp

$ B4 I0 ~$ i0 Z/ f2 B! S
3 k! c8 c3 I6 B8 [& \" O% ?  n, L3 Q

3 y- X2 n, d* f, {4 @8 D' f7 |% C, e: j% _

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

$ N, o9 {( m8 ^: @

2 Intent的属性及intent-filter配置


2 m" B1 w7 p0 I) F. L

2.1 Component属性

Intent的Component属性需要接受一个ComponentName对象,ComponentName对象包含如下几个构造器。, z- @2 c7 k+ G
ComponentName(String pkg,String cls):创建pkg所在包下的cls类所对应的组件。  o7 C/ {* M: W
ComponentName(Context pkg,String cls):创建pkg所对应的包下的cls类所对应的组件。
3 I* B6 _- e& X3 C. V; [, `ComponentName(Context pkg,Class<?>  cls):创建pkg所对应的包下的cls类所对应的组件。8 j9 c/ V2 Z5 g6 u' E& A
上面所构造的组件本质就有一个,这说明创建ComponentName需要制定包名和类名——这就可唯一的确定一个组件类,这样应用程序即可根据给定的组件去启动特定的组件了。
% ^1 q% R* E$ n5 A3 M4 l6 W下面程序段示范了如何通过Intent的Component属性来启动另一个Activity。
3 h6 N7 A, q/ d& D; n            //创建一个ComponentName对象- x, D  @) A7 s2 Z: R2 P
                            ComponentNamecomp = new ComponentName(ComponentAttr.this
6 q* Y9 f0 J  F/ b' ^# Q/ G                                   ,SecondActivity.class);. _$ d- v" e5 w9 l, H
                            Intentintent = new Intent();4 O1 U% S0 u/ }# I7 o. D
                            //为Intent设置Component属性2 g3 T, y2 q0 Y5 u2 f
                            intent.setComponent(comp);$ Y+ S4 m* b5 P$ G$ @  [, O7 |2 T. g
                            startActivity(intent);
5 n0 n  ]% K8 z( Z4 W" F2.2 Action、Category属性与intent-filter配置3 A9 s& r1 c+ a
Intent的Action、Category属性都是一个普通的字符串,其中Action代表该Intent所要完成的一个抽象“动作”,而Category则用于为Action增加额外的附加类别信息
& L  c, w; B, e5 a& iAction要完成的只是一个抽象的动作,这个动作的具体由哪个组件来完成,Action这个字符串本身并不管。具体看什么、启动哪个Activity取决于Activity的<intent-filter…>配置。
% p, A4 ~  M& v            //创建Intent对象! O; u5 ~2 b- o& g5 i# c
                            Intentintent = new Intent();% r+ }+ p3 n0 J" ?! J% w  j0 ]
                            //为Intent设置Action属性(属性值就是一个普通字符串)) @2 x" t7 g. g& a# v
                            intent.setAction(ActionAttr.CRAZYIT_ACTION);
5 J; r  _5 r& \6 Z                            startActivity(intent);
9 K' W) q2 ~6 v; G! g2 {   上面的程序段根据Intent来启动Activity——但该Intent并未以硬编码的方式指定启动哪个Activity/ _+ J& |/ R1 o3 z7 b" l: L, \( m
需要指出的是,一个Intent对象最多只能包括一个Action属性,程序可调用Intent的setAction(String str)方法来设置Action属性值;但一个Intent对象可以包含多个Category属性,程序可以调用Intent的addCategory(String str)方法来添加Category属性。) i: @5 E3 O0 n/ c

1 b. f, z, J0 N$ V3 e; i' {& }
- l% J4 @+ i7 W$ x( I  a

2.3 指定Action、Category调用系统Activity


; i# [! s+ e3 V9 g, l0 b 3.bmp
4.bmp
5.bmp

3 D3 B+ E# D, A
" ^, d: Y( |1 x% `8 y# M( m

2.4 DataType属性与intent-filter配置

Data属性通常用于向Action属性提供操作的数据。
9 m4 l) P+ n& G- @6 U* wType属性则用于明确指定Data属性所指定数据的类型或MIME类型,通常来说,当Intent不指定Data属性的时候Type属性才会起作用,否则Android系统将会根据Data属性值来分析数据的类型,因此无需指定Type属性+ ~" \/ U: w. R/ i3 {4 M  f

2 I# t4 w9 I% \* T; }

2.5Extra属性

IntentExtra属性通常用于在多个Action之间进行数据交换,IntentExtra属性值应该是一个Bundle对象,Bundle对象可以存入多组key-value对,这样可以就通过Intent在不同Activity之间进行数据交换了
  O, g- n2 M8 f* E9 p+ s
) v/ l/ x0 f/ {' \1 @& l. u8 @


5 t5 V8 W) n7 z* f# J

总结个人理解

; S0 w! Q" [8 G3 s1 P" ?

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

主要介绍下不同Activity间跳转:
0 J) s3 ~0 `3 u1 K+ z6 p, [上面介绍了Intent的属性,这些属性说白了就是控制Intent跳转的不同方式
. }+ p, T  f- f' k4 k
- h0 Q) R5 P1 M8 l

1 我们通常用的

Intent intent = new Intent();/ N0 m6 |. ~. `1 X$ x# |
intent.setClass(DengLu.this,FormStuffActivity.class);
! e' k4 {1 c( t6 K3 ?" Y. ZstartActivity(intent);+ P# Q4 g& j* @5 \+ Y& F& j$ F

/ Y4 G! [/ f& E$ d& S

2 用Component属性的跳转

ComponentName comp = newComponentName(ComponentAttr.this, SecondActivity.class);
" S& @& b+ s) O. pIntent intent = new Intent();
. k( r) J. ~: ~: X; gintent.setComponent(comp); //Intent设置Component属性
5 u6 h/ o& |9 n0 Q6 s5 AstartActivity(intent);
: k, C+ I: }- k, M  R: Z其实这个的简写和我们常用的很相似8 D' O- B, o- b% N1 }2 G
Intent intent = newIntent(ComponentAttr.this, SecondActivity.class);$ s  N, W! l) b7 S
startActivity(intent);8 m; O5 \1 g& n2 ^) d, X
这个属性主要是通过包名、类名来确定唯一的Activity进行跳转8 Y# u( H1 W; y! M7 g* T1 r3 G
1 {: F; {8 ^* v4 }  F% p5 f4 x: a- z

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

例如:
7 z7 |( ~/ G* L4 X# A5 C0 `Intent intent = new Intent();
# z) \' U% h5 R* D4 r+ X4 Tintent.setAction(ActionAttr.CRAZYIT_ACTION);5 x; {5 a; e& |5 K6 p1 j" k
startActivity(intent);( L' y. V; i& O( d; y: `
编码并没有指定要跳到哪个Activity,要知道跳到哪个Activity,就要看哪个Activity满足他的跳转条件,本程序就是跳到在<intent-filter>中有这样设置的Activity7 V9 i- \8 x! T! R, K( g
<actionandroidname=”org.crazyit.intent.action.CRAZYIT_ACTION”/>* t/ q" j- w( {% M" a7 _- P* f/ J  j
上面也提到了些ActionCategory标准
' k2 q$ m/ E7 h3 T9 C 再举个例子7 ~: m. H0 J& e& n3 A' `
Intent.setActionIntent.ACYION_MAIN;
$ G3 t# F0 [9 R$ Z* C7 @7 {6 B9 vIntent.addCategoryIntent.CATEGORY_HOME);. n6 J% `' r. U/ A6 V- D
这样设置后将跳转到桌面,因为同时满足条件的就是HOME桌面8 H8 f0 `$ e% f  p( o1 S
' o/ T1 D% @3 X# L! t

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

例如:String data=”http://www.baidu.com”;2 ?+ @' x# `' A3 s- H/ P
Uriuri=Uri.parse(data);
) B. Z) g0 P4 X5 r0 b* J" ^0 K4 qIntent.setAction(Intent.ACTION_VIEW);0 k3 R; N3 I& |
Intent.setData(uri);  Z% z, N0 C8 y
将会打开指定网页,当然地址也可以是本地的系统信息
& H. H% l/ C8 @. _2 p& g4 V/ \6 n! [5 i+ P4 R

/ e- t4 S! C1 P( ^6 J9 d5 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-6-23 02:32

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部