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

星组游戏论坛

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

QQ登录

只需一步,快速开始

查看: 949|回复: 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 编辑 $ ]' L$ e& x0 Z8 A' `- J
1 b1 V4 `7 z  G  r" y

使用IntentIntentFile进行通信

1 使用Intent启动系统组件

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

1.bmp

2.bmp


3 q5 l* t" Y! B) |; p  ^8 I( d/ m! w! H

: B$ T% y3 Y* k/ c7 ]0 _* `  r0 I' B

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

+ }) V( _8 r- j! M: f

2 Intent的属性及intent-filter配置

( G  ?5 g( \* g6 u4 c+ L

2.1 Component属性

Intent的Component属性需要接受一个ComponentName对象,ComponentName对象包含如下几个构造器。
# n0 v" v9 Q9 W  sComponentName(String pkg,String cls):创建pkg所在包下的cls类所对应的组件。$ z$ o1 s$ b2 i) y- d
ComponentName(Context pkg,String cls):创建pkg所对应的包下的cls类所对应的组件。$ ?! o' i. I+ m
ComponentName(Context pkg,Class<?>  cls):创建pkg所对应的包下的cls类所对应的组件。
. H/ I( _9 U2 V/ h上面所构造的组件本质就有一个,这说明创建ComponentName需要制定包名和类名——这就可唯一的确定一个组件类,这样应用程序即可根据给定的组件去启动特定的组件了。
% B" A: F& N6 {下面程序段示范了如何通过Intent的Component属性来启动另一个Activity。$ {* n( N& x* B1 _
            //创建一个ComponentName对象
7 b8 U4 X3 M% ~                            ComponentNamecomp = new ComponentName(ComponentAttr.this: z7 {) ]7 x, G6 B6 A0 w" g& y. Y+ ?) U
                                   ,SecondActivity.class);
+ M; M0 m, J5 |, h0 }6 U* W4 L                            Intentintent = new Intent();
) [$ x( u/ l* i8 p$ x8 c' S4 z                            //为Intent设置Component属性5 S6 W) f7 s; A$ v, P& {) p
                            intent.setComponent(comp);5 U8 ]) n, |7 ^7 j3 r" |( Z
                            startActivity(intent);
; e" u& ?# M1 {# w9 R2.2 Action、Category属性与intent-filter配置& v6 R( [+ b- W0 {# @
Intent的Action、Category属性都是一个普通的字符串,其中Action代表该Intent所要完成的一个抽象“动作”,而Category则用于为Action增加额外的附加类别信息
, p. k- }. m# X; N9 KAction要完成的只是一个抽象的动作,这个动作的具体由哪个组件来完成,Action这个字符串本身并不管。具体看什么、启动哪个Activity取决于Activity的<intent-filter…>配置。
5 H$ p& A. _8 A$ o& v; A            //创建Intent对象2 f# s7 w1 \, h. O1 f8 w
                            Intentintent = new Intent();
, S: G  x3 R& x6 ~                            //为Intent设置Action属性(属性值就是一个普通字符串)/ |9 ?: B1 {$ C7 E5 |% W
                            intent.setAction(ActionAttr.CRAZYIT_ACTION);/ {& N7 Y7 c1 o, v( x+ z
                            startActivity(intent);# P2 @! W/ q$ ^0 v6 `
   上面的程序段根据Intent来启动Activity——但该Intent并未以硬编码的方式指定启动哪个Activity
