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

星组游戏论坛

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

QQ登录

只需一步,快速开始

查看: 1269|回复: 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 编辑 * _9 C2 Z% X9 F' E; q5 T% n
$ c9 w! d& N0 y& }- ^: Q

使用IntentIntentFile进行通信

1 使用Intent启动系统组件

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

1.bmp

2.bmp

6 ?3 H* i% J' U$ _# x' M
3 v% r6 a" Y# y9 s

# V) i: s2 l' i% v& B& C, @3 W- W
+ g( z$ p: ]8 H3 ?  c

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


2 g* J$ N) x: q4 J* g% X

2 Intent的属性及intent-filter配置


! K* k" U; [/ F' z2 \' N: Y

2.1 Component属性

Intent的Component属性需要接受一个ComponentName对象,ComponentName对象包含如下几个构造器。4 c3 ^" b; Q' E+ E
ComponentName(String pkg,String cls):创建pkg所在包下的cls类所对应的组件。
4 T5 x. H) o0 o7 S9 yComponentName(Context pkg,String cls):创建pkg所对应的包下的cls类所对应的组件。7 K+ \: n/ Q2 q; ?. L7 A
ComponentName(Context pkg,Class<?>  cls):创建pkg所对应的包下的cls类所对应的组件。
) Q) W9 Z2 a. ~, ?6 _上面所构造的组件本质就有一个,这说明创建ComponentName需要制定包名和类名——这就可唯一的确定一个组件类,这样应用程序即可根据给定的组件去启动特定的组件了。& Z% `4 R7 D. d+ L
下面程序段示范了如何通过Intent的Component属性来启动另一个Activity。
! |! e" |% H1 C3 g            //创建一个ComponentName对象0 T) P: U& ?# v' g; `3 f+ ]& W) ~& u. u
                            ComponentNamecomp = new ComponentName(ComponentAttr.this+ {) k! h- O0 P* O6 `$ e# i8 l/ U
                                   ,SecondActivity.class);5 ]# E5 f. w2 Q; B$ X
                            Intentintent = new Intent();
3 i- @' C6 y0 ^3 g                            //为Intent设置Component属性$ H3 K8 o; [* d- E/ n* A& S
                            intent.setComponent(comp);% v! g( m5 w4 z( V. N, r  o
                            startActivity(intent);
  D. P4 @4 A8 K& y2.2 Action、Category属性与intent-filter配置7 f7 [' P/ Z7 x9 x% j0 g
Intent的Action、Category属性都是一个普通的字符串,其中Action代表该Intent所要完成的一个抽象“动作”,而Category则用于为Action增加额外的附加类别信息. w6 q0 @; O/ ^9 Y5 N0 B2 ?" p
Action要完成的只是一个抽象的动作,这个动作的具体由哪个组件来完成,Action这个字符串本身并不管。具体看什么、启动哪个Activity取决于Activity的<intent-filter…>配置。5 M, O4 p+ h, `  S' e" c
            //创建Intent对象9 Q( L! k4 S+ g# _6 ?9 C% {
                            Intentintent = new Intent();/ u+ P* F; z$ v* P0 @
                            //为Intent设置Action属性(属性值就是一个普通字符串)
: L. Z5 ~& ^: [6 A/ T* R                            intent.setAction(ActionAttr.CRAZYIT_ACTION);
# I) e& J  Z& l! h                            startActivity(intent);
6 y* U2 e0 k8 m2 ?. z. {# h4 a   上面的程序段根据Intent来启动Activity——但该Intent并未以硬编码的方式指定启动哪个Activity
, Z$ ?- w% l2 R) t& C: }% c* v需要指出的是,一个Intent对象最多只能包括一个Action属性,程序可调用Intent的setAction(String str)方法来设置Action属性值;但一个Intent对象可以包含多个Category属性,程序可以调用Intent的addCategory(String str)方法来添加Category属性。! U9 W( ^+ ~; z; L
3 s2 i& C& z  \) E: V$ n! W

  x$ y% `7 q* j& S/ @

2.3 指定Action、Category调用系统Activity


( t2 K+ }, w/ {5 G  T 3.bmp
4.bmp
5.bmp

: m* {+ R7 L/ i1 @2 M" R
" ]/ T0 L  L) M) `1 o

2.4 DataType属性与intent-filter配置

Data属性通常用于向Action属性提供操作的数据。% o: L# M1 G4 ^, O
Type属性则用于明确指定Data属性所指定数据的类型或MIME类型,通常来说,当Intent不指定Data属性的时候Type属性才会起作用,否则Android系统将会根据Data属性值来分析数据的类型,因此无需指定Type属性
- E' ~# X0 Z7 E  a: K6 y 9 s& `3 t+ m4 u! \

2.5Extra属性

IntentExtra属性通常用于在多个Action之间进行数据交换,IntentExtra属性值应该是一个Bundle对象,Bundle对象可以存入多组key-value对,这样可以就通过Intent在不同Activity之间进行数据交换了
: q; e1 C5 B9 t) }3 I
' Q7 Z5 `- E3 B# z6 A$ R


