授予,
这里的问题显然是对 Android 应用程序模型的误解。Commonsware 关于如何解决这个问题是绝对正确的。但是,在不了解 Android 基础知识的情况下,我可以理解您为什么难以应用它。所以,一个快速的解释:
Android 中的每个操作都以 Intent 开头。对于活动尤其如此。每个活动都有一个意图。为了使开发人员的界面更容易,您可以响应来自操作系统的 Intent,或者您可以从活动类创建一个 Intent 以供使用。通常,最佳做法是执行第一个选项。
响应意图
在选择要响应的 Intent 时,您可以逐字地响应任何 Intent。这称为动作。如果我创建了一个名为“FOO”的 Intent,Bar Activity 可以将其拾取并做出响应。但是,我们有约定,其中主要的是将您的包名称添加到您创建的任何 Intent 中。例如“com.company.package.FOO”。简而言之,这是为了避免与其他应用程序发生冲突。
每个活动都可能响应不同的事件。这是在 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。我们必须用我们的 OWN 动作来告诉它(即“com.testapp.ws.SWAT_FLIES”)
希望这可以帮助,
模糊逻辑