2 }3 J. M  X, t" _1 D+ S- A/ A需要指出的是,一个Intent对象最多只能包括一个Action属性,程序可调用Intent的setAction(String str)方法来设置Action属性值;但一个Intent对象可以包含多个Category属性,程序可以调用Intent的addCategory(String str)方法来添加Category属性。4 v3 K+ d, [9 _* N
& z7 s/ n. X6 J2 N
/ V* d3 H( e$ Q5 [  x: x" R

2.3 指定Action、Category调用系统Activity


0 c5 r, k3 t6 L* V 3.bmp
4.bmp
5.bmp

) l, Q1 i5 a, s1 J, `1 R8 _
- z4 W) P) i7 G8 x7 a" r

2.4 DataType属性与intent-filter配置

Data属性通常用于向Action属性提供操作的数据。3 m* b* ~: W- b" x5 [3 n
Type属性则用于明确指定Data属性所指定数据的类型或MIME类型,通常来说,当Intent不指定Data属性的时候Type属性才会起作用,否则Android系统将会根据Data属性值来分析数据的类型,因此无需指定Type属性( c, `4 c' K; \8 N6 i; J1 O

1 O, p0 Q7 o) C+ {4 ~* Y9 O

2.5Extra属性

IntentExtra属性通常用于在多个Action之间进行数据交换,IntentExtra属性值应该是一个Bundle对象,Bundle对象可以存入多组key-value对,这样可以就通过Intent在不同Activity之间进行数据交换了
$ ^: P" W$ k7 W3 h- ?9 W
/ W9 f. z4 d/ J5 H+ A" ]! ~. H


% e7 [9 p! Y4 I5 C5 h3 {! T2 J/ H: g+ i) p

总结个人理解

3 j5 A8 I+ g* X- \

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

主要介绍下不同Activity间跳转:6 O, s. G4 A4 c& u8 S. c' s
上面介绍了Intent的属性,这些属性说白了就是控制Intent跳转的不同方式
2 i/ Y0 B. {1 n( h  S9 ]0 G5 B5 k
+ @( M) v/ g3 W  E5 M/ f& t

1 我们通常用的

Intent intent = new Intent();
9 C) y' \: v* a2 w" L$ F9 b- V; h; kintent.setClass(DengLu.this,FormStuffActivity.class);
. r1 q) p' o& M' Z' P5 W2 z, BstartActivity(intent);
, R- L* ]! p" x1 m* c4 m/ q% B( l, ]: I

2 用Component属性的跳转

ComponentName comp = newComponentName(ComponentAttr.this, SecondActivity.class);8 f; U+ X' w% A0 P: C+ T# l' L6 y
Intent intent = new Intent();
6 h' W, E, j9 R8 Bintent.setComponent(comp); //Intent设置Component属性: {7 U' V% R1 |1 `
startActivity(intent);
! `0 f- v1 j! i+ Q其实这个的简写和我们常用的很相似
8 W8 p" @8 a1 NIntent intent = newIntent(ComponentAttr.this, SecondActivity.class);. V$ X% l. B! l! P  O, M! T& ?* ~
startActivity(intent);
  h/ k: _8 x# f% a0 n这个属性主要是通过包名、类名来确定唯一的Activity进行跳转
, b; G8 k- J* M. e) T# x9 q- q- J( K  S( ~3 a! W2 a6 Q! T5 x

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

例如:/ P# ]2 E0 k, z$ C6 `( z" S
Intent intent = new Intent();& S$ h4 ~% w/ Y+ R+ F, H7 q' ]
intent.setAction(ActionAttr.CRAZYIT_ACTION);& \: d# e3 Z0 \* ^4 D' ^' @
startActivity(intent);  c- v3 T0 s# I# a8 P4 A) J- T6 Q
编码并没有指定要跳到哪个Activity,要知道跳到哪个Activity,就要看哪个Activity满足他的跳转条件,本程序就是跳到在<intent-filter>中有这样设置的Activity
5 [- I/ b' ]+ J6 v3 a8 J<actionandroidname=”org.crazyit.intent.action.CRAZYIT_ACTION”/>
* T1 L$ E$ ~! q$ k& O6 i* r# p上面也提到了些ActionCategory标准
: {' y3 ~! E: f& }8 \% i 再举个例子
/ n# N1 Z* F% U' N# b3 ]' B5 R3 P. AIntent.setActionIntent.ACYION_MAIN;
& V4 G' q* a' K& ^7 tIntent.addCategoryIntent.CATEGORY_HOME);. ^* S) h( W2 d
这样设置后将跳转到桌面,因为同时满足条件的就是HOME桌面
7 M- H+ m' V+ z4 X4 R; R1 X  A7 u

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

例如:String data=”http://www.baidu.com”;" _8 M! h4 J( N
Uriuri=Uri.parse(data);- j' {- x. ?# s! \4 v& y
Intent.setAction(Intent.ACTION_VIEW);& ?' b& t3 ^7 H" C' j4 Z1 ]
Intent.setData(uri);
7 X' j0 z% g7 v8 s将会打开指定网页,当然地址也可以是本地的系统信息
: H/ F1 a) d% _9 ^: r% E; p$ ?
9 ]' S/ d4 S4 `* Y$ K4 n

! c; k1 B9 l9 W; h9 K8 r# |: c( \
头像被屏蔽

禁止发言

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

禁止发言

UID
115225
星币
59
积分
350
阅读权限
0
注册时间
2016-7-25
最后登录
2017-10-24
发表于 2016-8-12 22:01:41 |显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

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

GMT+8, 2018-1-17 13:26

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部