已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Android Intent机制实例详解(1)Android中提供了Intent机制来协助应用间的交互与通讯,或者采用更准确的说法是,Intent不仅可用于应用程序之间,也可用于应用程序内部的Activity/Service之间的交互。Intent这个英语单词的本意是“目的、意向”等,对于较少从事于大型平台开发工作的程序员来说,这可能是一个不太容易理解的抽象概念,因为它与我们平常使用的简单函数/方法调用,或者上节中提到的通过库调用接口的方式不太一样。在Intent的使用中你看不到直接的函数调用,相对函数调用来说,Intent是更为抽象的概念,利用Intent所实现的软件复用的粒度是Activity/Service,比函数复用更高一些,另外耦合也更为松散。Android中与Intent相关的还有Action/Category及Intent Filter等,另外还有用于广播的Intent,这些元素掺杂在一起,导致初学者不太容易迅速掌握Intent的用法。在讲解这些名词之前,我们先来从下面的例子中感受一下Intent的一些基本用法,看看它能做些什么,之后再来思考这种机制背后的意义。理解Intent的关键之一是理解清楚Intent的两种基本用法:一种是显式的Intent,即在构造Intent对象时就指定接收者,这种方式与普通的函数调用类似,只是复用的粒度有所差别;另一种是隐式的Intent,即Intent的发送者在构造Intent对象时,并不知道也不关心接收者是谁,这种方式与函数调用差别比较大,有利于降低发送者和接收者之间的耦合。另外Intent除了发送外,还可用于广播,这些都将在后文进行详细讲述。下面的一小节我们来看看显式Intent的用法。显式的Intent(Explicit Intent) 同一个应用程序中的Activity切换我们在前面的章节已经讨论过Activity的概念,通常一个应用程序中需要多个UI屏幕,也就需要多个Activity类,并且在这些Activity之间进行切换,这种切换就是通过Intent机制来实现的。在同一个应用程序中切换Activity时,我们通常都知道要启动的Activity具体是哪一个,因此常用显式的Intent来实现。下面的例子用来实现一个非常简单的应用程序SimpleIntentTest,它包括两个UI屏幕也就是两个ActivitySimpleIntentTest类和TestActivity类,SimpleIntentTest类有一个按钮用来启动TestActivity,程序运行的截图如图5.3所示:程序的代码非常简单,SimpleIntentTest类的源代码如下:package ent.simple;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.widget.Button;publicclass SimpleIntentTest extends Activity implements View.OnClickListener /*Calledwhentheactivityisfirstcreated.*/ Override publicvoid onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.main); Button startBtn = (Button)findViewById(R.id.start_activity); startBtn.setOnClickListener(this); publicvoid onClick(View v) switch (v.getId() case R.id.start_activity: Intent intent = new Intent(this, TestActivity.class); startActivity(intent); break; default: break; 上面的代码中,主要是为“Start activity”按钮添加了OnClickListener,使得按钮被点击时执行onClick()方法,onClick()方法中则利用了Intent机制,来启动TestActivity,关键的代码是下面这两行:Intent intent = new Intent(this, TestActivity.class);startActivity(intent);这里定义Intent对象时所用到的是Intent的构造函数之一:Intent(Context packageContext, Class cls)两个参数分别指定Context和Class,由于将Class设置为TestActivity.class,这样便显式的指定了TestActivity类作为该Intent的接收者,通过后面的startActivity()方法便可启动TestActivity。TestActivity的代码更为简单(定义TestActivity类需要新建TestActivity.java文件,如果你是一个初学者,你需要学会如何在Eclipse或其他开发环境下添加一个新的类,本书不作详述,请参考其他文档),如下所示:package ent.simple;import android.app.Activity;import android.os.Bundle;publicclass TestActivity extends Activity /*Calledwhentheactivityisfirstcreated.*/ Override publicvoid onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.test_activity); 可见TestActivity仅仅是调用setContentView来显示test_activity.xml中的内容而已。对于test_activity.xml及本例中所用到其他xml文件这里不作多余说明,读者练习时可自行参考本书所附光盘中的源代码。如果我们仅仅是做上面的一些工作,还不能达到利用SimpleIntentTest启动TestActivity的目的。事实上,这样做会出现下面的Exception,导致程序退出。以下是利用logcat工具记录的log信息(省略了后半部分):I/ActivityManager( 569): Displayed activity com.tope.samples/.SimpleIntentTest: 3018 msI/ActivityManager( 569): Starting activity: Intent comp=com.tope.samples/com.tope.samples.TestActivity D/AndroidRuntime( 932): Shutting down VMW/dalvikvm( 932): threadid=3: thread exiting with uncaught exception (group=0x4000fe70)E/AndroidRuntime( 932): Uncaught handler: thread main exiting due to uncaught exceptionE/AndroidRuntime( 932): android.content.ActivityNotFoundException: Unable to find explicit activity class com.tope.samples/com.tope.samples.TestActivity; have you declared this activity in your AndroidManifest.xml?E/AndroidRuntime( 932): at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1480)E/AndroidRuntime( 932): at android.app.Instrumentation.execStartActivity(Instrumentation.java:1454)E/AndroidRuntime( 932): at android.app.Activity.startActivityForResult(Activity.java:2656)E/AndroidRuntime( 932): at android.app.Activity.startActivity(Activity.java:2700)E/AndroidRuntime( 932): at com.tope.samples.SimpleIntentTest.onClick(SimpleIntentTest.java:24)从这些log中我们可以看到点击按钮后startActivity的调用过程,主要的原因是:“android.content.ActivityNotFoundException: Unable to find explicit activity class com.tope.samples/com.tope.samples.TestActivity; have you declared this activity in your AndroidManifest.xml?”从这些log我们可以看到原因是找不到TestActivity这个Activity,并且log中还给出了提示:你是否在AndroidManifest.xml中声明了这个Activity?解决问题的方法也就是按照提示在AndroidManifest.xml中增加TestActivity的声明,如下所示,注意粗体字部分: 完成这个修改后再重新运行该程序,就一切都正常了。从AndroidManifest.xml修改的过程我们可以体会到,Intent机制即使在程序内部且显式指定接收者,也还是需要在AndroidManifest.xml中声明TestActivity。这个过程并不像一个简单的函数调用,显式的Intent也同样经过了Android应用程序框架所提供的支持,从满足条件的Activity中进行选择,如果不在AndroidManifest.xml中进行声明,则Android应用程序框架找不到所需要的Activity。请读者通过我们的示例来逐步理解AndroidManifest.xml在这个过程中所扮演的角色,这样有利于理解Intent的作用,及后面的Intent Filter。当然,这个例子仅仅是开始,且看下文分解。 不同应用程序之间的Activity切换上面的例子我们所做的是在同一应用程序中进行Activity的切换,那么在不同的应用程序中,是否也能这么做呢,答案是肯定的,不过对应的代码要稍作修改。本例中我们需要两个应用程序,可利用上例中的SimpleIntentTest作为其中之一,另外还需要写一个新的程序,来调用SimpleIntentTest应用程序中的TestActivity。我们新建程序CrossIntentTest(注意不是新建一个类,如果是Eclipse环境,选择File-New-Project新建工程),其中只有一个Activity,其源代码与SimpleIntentTest.java类似:package ent.cross;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.widget.Button;publicclass CrossIntentTest extends Activity implements View.OnClickListener /*Calledwhentheactivityisfirstcreated.*/ Override publicvoid onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.main); Button startBtn = (Button)findViewById(R.id.start_activity); startBtn.setOnClickListener(this); publicvoid onClick(View v) switch (v.getId() case R.id.start_activity: Intent intent = new Intent(); intent.setClassName(ent.simple, ent.simple.TestActivity); startActivity(intent); break; default: break; 注意比较它与SimpleIntentTest的不同之处主要在于初始化Intent对象的过程:Intent intent = new Intent();intent.setClassName(ent.simple, ent.simple.TestActivity);startActivity(intent);package ent.simple;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.widget.Button;publicclass SimpleIntentTest extends Activity implements View.OnClickListener /*Calledwhentheactivityisfirstcreated.*/ Override publicvoid onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.main); Button startBtn = (Button)findViewById(R.id.start_activity); startBtn.setOnClickListener(this); publicvoid onClick(View v) switch (v.getId() case R.id.start_activity: Intent intent = new Intent(this, TestActivity.class); startActivity(intent); break; default: break; 上面的代码中,主要是为“Start activity”按钮添加了OnClickListener,使得按钮被点击时执行onClick()方法,onClick()方法中则利用了Intent机制,来启动TestActivity,关键的代码是下面这两行:Intent intent = new Intent(this, TestActivity.class);startActivity(intent);这里定义Intent对象时所用到的是Intent的构造函数之一:Intent(Context packageContext, Class cls)两个参数分别指定Context和Class,由于将Class设置为TestActivity.class,这样便显式的指定了TestActivity类作为该Intent的接收者,通过后面的startActivity()方法便可启动TestActivity。TestActivity的代码更为简单(定义TestActivity类需要新建TestActivity.java文件,如果你是一个初学者,你需要学会如何在Eclipse或其他开发环境下添加一个新的类,本书不作详述,请参考其他文档),如下所示:package ent.simple;import android.app.Activity;import android.os.Bundle;publicclass TestActivity extends Activity /*Calledwhentheactivityisfirstcreated.*/ Override publicvoid onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.test_activity); 可见TestActivity仅仅是调用setContentView来显示test_activity.xml中的内容而已。对于test_activity.xml及本例中所用到其他xml文件这里不作多余说明,读者练习时可自行参考本书所附光盘中的源代码。如果我们仅仅是做上面的一些工作,还不能达到利用SimpleIntentTest启动TestActivity的目的。事实上,这样做会出现下面的Exception,导致程序退出。以下是利用logcat工具记录的log信息(省略了后半部分):I/ActivityManager( 569): Displayed activity com.tope.samples/.SimpleIntentTest: 3018 msI/ActivityManager( 569): Starting activity: Intent comp=com.tope.samples/com.tope.samples.TestActivity D/AndroidRuntime( 932): Shutting down VMW/dalvikvm( 932): threadid=3: thread exiting with uncaught exception (group=0x4000fe70)E/AndroidRuntime( 932): Uncaught handler: thread main exiting due to uncaught exceptionE/AndroidRuntime( 932): android.content.ActivityNotFoundException: Unable to find explicit activity class com.tope.samples/com.tope.samples.TestActivity; have you declared this activity in your AndroidManifest.xml?E/AndroidRuntime( 932): at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1480)E/AndroidRuntime( 932): at android.app.Instrumentation.execStartActivity(Instrumentation.java:1454)E/AndroidRuntime( 932): at android.app.Activity.startActivityForResult(Activity.java:2656)E/AndroidRuntime( 932): at android.app.Activity.startActivity(Activity.java:2700)E/AndroidRuntime( 932): at com.tope.samples.SimpleIntentTest.onClick(SimpleIntentTest.java:24)从这些log中我们可以看到点击按钮后startActivity的调用过程,主要的原因是:“android.content.ActivityNotFoundException: Unable to find explicit activity class com.tope.samples/com.tope.samples.TestActivity; have you declared this activity in your AndroidManifest.xml?”从这些log我们可以看到原因是找不到TestActivity这个Activity,并且log中还给出了提示:你是否在AndroidManifest.xml中声明了这个Activity?解决问题的方法也就是按照提示在AndroidManifest.xml中增加TestActivity的声明,如下所示,注意粗体字部分: 完成这个修改后再重新运行该程序,就一切都正常了。从AndroidManifest.xml修改的过程我们可以体会到,Intent机制即使在程序内部且显式指定接收者,也还是需要在AndroidManifest.xml中声明TestActivity。这个过程并不像一个简单的函数调用,显式的Intent也同样经过了Android应用程序框架所提供的支持,从满足条件的Activity中进行选择,如果不在AndroidManifest.xml中进行声明,则Android应用程序框架找不到所需要的Activity。请读者通过我们的示例来逐步理解AndroidManifest.xml在这个过程中所扮演的角色,这样有利于理解Intent的作用,及后面的Intent Filter。当然,这个例子仅仅是开始,且看下文分
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026-2031中国股权投资市场研究报告
- 压力容器爆炸事故应急救援演练脚本
- 2025年天津燃气面试试题及答案
- 2025年绿化工职业技能竞赛参考试题库含答案
- 2025年交安B(公路水运)学习资料题库及答案
- 2025年专升本政治真题试卷及答案
- 泌尿外科患者发生引流管脱落的应急预案演练脚本
- 2026年农业基因编辑技术合作合同
- 梯形的面积(教学设计)-2024-2025学年五年级上册数学人教版
- 2025三基医师三严考试试题及答案
- 人教版六年级上册道德与法治知识点
- 产前筛查知情同意书制度
- 大学生职业生涯规划课件教学
- GB/T 10069.3-2024旋转电机噪声测定方法及限值第3部分:噪声限值
- 2024年全国职业院校技能大赛中职(数字产品检测与维护赛项)考试题库(含答案)
- 中医内科学讲义(四)喘证
- 人教Go for it新版八年级上册词汇表(英语单词版)
- 医用臭氧在外科手术中的消毒应用
- 高压旋喷桩安全培训试卷
- 铬矿市场需求分析
- 野菊花种植可行性方案
评论
0/150
提交评论