如何在另一个应用程序中启动活动?


77

我的应用程序A定义如下:

<application android:icon="@drawable/icon" android:label="@string/app_name">
    <activity android:name="com.example.MyExampleActivity"
              android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

现在在应用程序B中,如何编写代码以启动应用程序A中的活动?谢谢!

Answers:


151

如果您遇到“拒绝权限:正在启动意图...”错误,或者如果应用在启动应用期间因任何原因崩溃,请在清单中使用此单行代码

android:exported="true"

请注意finish(); ,如果您错过了它,该应用程序将被冻结。如果提到该应用程序将是一个平稳的启动器。

finish();

另一个解决方案仅适用于同一应用程序中的两个活动。就我而言,应用程序B不知道com.example.MyExampleActivity.class代码中的类,因此编译将失败。

我在网上搜索后发现以下内容,效果很好。

Intent intent = new Intent();
intent.setComponent(new ComponentName("com.example", "com.example.MyExampleActivity"));
startActivity(intent);

您也可以使用setClassName方法:

Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setClassName("com.hotfoot.rapid.adani.wheeler.android", "com.hotfoot.rapid.adani.wheeler.android.view.activities.MainActivity");
startActivity(intent);
finish();

您还可以将值从一个应用程序传递到另一个应用程序:

Intent launchIntent = getApplicationContext().getPackageManager().getLaunchIntentForPackage("com.hotfoot.rapid.adani.wheeler.android.LoginActivity");
if (launchIntent != null) {
    launchIntent.putExtra("AppID", "MY-CHILD-APP1");
    launchIntent.putExtra("UserID", "MY-APP");
    launchIntent.putExtra("Password", "MY-PASSWORD");
    startActivity(launchIntent);
    finish();
} else {
    Toast.makeText(getApplicationContext(), " launch Intent not available", Toast.LENGTH_SHORT).show();
}

1
很高兴看到这个答案!但是,在我的情况下(Android 4.2),出现“拒绝权限:启动Intent ...”错误。有什么线索吗?
JackWM

11
@JackWM将android:exported =“ true”添加到您的活动属性中
Evan_HZY 2014年

3
@JackWM如果您要启动的活动具有意图过滤器,它也将起作用。这是因为android:exportedXML属性的默认值true是存在意图过滤器时的值。
Trebor Rude 2014年

现在,当您从第一个应用程序启动第二个应用程序的活动时,关于如何以编程方式在第二个应用程序中获取哪个活动(或一个应用程序)启动了该活动的任何线索?答案当然是第一个应用程序,但是如何获取它以编程方式在您的第二个应用程序中?
Sash_KP 2014年

3
嗯,不为我工作。我有两个应用程序,每个都有一个活动:com.examplea.MainActivityAcom.exampleb.MainActivityB。在MainActivityA中,我运行带有字符串“ com.exampleb”和“ com.exampleb.MainActivityB”的代码段。但是,我得到了android.content.ActivityNotFoundException: Unable to find explicit activity class {com.exampleb/com.exampleb.MainActivityB}; have you declared this activity in your AndroidManifest.xml?
Erhannis 2014年

15

如果两个应用程序都具有相同的签名(这意味着两个应用程序都是您的,并且使用相同的密钥签名),则可以按以下方式调用其他应用程序活动:

Intent LaunchIntent = getActivity().getPackageManager().getLaunchIntentForPackage(CALC_PACKAGE_NAME);
startActivity(LaunchIntent);

希望能帮助到你。


7
您不需要两个应用程序都具有相同的签名。例如,您可以使用以下方法启动Google Maps:Intent i = getPackageManager()。getLaunchIntentForPackage(“ com.google.android.apps.maps”);
蒂姆·奥丁

1
@TimAutin如果我需要启动一个我无法控制的应用程序的特定活动该怎么办?
Epicality '18

1
我从来没有这样做,所以我不知道。您是否尝试过这个答案stackoverflow.com/a/2210073/1356106
蒂姆·奥丁
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.