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

星组游戏论坛

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

QQ登录

只需一步,快速开始

查看: 1164|回复: 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 编辑 ; m# {9 y3 o8 n' h

  W% l. x( O% D; f

使用IntentIntentFile进行通信

1 使用Intent启动系统组件

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

1.bmp

2.bmp


* {2 v' M0 t) q) U# a1 O) e  q  |
3 R. d; y7 u# ]: Z, k& d3 o! y  y4 ~0 y& G4 T0 p6 ?: ^
% ^5 w+ G" b. c: M

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


+ H7 z1 G7 f; A; y# d" v; L

2 Intent的属性及intent-filter配置

" C9 }# }* b/ {! u

2.1 Component属性

Intent的Component属性需要接受一个ComponentName对象,ComponentName对象包含如下几个构造器。, O, [- s. ^( U0 _1 f) B0 d
ComponentName(String pkg,String cls):创建pkg所在包下的cls类所对应的组件。
' S7 L# `" @# n) iComponentName(Context pkg,String cls):创建pkg所对应的包下的cls类所对应的组件。+ J9 I8 @' `  U: N7 G; f
ComponentName(Context pkg,Class<?>  cls):创建pkg所对应的包下的cls类所对应的组件。
6 k( i2 `' P* _8 P4 ?; @0 K1 B上面所构造的组件本质就有一个,这说明创建ComponentName需要制定包名和类名——这就可唯一的确定一个组件类,这样应用程序即可根据给定的组件去启动特定的组件了。
7 i9 i  e5 k3 C下面程序段示范了如何通过Intent的Component属性来启动另一个Activity。* Q2 ^' B- U9 M3 O- |- A
            //创建一个ComponentName对象
7 m* a3 G$ r# j! T                            ComponentNamecomp = new ComponentName(ComponentAttr.this
, r7 }2 C  ]! ~- c8 H" a  ]                                   ,SecondActivity.class);6 n8 E  q# Q: A
                            Intentintent = new Intent();. s" [1 m& a/ n. _
                            //为Intent设置Component属性7 r1 d0 L2 B! R$ x5 ^" U0 S1 o- j- w
                            intent.setComponent(comp);
4 U7 S/ e7 }' Q. U% z, E9 A1 x6 P                            startActivity(intent);5 J4 c% K/ R% n
2.2 Action、Category属性与intent-filter配置
( D& _. [; K6 uIntent的Action、Category属性都是一个普通的字符串,其中Action代表该Intent所要完成的一个抽象“动作”,而Category则用于为Action增加额外的附加类别信息
% n& H) B. K) c" @4 V9 kAction要完成的只是一个抽象的动作,这个动作的具体由哪个组件来完成,Action这个字符串本身并不管。具体看什么、启动哪个Activity取决于Activity的<intent-filter…>配置。8 f: S, W4 h  j7 B6 L1 }
            //创建Intent对象
# X4 j6 ?. ^- \- h6 G7 E                            Intentintent = new Intent();' {/ y2 C' R3 m1 @8 ]9 h
                            //为Intent设置Action属性(属性值就是一个普通字符串)6 ~/ s% o# ~3 J
                            intent.setAction(ActionAttr.CRAZYIT_ACTION);
5 j4 @5 I" T* J$ N                            startActivity(intent);6 T" c. U1 H8 r0 @5 T1 [
   上面的程序段根据Intent来启动Activity——但该Intent并未以硬编码的方式指定启动哪个Activity
3 R8 s9 F0 v3 }8 ^- H% q/ F需要指出的是,一个Intent对象最多只能包括一个Action属性,程序可调用Intent的setAction(String str)方法来设置Action属性值;但一个Intent对象可以包含多个Category属性,程序可以调用Intent的addCategory(String str)方法来添加Category属性。) @+ F# C6 x  r2 b- L+ c
: k1 @* g$ I% ?. ]8 s' q
* J5 h6 V3 q2 w! x  W: X/ z

2.3 指定Action、Category调用系统Activity

7 f0 m) l' E" L5 {) R3 @5 g' \
3.bmp
4.bmp
5.bmp

2 U! C3 j7 B7 b$ [9 J& }8 k3 k( x  i3 M) f  x, k" X

2.4 DataType属性与intent-filter配置