! ^' `+ ?2 c6 e2 d

总结个人理解


: O7 Y5 b7 S5 m' Y9 I( {5 M

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

主要介绍下不同Activity间跳转:1 ]5 B! |9 W  b6 P+ W8 O# d
上面介绍了Intent的属性,这些属性说白了就是控制Intent跳转的不同方式' P: v$ v: q3 v. g
9 U; L( s) p! |4 H: R) f$ E

1 我们通常用的

Intent intent = new Intent();
, n- ~. v, s0 qintent.setClass(DengLu.this,FormStuffActivity.class);
% o9 r& c; X3 estartActivity(intent);% t; `0 P  k, \  g$ u7 k, p
, _" F6 q6 k1 M5 d4 ~2 c

2 用Component属性的跳转

ComponentName comp = newComponentName(ComponentAttr.this, SecondActivity.class);1 ?- {( ?, T* g* v+ l; T
Intent intent = new Intent();
# E- t1 M: A+ y6 J5 Zintent.setComponent(comp); //Intent设置Component属性8 M# q  A9 H' Z3 n" E; z& @8 @
startActivity(intent);) B7 g( v, M  D
其实这个的简写和我们常用的很相似
; L& \) ?5 U! hIntent intent = newIntent(ComponentAttr.this, SecondActivity.class);; j: e) Z+ j! g  H5 `
startActivity(intent);. x- o2 F6 z# p- ^) q
这个属性主要是通过包名、类名来确定唯一的Activity进行跳转/ e6 A8 Z0 h' p6 J4 x, H! X$ @
) q! n# k# M- M) ]

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

例如:
5 g! g" ]3 L1 Z% m: \/ F, NIntent intent = new Intent();
6 p& y* T* g+ c8 v' Y- s  xintent.setAction(ActionAttr.CRAZYIT_ACTION);
, X# \1 m" w% F* G# mstartActivity(intent);
8 C: p+ D9 X& @% W7 M9 v6 m- u编码并没有指定要跳到哪个Activity,要知道跳到哪个Activity,就要看哪个Activity满足他的跳转条件,本程序就是跳到在<intent-filter>中有这样设置的Activity
( z6 n" k# ~4 b: N5 D/ s<actionandroidname=”org.crazyit.intent.action.CRAZYIT_ACTION”/>
! `% h! p: S. m) m& k上面也提到了些ActionCategory标准
9 h; C& i' J$ Q' w0 w4 B 再举个例子
  K5 ^4 u7 f5 m8 J& g$ W7 FIntent.setActionIntent.ACYION_MAIN;
& Y4 J8 W/ i- k1 X4 [' R* Y  GIntent.addCategoryIntent.CATEGORY_HOME);
$ H9 k; D$ [! \这样设置后将跳转到桌面,因为同时满足条件的就是HOME桌面
9 [, {8 _9 T$ |' Y) o1 f
, j' `6 c7 E" y# ^

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

例如:String data=”http://www.baidu.com”;
2 w' o/ G& R0 F  oUriuri=Uri.parse(data);
0 f2 o4 v7 n6 lIntent.setAction(Intent.ACTION_VIEW);0 W% _( E7 |5 U
Intent.setData(uri);% _) ~+ J/ O1 J* [
将会打开指定网页,当然地址也可以是本地的系统信息
- G) |# ?- u4 A, U6 Y0 p
7 t3 K( Q7 j/ l
/ _6 a# Z8 H1 ~& {
头像被屏蔽

禁止发言

UID
114664
星币
11
积分
1
阅读权限
0
注册时间
2016-2-29
最后登录
2019-3-26
发表于 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 |显示全部楼层
百年不遇的好帖子,不得不顶
% R5 a! x" g9 x) p
1 n+ a  }# G8 y' I
; L, `5 b) B% Q" Y& R3 k( C2 \: j& U5 C: C# ?5 W3 R

4 c- j9 z4 L4 M" [6 k' d6 V$ S, e. |% p
7 \% U/ h1 n" p7 b" O

6 p0 a4 F" p, f" ~. g: A( f8 {- y. V4 P0 I( @, l2 y7 O

6 d1 f7 s# R  D+ o7 A' n# `( B5 O  ^1 z: J. S7 H

& X/ F  {/ ]' u3 j
. [3 W7 ^6 E( V( s. p& F& J2 J- h广西特产 广西同心米粉 网狼藤县米粉
发帖际遇:tsexe01 在网吧通宵,花了 1 星币.幸运榜 / 衰神榜

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

GMT+8, 2019-5-23 13:02

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部