我有两个Android应用程序,假设它们是“A”和“B”,“A”有五个活动,我想从按钮点击事件“B”调用它的特定活动。 我测试了这种从另一个应用程序调用一个应用程序的方式:
Intent LaunchIntent = getPackageManager().getLaunchIntentForPackage("com.testapp.ws");
startActivity(LaunchIntent);
“com.testapp.ws”是包名“A”。
它从第一个活动再次运行“A”,而不是从特定活动运行。 如何调用A的指定活动?
答案 0 :(得分:35)
格兰特,
这里的问题显然是对Android应用程序模型的误解。 Commonsware对于如何解决这个问题绝对正确。但是,如果不了解Android基础知识,我就会明白为什么你在应用它时遇到了困难。所以,快速解释一下:
Android中的每个操作都以Intent开头。活动尤其如此。每个活动都有一个意图。为了使开发人员易于使用界面,您可以从操作系统中响应Intent,或者您可以从Activities类创建一个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的方式是使用我们创建的SAME NAME(即“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操作KIND。记住当你制作AndroidManifest和你放的第一个Activity时:
<action android:name="android.intent.action.MAIN">
<category android:name="android.intent.category.LAUNCHER">
嗯...... getLaunchIntentForPackage()只获取第一个Activity的Intent。这就是为什么我们制作一个自定义的Intent ...首先,因为我们并不真的希望它成为我们的第三个活动才能成为我们的开始......其次,因为操作系统只会告诉我们启动活动。我们必须用我们的OWN行动告诉它(即“com.testapp.ws.SWAT_FLIES”)
希望这有帮助,
FuzzicalLogic
答案 1 :(得分:22)
步骤1:使用自定义操作向第三个活动添加<intent-filter>
:
<intent-filter>
<action android:name="com.testapp.ws.SOMETHING_USEFUL"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
步骤2:使用适当的Intent
:
startActivity(new Intent("com.testapp.ws.SOMETHING_USEFUL"));
答案 2 :(得分:3)
在某些情况下,您可能没有使用两个专门具有编辑功能的应用程序,或者您可能不想进行自定义意图,因此在这种情况下还有另一种选择(可用性更好的错误检查):
Intent intent = new Intent();
intent.setClassName("PACKAGE_NAME", "PACKAGE_NAME.TARGET_ACTIVITY");
if (isCallable(context, intent)) {
// Attach any extras, start or start with callback
} else {
// Respond to the application or activity not being available
}
主类或处理常规方法的子类中的某处:
public static boolean isCallable(Activity activity, Intent intent) {
List<ResolveInfo> list = activity.getPackageManager().queryIntentActivities(intent,PackageManager.MATCH_DEFAULT_ONLY);
return list.size() > 0;
}
答案 3 :(得分:1)
这是从其他应用程序打开应用程序(ex whatsapp)的代码
公共类MainActivity扩展了Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button bClock = (Button) findViewById(R.id.button1);
bClock.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Intent i = new Intent(Intent.ACTION_MAIN);
PackageManager managerclock = getPackageManager();
i = managerclock.getLaunchIntentForPackage("com.whatsapp");
i.addCategory(Intent.CATEGORY_LAUNCHER);
startActivity(i);
}
});
} }