大学IT网 - 最懂大学生的IT学习网站! QQ资料交流群:367606806
当前位置:大学IT网 > Android技巧 > 最全面的Android Intent机制讲解

最全面的Android Intent机制讲解(1)

关键词:机制AndroidIntent  阅读(1308) 赞(17)

[摘要]本文是对最全面的Android Intent机制讲解的讲解,对学习Android编程技术有所帮助,与大家分享。

对于大型软件开发经验较少的程序员来说,这可能是一个不太容易理解的抽象概念,因为它与我们平常使用的简单函数调用,或者通过库调用接口的方式不太一样。在 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切换

通常一个应用程序中需要多个UI 屏幕,也就需要多个Activity 类,并且在这些 Activity 之间进行切换,这种切换就是通过 Intent 机制来实现的。

在同一个应用程序中切换 Activity时,我们通常都知道要启动的 Activity 具体是哪一个,因此常用显式的 Intent 来实现。下面的例子用来实现一个非常简单的应用程序 SimpleIntentTest ,它包括两个UI 屏幕也就是两个 Activity——SimpleIntentTest类和 TestActivity 类, SimpleIntentTest类有一个按钮用来启动 TestActivity。

程序的代码非常简单, SimpleIntentTest类的源代码如下:

Java代码
  1. packagecom.tope.samples.intent.simple;
  2. importandroid.app.Activity;
  3. importandroid.content.Intent;
  4. importandroid.os.Bundle;
  5. importandroid.view.View;
  6. importandroid.widget.Button;
  7. publicclassSimpleIntentTestextendsActivityimplementsView.OnClickListener{
  8. /**Calledwhentheactivityisfirstcreated.*/
  9. @Override
  10. publicvoidonCreate(BundlesavedInstanceState){
  11. super.onCreate(savedInstanceState);
  12. setContentView(R.layout.main);
  13. ButtonstartBtn=(Button)findViewById(R.id.start_activity);
  14. startBtn.setOnClickListener(this);
  15. }
  16. publicvoidonClick(Viewv){
  17. switch(v.getId()){
  18. caseR.id.start_activity:
  19. Intentintent=newIntent(this,TestActivity.class);
  20. startActivity(intent);
  21. break;
  22. default:
  23. break;
  24. }
  25. }
  26. }

上面的代码中,主要是为“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 或其他开发环境下添加一个新的类,这里不作详述,请参考其他文档),如下所示:

Java代码
  1. packagecom.tope.samples.intent.simple;
  2. importandroid.app.Activity;
  3. importandroid.os.Bundle;
  4. publicclassTestActivityextendsActivity{
  5. /**Calledwhentheactivityisfirstcreated.*/
  6. @Override
  7. publicvoidonCreate(BundlesavedInstanceState){
  8. super.onCreate(savedInstanceState);
  9. setContentView(R.layout.test_activity);
  10. }
  11. }

可见 TestActivity仅仅是调用 setContentView 来显示 test_activity.xml 中的内容而已。对于 test_activity.xml及本例中所用到其他xml文件这里不作多余说明。

如果我们仅仅是做上面的一些 工作,还不能达到利用 SimpleIntentTest 启动 TestActivity的目的。事实上,这样做会出现下面的 Exception ,导致程序退出。以下是利用logcat工具记录的log 信息(省略了后半部分):

I/ActivityManager( 569): Displayed activity com.tope.samples/.SimpleIntentTest: 3018 ms
I/ActivityManager( 569): Starting activity: Intent { comp={com.tope.samples/com.tope.samples.TestActivity} }
D/AndroidRuntime( 932): Shutting down VM
W/dalvikvm( 932): threadid=3: thread exiting with uncaught exception (group=0x4000fe70)
E/AndroidRuntime( 932): Uncaught handler: thread main exiting due to uncaught exception
E/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 的声明,如下所示:

«上一页123下一页»


相关评论