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

星组游戏论坛

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

QQ登录

只需一步,快速开始

查看: 913|回复: 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 编辑
0 P3 T. l+ ?2 I8 b" c/ a' T
0 d6 z, |& l+ N8 G8 |5 N. i. y  j

使用IntentIntentFile进行通信

1 使用Intent启动系统组件

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

1.bmp

2.bmp

- `$ T  M# t& D4 e3 \3 q4 h

: f; I9 q& N3 n) T  k) m& [! k' @$ }: e8 v' S

' T9 g2 L( b! _

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


5 p' a) Q; _* ~) a

2 Intent的属性及intent-filter配置

! j+ q/ i9 `9 ^4 K" {' h+ C

2.1 Component属性

Intent的Component属性需要接受一个ComponentName对象,ComponentName对象包含如下几个构造器。
- x( d$ v9 E' A5 q, ?* C0 s4 EComponentName(String pkg,String cls):创建pkg所在包下的cls类所对应的组件。6 _1 {* Y" q" H6 E5 w+ t( Z/ _
ComponentName(Context pkg,String cls):创建pkg所对应的包下的cls类所对应的组件。
" r( r  A/ x" K/ A( R8 x( SComponentName(Context pkg,Class<?>  cls):创建pkg所对应的包下的cls类所对应的组件。& t# K" x0 t. {3 l# P5 G
上面所构造的组件本质就有一个,这说明创建ComponentName需要制定包名和类名——这就可唯一的确定一个组件类,这样应用程序即可根据给定的组件去启动特定的组件了。
  ]% h+ }! F6 P9 @下面程序段示范了如何通过Intent的Component属性来启动另一个Activity。
$ ]' G! u; w( s0 G4 T8 b4 B/ D            //创建一个ComponentName对象
$ l4 M5 Y: N* \7 Y0 c- ]                            ComponentNamecomp = new ComponentName(ComponentAttr.this
8 @3 U  P  o+ n: h5 y                                   ,SecondActivity.class);9 n$ T+ W) x( ]. E* u1 S. v2 [
                            Intentintent = new Intent();
- R* T- G. u; b% M; q/ Z- T; q& G                            //为Intent设置Component属性
) k9 p1 q1 U) R: U                            intent.setComponent(comp);
' e) |4 V/ j& U( r+ b0 g5 Y8 c                            startActivity(intent);
1 f# E1 o& |/ k2 t3 x3 j" l* d2.2 Action、Category属性与intent-filter配置
1 {" {8 J! f8 d7 u1 ~Intent的Action、Category属性都是一个普通的字符串,其中Action代表该Intent所要完成的一个抽象“动作”,而Category则用于为Action增加额外的附加类别信息
  I' J* q! j4 ^# ^7 P0 B9 I3 JAction要完成的只是一个抽象的动作,这个动作的具体由哪个组件来完成,Action这个字符串本身并不管。具体看什么、启动哪个Activity取决于Activity的<intent-filter…>配置。! t( Q0 e8 F6 a/ S- s1 r- L+ q
            //创建Intent对象
# ^0 N' R& c0 X- o' ^  ?+ e+ p                            Intentintent = new Intent();
( J: b. Z- f9 f/ ~                            //为Intent设置Action属性(属性值就是一个普通字符串)
) f5 X; }1 v1 I& }                            intent.setAction(ActionAttr.CRAZYIT_ACTION);
. x: ^) m4 l$ t- T% S                            startActivity(intent);; {8 b. m3 n) I8 J+ e$ K
   上面的程序段根据Intent来启动Activity——但该Intent并未以硬编码的方式指定启动哪个Activity  r/ {* D" W! Z4 S
需要指出的是,一个Intent对象最多只能包括一个Action属性,程序可调用Intent的setAction(String str)方法来设置Action属性值;但一个Intent对象可以包含多个Category属性,程序可以调用Intent的addCategory(String str)方法来添加Category属性。
# Y& M0 a9 v3 o8 V' G' S2 I
# T- t/ d. p3 v# v/ m+ ^. Q* R3 e5 X5 v

2.3 指定Action、Category调用系统Activity


* H3 {( K+ Y/ B( j! j7 z 3.bmp
4.bmp
5.bmp

8 b7 N. G7 w$ J7 n  e. M$ @% F6 f5 z

2.4 DataType属性与intent-filter配置

Data属性通常用于向Action属性提供操作的数据。7 X2 P# L! ~( h- `* E, Y, G5 l+ V
Type属性则用于明确指定Data属性所指定数据的类型或MIME类型,通常来说,当Intent不指定Data属性的时候Type属性才会起作用,否则Android系统将会根据Data属性值来分析数据的类型,因此无需指定Type属性
! `$ ~% ?. o* A( v ; Q/ v9 f1 w5 T  J6 N

2.5Extra属性

IntentExtra属性通常用于在多个Action之间进行数据交换,IntentExtra属性值应该是一个Bundle对象,Bundle对象可以存入多组key-value对,这样可以就通过Intent在不同Activity之间进行数据交换了' K$ t/ T+ m- T( ^

* p1 e# d% W* K+ n, q

$ _4 K6 k6 l& g) N* O5 a  h7 E

总结个人理解


3 T5 X2 A# \6 v# J: s" u3 q

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

主要介绍下不同Activity间跳转:
5 f5 J/ y) A2 y7 S6 V4 A7 y上面介绍了Intent的属性,这些属性说白了就是控制Intent跳转的不同方式
% T( t6 f/ y+ H0 ?% b( _5 o6 z' g* N- X

1 我们通常用的

Intent intent = new Intent();
2 X/ J* ?9 f1 Q; |! T2 {. kintent.setClass(DengLu.this,FormStuffActivity.class);- S7 d5 k) n( s! F6 h* A
startActivity(intent);
6 ]- M& e! @& D; z7 D* T8 E4 F( I( o6 c6 K- l+ d, L

2 用Component属性的跳转

ComponentName comp = newComponentName(ComponentAttr.this, SecondActivity.class);
8 J) `& r* h9 l: B, n3 L; lIntent intent = new Intent();
$ P. S0 v7 m8 T+ j5 ]3 y  ^+ Iintent.setComponent(comp); //Intent设置Component属性7 n* g0 y1 G  v: q
startActivity(intent);
, _2 o/ f1 @* k其实这个的简写和我们常用的很相似$ _0 S* Z5 F' p
Intent intent = newIntent(ComponentAttr.this, SecondActivity.class);
% ~5 a& G7 z5 ~' ^0 I" xstartActivity(intent);
, M6 ?& L/ ?$ P4 ^这个属性主要是通过包名、类名来确定唯一的Activity进行跳转
! e9 j+ p( X7 ^4 \$ {. I5 t1 M: r8 _6 D% O6 I) k+ J) O1 Z

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

例如:
% S9 C  \; U" J+ N2 P* i1 i0 h) LIntent intent = new Intent();
! h! l; `/ g, J5 M- g) cintent.setAction(ActionAttr.CRAZYIT_ACTION);$ E3 T" R; |( m3 B
startActivity(intent);" N: E$ Z! Z  d: q0 g
编码并没有指定要跳到哪个Activity,要知道跳到哪个Activity,就要看哪个Activity满足他的跳转条件,本程序就是跳到在<intent-filter>中有这样设置的Activity
& Z8 t  s% s" q<actionandroidname=”org.crazyit.intent.action.CRAZYIT_ACTION”/>, X( c% l6 O4 y& [* j
上面也提到了些ActionCategory标准
" V  s! [3 f2 t# z 再举个例子# [2 f* p; Z# y/ o- x
Intent.setActionIntent.ACYION_MAIN;* H! f- F( f2 ]$ E
Intent.addCategoryIntent.CATEGORY_HOME);
2 v# V5 M4 c, W这样设置后将跳转到桌面,因为同时满足条件的就是HOME桌面
/ R' C+ s& \( K3 x! V3 C5 I! @! k' u8 O2 ^. X

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

例如:String data=”http://www.baidu.com”;
7 D4 N6 H6 J: d5 D- wUriuri=Uri.parse(data);& @3 _8 v6 ~' G" o+ ^8 _
Intent.setAction(Intent.ACTION_VIEW);
( \* U5 g2 u. L& uIntent.setData(uri);
/ [# f9 @! T- Z将会打开指定网页,当然地址也可以是本地的系统信息4 c, ^6 Y8 Z  ?- E4 O7 l; ~- W

# w5 M: E& F) j- K" U1 G$ K

+ B2 l$ @+ Y, }9 l# k
头像被屏蔽

禁止发言

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, 2017-11-20 19:38

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部