Android Intent机制实例详解(3)

Android Intent机制实例详解

  

  

从这些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爱好者  阅读(156)  评论(0编辑  收藏  举报

导航