首页 > 解决方案 > 由第三方通过“共享列表”调用。如何防止创建多个 Activity 实例?

问题描述

我的应用程序有两个活动:
1.LoadingActivity:它用于接收来自其他应用程序的数据。
2.MainPageActivity:当LoadingActivity完成数据处理后,进入MainPageActivity并显示结果。

我的目的是让我的应用程序在被其他应用程序调用时保持在前台和唯一的一个活动实例上。
如果我的应用程序在后台,当用户在共享列表中选择我的应用程序时,我的应用程序将在前台并显示结果。
如果我的应用程序没有打开,当用户在共享列表中选择我的应用程序时,我的应用程序将被打开并在前台显示结果。
为了满足要求,我执行如下代码。

我遇到了问题:
我的应用程序在后台运行。
如果从“文本副本”获取共享数据,isTaskRoot()总是返回true。(被多次调用,会有多个活动实例)但是,如果从“谷歌地图共享位置”获取共享数据,isTaskRoot()返回false,不创建另一个活动实例。
这两种“共享”情况有什么区别?

我的代码:1.Androidmanifest.xml

<activity android:name="com.test.activities.LoadingActivity"
    android:configChanges="orientation|screenSize" android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
    <intent-filter>
        <action android:name="android.intent.action.SEND"></action>
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="text/plain" />
    </intent-filter>
</activity>

2.LoadingActivity.java

public class LoadingScreenActivity extends Activity {
  @Override
  public void onCreate(Bundle savedInstanceState) {
    ... 
    if (!isTaskRoot()) {
    check3rdRequest(false, null);
    finish();
    return;     
    }
    ...
}

标签: androidandroid-intent

解决方案


在单独的活动中显示加载程序有点硬核。请考虑在所有内容之上使用片段/片段对话框/ ProgressView。

然后,要回答您的问题,请考虑添加

android:launchMode= "singleInstance"

到清单


推荐阅读