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

Posted

技术标签:

【中文标题】如何在另一个应用程序中启动活动?【英文标题】:How to start activity in another application? 【发布时间】:2011-01-13 15:35:24 【问题描述】:

我的应用程序 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 中的活动?谢谢!

【问题讨论】:

【参考方案1】:

如果你们遇到“Permission Denial:starting Intent...”错误,或者应用在启动应用期间无故崩溃 - 然后在 Manifest 中使用此单行代码

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();

【讨论】:

很高兴看到这个答案!但是,在我的情况下(Android 4.2),我收到“Permission Denial:starting Intent ...”错误。有什么线索吗? @JackWM 将 android:exported="true" 添加到您的活动属性中 @JackWM 如果您尝试启动的活动具有意图过滤器,它也将起作用。这是因为当存在意图过滤器时,android:exported XML 属性的默认值为 true 现在,当您从第一个应用程序启动第二个应用程序的活动时,任何关于如何在第二个应用程序中以编程方式获取哪个活动(或应用程序)启动该活动的线索?答案将是第一个当然是应用程序,但是如何以编程方式将其放入您的第二个应用程序中? 嗯,不适合我。我有两个应用程序,每个应用程序都有一个活动:com.examplea.MainActivityAcom.exampleb.MainActivityB。我从 MainActivityA 运行您的代码 sn-p,带有字符串“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?【参考方案2】:

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

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

希望对你有帮助。

【讨论】:

您不需要两个应用程序具有相同的签名。例如,您可以使用以下命令启动 Google 地图:Intent i = getPackageManager().getLaunchIntentForPackage("com.google.android.apps.maps"); @TimAutin 如果我需要启动属于我无法控制的应用的特定活动怎么办? 我从来没有这样做过,所以我不知道。你试过这个答案***.com/a/2210073/1356106 吗?

以上是关于如何在另一个应用程序中启动活动?的主要内容,如果未能解决你的问题,请参考以下文章

Android:在另一个活动中停止服务

如何将我在 EditText 框中键入的数据添加到数组中以在另一个活动中列出?

如何在 Android Studio 中使用按钮按初始筛选并使用 SQLite 将其显示在另一个活动上

在 swift 3 中启动应用程序时,如何在另一个 ViewController 中预加载 UIWebView?

如何使用 Qt 在另一台设备中启动和停止外部程序?

在另一个项目中插入活动的正确方法是啥?