Android Intent机制实例详解(3)
从这些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的声明,如下所示,注意粗体字部分:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.tope.samples" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".SimpleIntentTest" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".TestActivity"/> </application> <uses-sdk android:minSdkVersion="3" /> </manifest> |
完成这个修改后再重新运行该程序,就一切都正常了。
从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 com.tope.samples.intent.cross;
import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button;
public class CrossIntentTest extends Activity implements View.OnClickListener{ /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button startBtn = (Button)findViewById(R.id.start_activity); startBtn.setOnClickListener(this); }
public void onClick(View v) { switch (v.getId()) { case R.id.start_activity: Intent intent = new Intent(); intent.setClassName("com.tope.samples.intent.simple", "com.tope.samples.intent.simple.TestActivity"); startActivity(intent); break; default: break; } } } |
注意比较它与SimpleIntentTest的不同之处主要在于初始化Intent对象的过程:
Intent intent = new Intent(); intent.setClassName("com.tope.samples.intent.simple", "com.tope.samples.intent.simple.TestActivity"); startActivity(intent); |
posted on 2011-05-30 21:29 android爱好者 阅读(157) 评论(0) 编辑 收藏 举报