格兰特,
这里的问题显然是对Android应用程序模型的误解。 Commonsware对于如何解决这个问题是绝对正确的。但是,如果不理解Android基础知识,我可以看到为什么您难以应用它。所以,快速解释:
Android中的每个操作都以Intent开始。活动尤其如此。每个活动都有一个意图。为了让开发人员可以轻松使用界面,您可以从操作系统响应Intent,或者可以从Activities类创建一个Intent以供使用。一般来说,最好的做法是做第一个选择。
响应一个Intent
当选择的意向作出回应,你可以从字面上任何意图做出回应。这被称为行动。如果我创建了一个名为“FOO”的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>
上面,我们还可以设置类别默认值,因此,除非用户改变它,我们会是响应我们的定制意向的唯一的应用程序。我们随后致电意图的方法是使用我们创建的同名(即“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");
上面的代码查找意向行动的特定种类。记住,当你所做的AndroidManifest和第一活动你就把:
<action android:name="android.intent.action.MAIN">
<category android:name="android.intent.category.LAUNCHER">
嗯...... getLaunchIntentForPackage()只获取用于第一个活动的意图。这就是为什么我们要制定一个定制的意图......首先,因为我们并不真的希望它成为我们的第三个活动,我们要启动......第二,因为操作系统只会告诉我们启动活动。我们有我们自己的行动来告诉它(即“com.testapp.ws.SWAT_FLIES”)
希望这有助于
FuzzicalLogic
感谢Mr.Fuzzical Logic提供的详细说明。在提到您的解释后,我已成功实施了该应用。非常感谢! – Grant
如果我想将数据从一个应用程序中的一个活动发送到另一个应用程序中的服务,这将如何实现? – Aada
实际上,在启动startService()之前,您只需要Intent ACTION并通过setExtra发送数据。你可能必须首先构建意图(即意图myIntent =新的意图(“com.company.app.ACTION”) –