Data属性通常用于向Action属性提供操作的数据。
3 {8 t$ |4 }) y  [0 `& p6 k, W# }* YType属性则用于明确指定Data属性所指定数据的类型或MIME类型,通常来说,当Intent不指定Data属性的时候Type属性才会起作用,否则Android系统将会根据Data属性值来分析数据的类型,因此无需指定Type属性
0 K6 I1 ]1 ~: D / `* n, \- \1 ~% s! W% F, v- O

2.5Extra属性

IntentExtra属性通常用于在多个Action之间进行数据交换,IntentExtra属性值应该是一个Bundle对象,Bundle对象可以存入多组key-value对,这样可以就通过Intent在不同Activity之间进行数据交换了# j+ W1 y9 T- J. ?% i

" m. o; r2 V: Q1 _8 E

8 x8 J7 E  e5 `; R' j/ z

总结个人理解

% d6 Y" X. c0 T6 M

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

主要介绍下不同Activity间跳转:7 o( Q5 j' [' ?; G4 a
上面介绍了Intent的属性,这些属性说白了就是控制Intent跳转的不同方式/ a; _. P! f' ?- e! ~0 @7 s& Z8 o

# o5 w- J3 D4 v

1 我们通常用的

Intent intent = new Intent();
- f! G$ S7 Y5 Q$ S5 B, o8 nintent.setClass(DengLu.this,FormStuffActivity.class);
4 e6 R7 K$ ~( e5 W& ~9 XstartActivity(intent);
$ A0 u: m* q) a* [6 V
  k1 v; G: L  Q8 t  Z

2 用Component属性的跳转

ComponentName comp = newComponentName(ComponentAttr.this, SecondActivity.class);0 h0 i3 ~" B- M" b5 @
Intent intent = new Intent();# R# A9 F$ I$ K, }3 U( u/ W$ `2 V
intent.setComponent(comp); //Intent设置Component属性
- B3 I% J2 I; |/ ~' k8 cstartActivity(intent);  L- C" W) h& x, P3 B. z
其实这个的简写和我们常用的很相似
) \( d) H% U! r% K; Q6 O% w5 A- E* ]) vIntent intent = newIntent(ComponentAttr.this, SecondActivity.class);
  j, H) W$ ^1 [, j# CstartActivity(intent);5 {0 L; e+ a7 L- A
这个属性主要是通过包名、类名来确定唯一的Activity进行跳转
- h* ~% @7 \- S) x; n+ e$ x0 v5 ~# u5 M* h4 Y; w3 c

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

例如:# C# J3 B, L$ k6 ]/ Z6 w; [9 ^, z+ w
Intent intent = new Intent();
6 R0 ^! Q5 z9 }' B' `3 Nintent.setAction(ActionAttr.CRAZYIT_ACTION);
$ C4 _* `. Z  K, W, t9 p: w- i: v0 lstartActivity(intent);
9 X! O9 E( \$ A! O编码并没有指定要跳到哪个Activity,要知道跳到哪个Activity,就要看哪个Activity满足他的跳转条件,本程序就是跳到在<intent-filter>中有这样设置的Activity. B' P( N! h! w: q! T, Y
<actionandroidname=”org.crazyit.intent.action.CRAZYIT_ACTION”/>
* C* B2 i, B+ m# n3 Q; j6 y$ W- i上面也提到了些ActionCategory标准# y8 R; J5 T+ K! j0 c
再举个例子, n; o0 g5 A2 i  w& L2 ~, V* E
Intent.setActionIntent.ACYION_MAIN;  ?4 O0 N" B% k. X* t1 x/ G
Intent.addCategoryIntent.CATEGORY_HOME);' S! _% v% c: q: K) [' u
这样设置后将跳转到桌面,因为同时满足条件的就是HOME桌面2 l; V% C7 V% k) u  |; X

3 ~, k5 O7 Z& P2 L/ P- Y

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

例如:String data=”http://www.baidu.com”;
! K% G) V9 \6 `8 ]5 j# LUriuri=Uri.parse(data);
% d5 I# k* e1 X3 s; l5 ?% n& SIntent.setAction(Intent.ACTION_VIEW);
$ k4 y* Z+ x  G, k  GIntent.setData(uri);
/ x5 ]7 ~7 ?& Y1 i将会打开指定网页,当然地址也可以是本地的系统信息
0 Z% @& U" L2 s3 p$ y: M
9 L; p9 h- i/ s, ?% }9 ]! P) k
. \6 G- @+ r( f9 U: z$ u
头像被屏蔽

禁止发言

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 |显示全部楼层
百年不遇的好帖子,不得不顶% j" U$ m# e- c) @8 W

( g) H9 X# ~# T: z' U7 O* ~% }. u. N
3 r9 z  n2 C" G; V* n& `# j+ _& i, i0 R, t; ~/ R
" S% E) _* f# {

" l5 C) Y5 p  }7 c  t
& H& O: E( x, ?: \% g- r& R! g3 q" d  Z7 k
" b7 k6 F$ m1 C; H6 ~
, B1 d* x# C7 ]; q+ G

  t/ X; h# {2 C
+ e% B6 ]# ^' T
# |3 d' G+ x) ^# E广西特产 广西同心米粉 网狼藤县米粉
发帖际遇:tsexe01 在网吧通宵,花了 1 星币.幸运榜 / 衰神榜

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

GMT+8, 2018-12-18 00:58

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部