版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第第6章章 组件通信与广播消息组件通信与广播消息 本章学习目标n了解使用了解使用Intent进行组件通信的原理进行组件通信的原理n掌握使用掌握使用Intent启动启动Activity的方法的方法n掌握获取掌握获取Activity返回值的方法返回值的方法n了解了解Intent过滤器的原理与匹配机制过滤器的原理与匹配机制n掌握发送和接收广播消息的方法掌握发送和接收广播消息的方法6.1 Intent简介 nIntent是是一个动作的完整描述,包含了动作的一个动作的完整描述,包含了动作的产生组件、接收组件和传递的数据信息产生组件、接收组件和传递的数据信息qIntent也可称为一个在不同组件之间传递的消
2、息,这个也可称为一个在不同组件之间传递的消息,这个消息在到达接收组件后,接收组件会执行相关的动作消息在到达接收组件后,接收组件会执行相关的动作q Intent为为Activity、Service和和BroadcastReceiver等等组件提供交互能力组件提供交互能力qIntent的用途的用途n启动启动Activity和和Servicen在在Android系统上发布广播消息系统上发布广播消息q广播消息可以是接收到特定数据或消息,也可以是手机广播消息可以是接收到特定数据或消息,也可以是手机的信号变化或电池的电量过低等信息的信号变化或电池的电量过低等信息6.1 Intent简介n6.1.1 启动A
3、ctivityq在在Android系统中,应用程序一般都有多个系统中,应用程序一般都有多个Activity,Intent可以实现不同可以实现不同Activity之间的切换和数据传递之间的切换和数据传递q启动启动Activity方式方式n显式启动,必须在显式启动,必须在Intent中指明启动的中指明启动的Activity所在的类所在的类n隐式启动,隐式启动, Android系统根据系统根据Intent的动作和数据来决定的动作和数据来决定启动哪一个启动哪一个Activity,也就是说在隐式启动时,也就是说在隐式启动时,Intent中中只包含需要执行的动作和所包含的数据,而无需指明具体只包含需要执行
4、的动作和所包含的数据,而无需指明具体启动哪一个启动哪一个Activity,选择权由,选择权由Android系统和最终用户系统和最终用户来决定来决定6.1 Intent简介n6.1.1 启动Activityq显式启动显式启动n使用使用Intent显式启动显式启动Activityn创建一个创建一个Intentn指定当前的应用程序上下文以及要启动的指定当前的应用程序上下文以及要启动的Activityn把创建好的这个把创建好的这个Intent作为参数传递给作为参数传递给startActivity()方法方法Intent intent = new Intent(IntentDemo.this, Acti
5、vityToStart.class);startActivity(intent);6.1 Intent简介n6.1.1 启动Activityq显式启动显式启动n下面用下面用IntentDemo示例说明如何使用示例说明如何使用Intent启动新的启动新的Activity。IntentDemo示例包含两个示例包含两个Activity,分别是,分别是IntentDemoActivity和和NewActivity。n程序默认启动的程序默认启动的Activity是是IntentDemo,在用户点击,在用户点击“启动启动Activity”按钮后,程序启动的按钮后,程序启动的Activity是是NewAct
6、ivity 6.1 Intent简介n6.1.1 启动Activityq显式启动n在在IntentDemo示例中使用了两个示例中使用了两个Activity,因此需要在,因此需要在AndroidManifest.xml文件中注册这两个文件中注册这两个Activity。注册。注册Activity应使用应使用标签,嵌套在标签,嵌套在标标签内部。签内部。6.1 Intent简介n6.1.1 启动Activity-显式启动nAndroidManifest.xml文件代码如下 manifest xmlns:android=http:/ android:icon=drawable/icon android:
7、label=string/app_nameactivity category / activityuses-=14 /6.1 Intent简介n6.1.1 启动Activityq显式启动nAndroid应用程序中,应用程序中,用户使用的每个组件都必须在用户使用的每个组件都必须在AndroidManifest.xml文件中的文件中的节点节点内定义。内定义。在上面的代码中,在上面的代码中,节点下共节点下共有两个有两个节点,分别代表应用程序中所使用节点,分别代表应用程序中所使用的两个的两个Activity,IntentDemoActivity和和NewActivity。6.1 Intent简介n6.
8、1.1 启动Activityq显式启动n在IntentDemoActivity.java文件中,包含了使用Intent启动Activity的核心代码: Button Button buttonbutton = ( = (Button)findViewById(R.id.btnButton)findViewById(R.id.btn); );button.setOnClickListener(newbutton.setOnClickListener(new OnClickListenerOnClickListener()()public void public void onClick(View
9、onClick(View view) view)IntentIntent intentintent = new = new Intent(IntentDemoActivity.thisIntent(IntentDemoActivity.this, , NewActivity.classNewActivity.class); );startActivity(intentstartActivity(intent); ); ););6.1 Intent简介n6.1.1 启动Activityq显式启动n在点击事件的处理函数中,在点击事件的处理函数中,Intent构造函数的第构造函数的第1个参数个参数是
10、应用程序上下文,在这里就是是应用程序上下文,在这里就是IntentDemoActivity;第第2个参数是接收个参数是接收Intent的目标组件的目标组件,这里使用的是显式,这里使用的是显式启动方式,直接指明了需要启动的启动方式,直接指明了需要启动的Activity。6.1 Intent简介n6.1.1 启动Activityq隐式启动n隐式启动的好处在于不需要指明需要启动哪一个Activity,而由Android系统来决定,这样有利于降低组件之间的耦合度。n选择隐式启动Activity,Android系统会在程序运行时解析Intent,并根据一定的规则对Intent和Activity进行匹配,
11、使Intent上的动作、数据与Activity完全吻合。n匹配的组件可以是程序本身的Activity,也可以是Android系统内置的Activity,还可以是第三方应用程序提供的Activity。n因此,这种方式强调了Android组件的可复用性。 6.1 Intent简介n6.1.1 启动Activityq隐式启动n如果程序开发人员希望启动一个浏览器,查看指定如果程序开发人员希望启动一个浏览器,查看指定的网页内容,却不能确定具体应该启动哪一个的网页内容,却不能确定具体应该启动哪一个Activity,此时则可以使用,此时则可以使用Intent的隐式启动方式,的隐式启动方式,由由Android
12、系统在系统在程序运行时决定具体启动程序运行时决定具体启动哪一个应哪一个应用程序的用程序的Activity来接收这个来接收这个Intent。n程序开发人员可以将浏览动作和程序开发人员可以将浏览动作和Web地址作为参数地址作为参数传递给传递给Intent,Android系统则通过匹配动作和数据系统则通过匹配动作和数据格式,找到最适合于此动作和数据格式的组件。格式,找到最适合于此动作和数据格式的组件。 Intent Intent intentintent = new = new Intent(Intent(Intent.ACTION_VIEWIntent.ACTION_VIEW, , Uri.par
13、se(http:/.hkUri.parse(http:/.hk);); startActivity(intentstartActivity(intent); );6.1 Intent简介n6.1.1 启动Activityq隐式启动nIntent的动作是的动作是Intent.ACTION_VIEW,数据是,数据是Web地址,地址,使用使用Uri.parse(urlString)方法,可以简单的把一个字符串方法,可以简单的把一个字符串解释成解释成Uri对象。对象。Android系统在匹配系统在匹配Intent时,首先根据动时,首先根据动作作Intent.ACTION_VIEW,得知需要,得知需要启
14、动具备浏览功能的启动具备浏览功能的Activity,但具体是浏览电话号码还是浏览网页,还需要根,但具体是浏览电话号码还是浏览网页,还需要根据据URI的数据类型来做最后判断。因为数据提供的是的数据类型来做最后判断。因为数据提供的是Web地地址址http:/,所以最终可以判定,所以最终可以判定Intent需需要启动具有网页浏览功能的要启动具有网页浏览功能的Activity。在缺省情况下,。在缺省情况下,Android系统会调用内置的系统会调用内置的Web浏览器。浏览器。6.1 Intent简介n6.1.1 启动Activityq隐式启动隐式启动nIntent的语法如下:的语法如下: Intent
15、Intent intentintent = new = new Intent(Intent.ACTION_VIEWIntent(Intent.ACTION_VIEW, , Uri.parse(urlStringUri.parse(urlString););Intent构造函数的第构造函数的第1个参数是个参数是Intent需要执行的需要执行的动作,动作,Android系统支持的常见动作字符串常系统支持的常见动作字符串常量可以参考表。量可以参考表。第第2个参数是个参数是URI,表示需要传递的数据。,表示需要传递的数据。6.1.1 启动Activity-隐式启动隐式启动动作动作说明说明ACTION_
16、ANSWER打开接听电话的打开接听电话的Activity,默认为,默认为Android内置的拨号界面内置的拨号界面ACTION_CALL打开拨号盘界面并拨打电话,使用打开拨号盘界面并拨打电话,使用Uri中的数字部分作为电话号码中的数字部分作为电话号码ACTION_DELETE打开一个打开一个Activity,对所提供的数据进行删除操作,对所提供的数据进行删除操作ACTION_DIALACTION_DIAL打开内置拨号打开内置拨号界面界面,显示,显示UriUri中提供的电话号码中提供的电话号码ACTION_EDITACTION_EDIT打开一个打开一个ActivityActivity,对所提供的
17、数据进行编辑操作,对所提供的数据进行编辑操作ACTION_INSERTACTION_INSERT打开一个打开一个ActivityActivity,在提供数据的当前位置插入新项,在提供数据的当前位置插入新项ACTION_PICKACTION_PICK启动一个子启动一个子ActivityActivity,从提供的数据列表中选取一项,从提供的数据列表中选取一项ACTION_SEARCHACTION_SEARCH启动一个启动一个ActivityActivity,执行搜索动作,执行搜索动作ACTION_SENDTOACTION_SENDTO启动一个启动一个ActivityActivity,向数据提供的联
18、系人发送信息,向数据提供的联系人发送信息ACTION_SENDACTION_SEND启动一个可以发送数据的启动一个可以发送数据的ActivityActivityACTION_VIEWACTION_VIEW最常用的动作,对以最常用的动作,对以UriUri方式传送的数据,根据方式传送的数据,根据UriUri协议部分以最佳协议部分以最佳方式启动相应的方式启动相应的ActivityActivity进行处理。对于进行处理。对于http:addresshttp:address将打开浏将打开浏览器查看;对于览器查看;对于tel:addresstel:address将打开拨号界面并呼叫指定的电话将打开拨号界面
19、并呼叫指定的电话号码号码ACTION_WEB_SEARCHACTION_WEB_SEARCH打开一个打开一个ActivityActivity,对提供的数据进行,对提供的数据进行WebWeb搜索搜索6.1 Intent简介n6.1.1 启动Activityq隐式启动nWebViewIntentDemo示例说明了如何隐式启动Activity,用户界面6.1 Intent简介n6.1.1 启动Activityq隐式启动n当用户在文本框中输入Web地址后,通过点击“浏览此URL”按钮,程序根据用户输入的Web地址生成一个Intent,并以隐式启动的方式调用Android内置的Web浏览器,并打开指定的
20、Web页面。本例输入的Web地址http:/.hk,打开页面后的效果如图6.1 Intent简介n6.1.2 获取Activity返回值q在上一小节在上一小节IntentDemo示例中,通过示例中,通过startActivity(Intent)方法启动方法启动Activity,启动后的启动后的两个两个Activity之间相互独立之间相互独立,没有任何的关联。在,没有任何的关联。在很多情况下,后启动的很多情况下,后启动的Activity是为了让用户对特是为了让用户对特定信息进行选择,在后启动的定信息进行选择,在后启动的Activity关闭时,这关闭时,这些信息是需要返回给些信息是需要返回给先前启
21、动的先前启动的Activity。q后启动的后启动的Activity称为称为为为“子子Activity”,先启动的,先启动的Activity称为称为“父父Activity”。q如果需要将子如果需要将子Activity的信息返回给父的信息返回给父Activity,则则可以使用可以使用Sub-Activity的方式去启动子的方式去启动子Activity。 6.1 Intent简介n6.1.2 获取Activity返回值q获取子获取子Activity的返回值,一般可以分为以下三个步的返回值,一般可以分为以下三个步骤:骤:n以以Sub-Activity的方式启动子的方式启动子Activity;n设置子设
22、置子Activity的返回值;的返回值;n在父在父Activity中获取返回值;中获取返回值;n下面详细介绍每一个步骤的过程和代码实现。下面详细介绍每一个步骤的过程和代码实现。6.1 Intent简介n6.1.2 获取Activity返回值q以Sub-Activity的方式启动子Activityn以以Sub-Activity方式启动子方式启动子Activity,需要调用需要调用startActivityForResult(Intent, requestCode)函数函数n参数参数Intent用于决定启动哪个用于决定启动哪个Activityn参数参数requestCode是是请求码请求码。n因为
23、所有因为所有子子Activity返回时返回时,父,父Activity都调用相同的都调用相同的处理函数,因此父处理函数,因此父Activity使用使用requestCode来确定数来确定数据是哪一个子据是哪一个子Activity返回的返回的6.1 Intent简介n6.1.2 获取获取Activity返回值返回值q以以Sub-Activity的方式启动子的方式启动子Activityn显式启动子显式启动子Activity的代码如下的代码如下 n隐式启动子隐式启动子Activity的代码如下的代码如下 intint SUBACTIVITY1 = 1; SUBACTIVITY1 = 1; Intent
24、 Intent intentintent = new = new Intent(thisIntent(this, , SubActivity1.class);SubActivity1.class); startActivityForResult(intentstartActivityForResult(intent, , SUBACTIVITY1);SUBACTIVITY1); int SUBACTIVITY2 = 2; Uri uri = Uri.parse(content:/contacts/people); Intent intent = new Intent(Intent.ACTION
25、_PICK(Intent.ACTION_PICK, uri); startActivityForResult(intent, SUBACTIVITY2);6.1 Intent简介n6.1.2 获取Activity返回值q设置子Activity的返回值n在子在子Activity调用调用finish()函数关闭前,调用函数关闭前,调用setResult()函函数设定需要返回给父数设定需要返回给父Activity的数据。的数据。nsetResult()函数有两个参数,函数有两个参数,n一个是结果码,一个是返回值。一个是结果码,一个是返回值。n结果码表明了子结果码表明了子Activity的返回状态,通
26、常为的返回状态,通常为Activity.RESULT_OK(正常返回数据)或者(正常返回数据)或者Activity.RESULT_CANCELED(取消返回数据),也可(取消返回数据),也可以是自定义的结果码,结果码均为整数类型。以是自定义的结果码,结果码均为整数类型。n返回值封装在返回值封装在Intent中,也就是说子中,也就是说子Activity通过通过Intent将将需要返回的数据传递给父需要返回的数据传递给父Activity。数据主要以。数据主要以Uri形式返形式返回给父回给父Activity,此外还可以附加一些额外信息,这些额,此外还可以附加一些额外信息,这些额外信息用外信息用Ext
27、ra的集合表示。的集合表示。 6.1 Intent简介n6.1.2 获取Activity返回值q设置子Activity的返回值n以下代码说明如何在子Activity中设置返回值: Uri data = Uri data = Uri.parse(telUri.parse(tel: + : + tel_numbertel_number); ); Intent result = new Intent result = new Intent(nullIntent(null, , data);data); result.result.putExtraputExtra(address(address, J
28、D , JD Street);Street); setResult(RESULT_OKsetResult(RESULT_OK, result);, result); finish();finish();6.1 Intent简介n6.1.2 获取Activity返回值q在父在父Activity中获取返回值中获取返回值n当子当子Activity关闭后,父关闭后,父Activity会调用会调用onActivityResult()函数,用了函数,用了获取子获取子Activity的返回值。的返回值。n如果需要在父如果需要在父Activity中处理子中处理子Activity的返回值,则重载此函数即可的返回
29、值,则重载此函数即可。nonActivityResult()函数的语法如下:函数的语法如下: n其中第其中第1个参数个参数requestCode是请求码,用来判断第是请求码,用来判断第3个参数是哪一个个参数是哪一个子子Activity的返回值;的返回值;resultCode用于表示子用于表示子Activity的数据返回状态的数据返回状态;Data是子是子Activity的返回数据,返回数据类型是的返回数据,返回数据类型是Intent。根据返回数。根据返回数据的用途不同,据的用途不同,Uri数据的协议则不同,也可以使用数据的协议则不同,也可以使用Extra方法返回一些方法返回一些原始类型的数据。
30、原始类型的数据。 public void public void onActivityResult(intonActivityResult(int requestCoderequestCode, , intint resultCoderesultCode, Intent data);, Intent data);6.1 Intent简介n6.1.2 获取Activity返回值q在父Activity中获取返回值n以下代码说明如何在父Activity中处理子Activity的返回值:private static final private static final intint SUBACTIVI
31、TY1 = 1; SUBACTIVITY1 = 1;private static final private static final intint SUBACTIVITY2 = 2; SUBACTIVITY2 = 2;Override Override public void public void onActivityResultonActivityResult(int(int requestCoderequestCode, , intint resultCoderesultCode, Intent data), Intent data)super.onActivityResult(req
32、uestCodesuper.onActivityResult(requestCode, , resultCoderesultCode, data);, data);switch(requestCodeswitch(requestCode) )case SUBACTIVITY1:case SUBACTIVITY1:if (if (resultCoderesultCode = = Activity.RESULT_OKActivity.RESULT_OK) )Uri Uri uriDatauriData = = data.getDatadata.getData();();else if (else
33、if (resultCoderesultCode = = Activity.RESULT_CANCELActivity.RESULT_CANCEL) ) break;break;case SUBACTIVITY2:case SUBACTIVITY2:if (if (resultCoderesultCode = = Activity.RESULT_OKActivity.RESULT_OK) )Uri Uri uriDatauriData = = data.getDatadata.getData();(); break;break; 6.1 Intent简介n6.1.2 获取Activity返回值
34、q在父Activity中获取返回值n代码的第1行和第2行是两个子Activity的请求码,在第7行对请求码进行匹配。n代码第9行和第11行对结果码进行判断,如果返回的结果码是Activity.RESULT_OK,则在代码的第10行使用getData()函数获取Intent中的Uri数据;n如果返回的结果码是Activity.RESULT_CANCELED,则放弃所有操作。6.1 Intent简介n6.1.2 获取Activity返回值q在父Activity中获取返回值nActivityCommunication示例说明了如何以Sub-Activity方式启动子Activity,以及如何使用In
35、tent进行组件间通信。6.1 Intent简介n6.1.2 获取Activity返回值q在父Activity中获取返回值n当用户点击“启动Activity1”和“启动Activity2”按钮时,程序将分别启动子SubActivity1和SubActivity2。6.1 Intent简介n6.1.2 获取Activity返回值q在父Activity中获取返回值nSubActivity1提供了一个输入框,以及提供了一个输入框,以及“接受接受”和和“撤撤销销”两个按钮。如果在输入框中输入信息后点击两个按钮。如果在输入框中输入信息后点击“接受接受”按钮,程序会把输入框中的信息传递给其父按钮,程序会把
36、输入框中的信息传递给其父Activity,并,并在父在父Activity的界面上显示。的界面上显示。n如果用户点击如果用户点击“撤销撤销”按钮,则程序不会向父按钮,则程序不会向父Activity传传递任何信息。递任何信息。nSubActivity2主要是为了说明如何在父主要是为了说明如何在父Activity中处理多中处理多个子个子Activity,因此仅提供了用于关闭,因此仅提供了用于关闭SubActivity2的的“关闭关闭”按钮。按钮。 6.1 Intent简介n6.1.2 获取Activity返回值q在父Activity中获取返回值nActivityCommunication示例的文件结
37、构q父Activity的代码在ActivityCommunication.java文件中,界面布局在main.xml中;两个子Activity的代码分别在SubActivity1.java和SubActivity2.java文件中,界面布局分别在subactivity1.xml和subactivity2.xml中。 6.1 Intent简介n6.1.2 获取Activity返回值q在父Activity中获取返回值nActivityCommunicationActivity.java文件的核心代码如下1public class ActivityCommunicationActivity exte
38、nds Activity 2private static final int SUBACTIVITY1 = 1;3private static final int SUBACTIVITY2 = 2;4TextView textView;5Override6public void onCreate(Bundle savedInstanceState) 7super.onCreate(savedInstanceState);8setContentView(R.layout.main);9textView = (TextView)findViewById(R.id.textShow);10final
39、 Button btn1 = (Button)findViewById(R.id.btn1);11final Button btn2 = (Button)findViewById(R.id.btn2);12 13btn1.setOnClickListener(new OnClickListener()14public void onClick(View view)15Intent intent = new Intent(ActivityCommunication.this, SubActivity1.class);16startActivityForResult(intent, SUBACTI
40、VITY1);176.1 Intent简介n6.1.2 获取Activity返回值q在父Activity中获取返回值18);1920btn2.setOnClickListener(new OnClickListener()21public void onClick(View view)22Intent intent = new Intent(ActivityCommunication.this, SubActivity2.class);23startActivityForResult(intent, SUBACTIVITY2);2425);262728Override29protected v
41、oid onActivityResult(int requestCode, int resultCode, Intent data) 30super.onActivityResult(requestCode, resultCode, data);316.1 Intent简介n6.1.2 获取Activity返回值q在父Activity中获取返回值32switch(requestCode)33case SUBACTIVITY1:34if (resultCode = RESULT_OK)35Uri uriData = data.getData();36textView.setText(uriDat
42、a.toString();3738break;39case SUBACTIVITY2:40break;41nn436.1 Intent简介n6.1.2 获取Activity返回值q在父Activity中获取返回值n在代码的第2行和第3行分别定义了两个子Activity的请求码。码。n在代码的第在代码的第16行和第行和第23行以行以Sub-Activity的方式分别启的方式分别启动两个子动两个子Activity。n代码第代码第29行是子行是子Activity关闭后的返回值处理函数,其中关闭后的返回值处理函数,其中requestCode是子是子Activity返回的请求码,与第返回的请求码,与第2
43、行和第行和第3行定义的两个请求码相匹配;行定义的两个请求码相匹配;resultCode是结果码,是结果码,n在代码第在代码第32行对结果码进行判断,如果等于行对结果码进行判断,如果等于RESULT_OK,在第,在第35行代码获取子行代码获取子Activity返回值中的返回值中的数据;数据;data是返回值,子是返回值,子Activity需要返回的数据就保存需要返回的数据就保存在在data中。中。 6.1 Intent简介n6.1.2 获取Activity返回值q在父Activity中获取返回值nSubActivity1.java的核心代码如下:public class SubActivity1
44、 extends Activity public class SubActivity1 extends Activity OverrideOverridepublic void public void onCreate(BundleonCreate(Bundle savedInstanceStatesavedInstanceState) ) super.onCreate(savedInstanceStatesuper.onCreate(savedInstanceState); );setContentView(R.layout.subactivity1);setContentView(R.la
45、yout.subactivity1);final final EditTextEditText editTexteditText = ( = (EditText)findViewById(R.id.editEditText)findViewById(R.id.edit); );Button Button btnOKbtnOK = ( = (Button)findViewById(R.id.btn_okButton)findViewById(R.id.btn_ok); );Button Button btnCancelbtnCancel = ( = (Button)findViewById(R.
46、id.btn_cancelButton)findViewById(R.id.btn_cancel); );btnOK.setOnClickListener(btnOK.setOnClickListener(newnew OnClickListenerOnClickListener()()public void public void onClick(ViewonClick(View view) view)String String uriStringuriString = = editText.getText().toStringeditText.getText().toString();()
47、;Uri data = Uri data = Uri.parse(uriStringUri.parse(uriString); );Intent result = new Intent result = new Intent(nullIntent(null, data);, data);setResult(RESULT_OKsetResult(RESULT_OK, result);, result);finish();finish(); ););btnCancel.setOnClickListener(newbtnCancel.setOnClickListener(new OnClickLis
48、tenerOnClickListener()()public void public void onClick(ViewonClick(View view) view)setResult(RESULT_CANCELEDsetResult(RESULT_CANCELED, null);, null);finish();finish(); );); 6.1 Intent简介n6.1.2 获取Activity返回值q在父Activity中获取返回值n代码第13行将EditText控件的内容作为数据保存在Uri中,并在第14行代码中构造Intent。n在第15行代码中,RESUIT_OK作为结果码,通
49、过调用setResult()函数,将result设定为返回值。n最后在代码第16行调用finish()函数关闭当前的子Activity6.1 Intent简介n6.1.2 获取Activity返回值q在父Activity中获取返回值nSubActivity2.java的核心代码:public class SubActivity2 extends Activity public class SubActivity2 extends Activity OverrideOverridepublic void public void onCreate(BundleonCreate(Bundle sav
50、edInstanceStatesavedInstanceState) ) super.onCreate(savedInstanceStatesuper.onCreate(savedInstanceState); );setContentView(R.layout.subactivity2);setContentView(R.layout.subactivity2); Button Button btnReturnbtnReturn = ( = (Button)findViewById(R.id.btn_returnButton)findViewById(R.id.btn_return); );
51、btnReturn.setOnClickListener(newbtnReturn.setOnClickListener(new OnClickListenerOnClickListener()()public void public void onClick(ViewonClick(View view) view)setResult(RESULT_CANCELEDsetResult(RESULT_CANCELED, null);, null);finish();finish(); );); 6.1 Intent简介n6.1.2 获取Activity返回值q在父Activity中获取返回值n在
52、SubActivity2的代码中,第10行的setResult()函数仅设置了结果码,第2个参数为null,表示没有数据需要传递给父Activity。6.2 Intent过滤器nIntent解析q隐式启动隐式启动Activity时,并没有在时,并没有在Intent中指明中指明Activity所在的类,因此,所在的类,因此,Android系统一定存在系统一定存在某种匹配机制,使某种匹配机制,使Android系统能够根据系统能够根据Intent中中的数据信息,找到需要启动的的数据信息,找到需要启动的Activity。这种。这种匹配匹配机制是依靠机制是依靠Android系统中的系统中的Intent过
53、滤器(过滤器(Intent Filter)来实现的。来实现的。6.2 Intent过滤器nIntent解析qIntent过滤器是一种根据过滤器是一种根据Intent中的动作(中的动作(Action)、类别()、类别(Category)和数据()和数据(Data)等内容,)等内容,对适合接收该对适合接收该Intent的组件进行匹配和筛选的机制的组件进行匹配和筛选的机制。Intent过滤器可以匹配数据类型、路径和协议,还可以确定多个匹配项顺序的优先级(Priority)。应用程序的Activity、Service和BroadcastReceiver组件都可以注册Intent过滤器。这样,这些组件在
54、特定的数据格式上则可以产生相应的动作。 6.2 Intent过滤器nIntent解析q为了使组件能够注册Intent过滤器,通常在AndroidManifest.xml文件的各个组件下定义节点,然后在节点中声明该组件所支持的动作、执行的环境和数据格式等信息。当然,也可以在程序代码中动态地为组件设置Intent过滤器。节点支持节点支持标签、标签、标签和标签和标签,标签,分别用来定义Intent过滤器的“动作”、“类别”和“数据”。节点支持的标签和属性说明参考表 6.2 Intent过滤器标签标签属性属性说明说明android:nameandroid:name指定组件所能响应的动作,用字符串表示,
55、指定组件所能响应的动作,用字符串表示,通常由通常由JavaJava类名和包的完全限定名构成类名和包的完全限定名构成category android:categoryandroid:category指定以何种方式去服务指定以何种方式去服务IntentIntent请求的动作请求的动作Android:hostAndroid:host指定一个有效的主机名指定一个有效的主机名android:mimetypeandroid:mimetype指定组件能处理的数据类型指定组件能处理的数据类型android:pathandroid:path有效的有效的URIURI路径名路径名android:portandroi
56、d:port主机的有效端口号主机的有效端口号android:schemeandroid:scheme所需要的特定协议所需要的特定协议6.2 Intent过滤器nIntent解析q标签用来指定标签用来指定Intent过滤器的服务方式过滤器的服务方式,每个,每个Intent过滤器可以定义多个过滤器可以定义多个标签标签,程序开发人员可以使用自定义的类别,或使用,程序开发人员可以使用自定义的类别,或使用Android系统提供的类别。系统提供的类别。Android系统提供的类系统提供的类别可以参考表别可以参考表 6.2 Intent过滤器值值说明说明ALTERNATIVEIntent数据默认动作的一个可
57、替换的执行方法SELECTED_ALTERNATIVE 和ALTERNATIVE类似,但替换的执行方法不是指定的,而是被解析出来的BROWSABLE声明Activity可以由浏览器启动DEFAULTDEFAULT为Intent过滤器中定义的数据提供默认动作HOME设备启动后显示的第一个ActivityLAUNCHERLAUNCHER在应用程序启动时首先被显示在应用程序启动时首先被显示6.2 Intent过滤器nIntent解析q这种Intent到Intent过滤器的映射过程称为“Intent解析”。Intent解析可以在所有的组件中,找到一个可以与请求的Intent达成最佳匹配的Intent过
58、滤器。Android系统中Intent解析的匹配规则如下: 6.2 Intent过滤器nIntent解析解析q(1) Android系统把所有应用程序包中的系统把所有应用程序包中的Intent过滤器集合在一过滤器集合在一起,形成一个完整的起,形成一个完整的Intent过滤器列表。过滤器列表。q(2) 在在Intent与与Intent过滤器进行匹配时,过滤器进行匹配时,Android系统会将列系统会将列表中所有表中所有Intent过滤器的过滤器的“动作动作”和和“类别类别”与与Intent进行匹配,进行匹配,任何不匹配的任何不匹配的Intent过滤器都将被过滤掉。没有指定过滤器都将被过滤掉。没有
59、指定“动作动作”的的Intent过滤器可以匹配任何的过滤器可以匹配任何的Intent,但是没有指定,但是没有指定“类别类别”的的Intent过滤器只能匹配没有过滤器只能匹配没有“类别类别”的的Intent。q(3) 把把Intent数据数据Uri的每个子部与的每个子部与Intent过滤器的过滤器的标签中标签中的属性进行匹配,如果的属性进行匹配,如果标签指定了协议、主机名、路径名标签指定了协议、主机名、路径名或或MIME类型,那么这些属性都要与类型,那么这些属性都要与Intent的的Uri数据部分进行匹配数据部分进行匹配,任何不匹配的,任何不匹配的Intent过滤器均被过滤掉。过滤器均被过滤掉。
60、q(4) 如果如果Intent过滤器的匹配结果多于一个,则可以根据在过滤器的匹配结果多于一个,则可以根据在标签中定义的优先级标签来对标签中定义的优先级标签来对Intent过滤器进行排过滤器进行排序,优先级最高的序,优先级最高的Intent过滤器将被选择。过滤器将被选择。qIntentResolutionDemo示例说明了如何在示例说明了如何在AndroidManifest.xml文件中注册文件中注册Intent过滤器,以及如何设置过滤器,以及如何设置节点属性节点属性来捕获指定的来捕获指定的Intent。 6.2 Intent过滤器nIntent解析qAndroidManifest.xml的完整
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年深海微生物胞外多糖结构与生物活性研究
- 2026年黄金卷统一招生5月调研化学试题试卷含解析
- 2026届四川省广安市武胜县初三调研考试化学试题试卷含解析
- 2026届吉林省通化市名校初三5月第一次诊断性考试化学试题含解析
- 山东省莱阳市市级名校2026年初三3月中考诊断性测试(一模)化学试题试卷含解析
- 2026年江苏省如皋实验初三下学期期末教学统一检测试题化学试题试卷含解析
- 浙江省绍兴市诸暨市2026届初三下学期阶段性考试(一)生物试题试卷含解析
- 2026届黔东南市重点中学初三考前演练(四)化学试题试卷含解析
- 湖南省江华瑶族自治县2026届初三化学试题B版查缺补漏题含解析
- 2026年福建福州市仓山区第十二中学初三第四次月考化学试题含解析
- 哈铁单招数学试卷
- 农产品质量安全检测员岗位面试问题及答案
- DB42T 1615-2021 城镇排水管道检测与评估技术标准
- 木牛流马教学课件
- 无人机操控与维护专业教学标准(中等职业教育)2025修订
- 通辽市遴选和选调公务员笔试真题2024
- 动物园动物肖像摄影技巧
- 村居、社区退役军人服务站星级评定标准
- 电涌保护器基础知识课件
- 四川成都历年中考语文古诗欣赏试题汇编(2003-2023)
- 《新闻传播学》课件
评论
0/150
提交评论