Grant,
这里的问题显然是对Android应用程序模型的误解。Commonsware关于如何解决这个问题的建议是绝对正确的。但是,如果不理解Android基础知识,我可以理解为什么您很难应用它。那么,以下是一个快速说明:
在Android中,每个操作都始于一个Intent。特别是针对Activities。每个Activity都有一个Intent。为了使开发人员的界面易于使用,您可以从操作系统响应Intent,也可以从Activities类创建Intent并使用。一般而言,最好采用第一种选项。
响应Intent
在选择要响应的Intent时,您可以对任何Intent进行响应。这称为操作。例如,如果我创建了一个名为“FOO”的Intent,则Bar Activity可以捕获并响应该Intent。但是我们通常会遵循惯例,其中主要的约定之一是将包名称前缀添加到任何Intent中。例如,“com.company.package.FOO”。简单地说,这样我们就可以避免与其他应用程序产生冲突。
每个Activity可能响应不同的事件。这在AndroidManifest.xml中定义。
<activity android:name="Activity3" ... >
<intent-filter>
<action android:name="com.company.package.FOO"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
我们还将类别设置为DEFAULT,这样除非用户更改它,否则我们将是唯一响应我们自定义Intent的应用。然后调用Intent的方式是使用我们创建的相同名称(即"com.company.package.FOO")。
startActivity(new Intent("com.company.package.FOO"));
这就是它的工作方式!您只需将上述“com.company.package.FOO”更改为您的包名(由您的应用程序定义)和有意义的内容即可。例如,“com.testapp.ws.SWAT_FLIES”。
为什么您的代码不起作用
Intent LaunchIntent = getPackageManager().getLaunchIntentForPackage("com.testapp.ws");
以上代码寻找特定类型的Intent动作。还记得您创建AndroidManifest和第一个Activity时放置的内容:
<action android:name="android.intent.action.MAIN">
<category android:name="android.intent.category.LAUNCHER">
使用getLaunchIntentForPackage()只会获取第一个Activity的Intent。这就是为什么我们需要创建自定义的Intent...首先,我们不想让第三个Activity成为启动项...其次,操作系统只会告诉我们启动Activity,我们必须使用自己的操作(即“com.testapp.ws.SWAT_FLIES”)来告诉它。
希望能对您有所帮助,
FuzzicalLogic