【问题标题】:Android start activity of second app having no icon from first app第二个应用程序的Android启动活动没有第一个应用程序的图标
【发布时间】:2018-02-24 16:34:46
【问题描述】:

我有两个应用程序。第一个应用程序有一个活动,我想从第二个应用程序启动一个活动。我正在使用以下代码:

Intent launchIntent = m_context.getPackageManager().getLaunchIntentForPackage(m_packageName);
    if (launchIntent != null) {
        m_context.startActivity(launchIntent);
}

此代码可以很好地从第二个应用程序启动活动,但我希望第二个应用程序没有任何图标。我在第二个应用程序的MainActivity 中使用以下代码来删除图标:

PackageManager p = getPackageManager();
//Removing app icon
ComponentName componentName = new ComponentName(this, com.tools.html2pdf.MainActivity.class);
p.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);

此代码成功删除了启动器图标,但我的第一个应用程序的活动无法从第二个应用程序启动活动。

有人可以在这方面帮助我吗?我想从另一个应用程序的活动中启动一个没有图标的应用程序的活动。

【问题讨论】:

    标签: android android-activity android-launcher


    【解决方案1】:

    如果您不希望第二个应用有应用图标,只需删除第二个应用中根 Activity 的 ACTION=MAIN 和 CATEGORY=LAUNCHER 的 <intent-filter>。安装应用时,如果没有<intent-filter> ACTION=MAIN 和 CATEGORY=LAUNCHER,则不会显示应用图标。

    您的应用仍然可以启动第二个应用,但不能使用您描述的方法,因为 Android 不知道哪个是“启动”Activity。假设您知道要在第二个应用程序中启动的 Activity 的包和类名,您可以这样启动它:

    Intent launchIntent = new Intent();
    launchIntent.setClassName("second.package.name", "fully.qualified.class.name.of.MainActivity");
    // add and Intent flags if necessary here
    launchIntent.addFlags(Intent.FLAG_ACTIVITY_...);
    startActivity(launchIntent);
    

    【讨论】:

      【解决方案2】:

      当您像您所做的那样禁用component 时,component 无法以任何方式启动。然而,有趣的是,您的第二个应用程序的其他组件(非禁用活动)仍然可以启动。

      因此,您可以在第二个应用程序中为您的MainActivity 创建一个别名,该别名将用于您的目的。我们将别名称为MainActivityAlias

      从您的第一个应用程序中,在MainActivity 上调用intent。将执行禁用component 的代码,并且不会打开任何内容。但是,该图标将消失,因为此 component 已禁用,并且与此 component 相关的所有内容(即图标)也已消失。

      现在,在第一个应用程序的 intent 上方之后,在 MainActivityAlias 上调用 intent。这只是MainActivity 的副本,但它没有任何禁用代码,因此它已启用并可启动。

      一些旁注:

      1) 两个活动都应该有一个<intent-filter>android.intent.action.MAIN

      2) 你的MainActivity 应该是启动器activity,因此manifest 中应该有android.intent.category.LAUNCHER

      3) 在MainActivity 内部,您必须检查呼叫来自何处。如果调用来自第一个应用程序,则执行代码以禁用您在问题中提到的图标。如果呼叫来自启动器图标,则使用意图打开 MainActivityAlias。你可以知道电话来自哪里,比如this

      注意 - 这只是一个想法。我没有测试过。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-09-03
        • 2021-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-27
        相关资源
        最近更新 更多