我的android应用程序的两个实例正在运行....如何避免这种情况?

时间:2011-05-07 03:45:27

标签: android

这是我的问题 -

  1. 我将.apk文件复制到手机存储卡上并点击它启动我的应用程序,它允许我安装我的应用程序。我安装了我的应用程序。最后,我弹出系统安装包含两个选项“打开“和”完成“。当我点击”打开“时,我的应用程序已启动。到目前为止,一切正常,没有任何问题。

  2. 现在在我的应用程序中,我点击了一个按钮,结果发生了一些下载(显示进度对话框)。现在我按下一个主页按钮,所以我的应用程序转到后台。

  3. 现在我再次启动我的应用程序,进入菜单并单击我的应用程序图标。

  4. 预期结果 - 我仍然应该看到下载进度对话框。 实际结果 - 我的应用程序的新实例/会话正在开始。

  5. 那么如何避免这种情况,以便我的应用程序只能运行一个和一个实例/会话。

6 个答案:

答案 0 :(得分:9)

@Palejandro,你在这里。将以下代码放入主要活动 onCreate()方法:

// Possible work around for market launches. See
// http://code.google.com/p/android/issues/detail?id=2373
// for more details. Essentially, the market launches the main activity
// on top of other activities.
// We never want this to happen. Instead, we check if we are the root
// and if not, we finish.
if (!isTaskRoot()) {
    final Intent intent = getIntent();
    final String intentAction = intent.getAction();
    if (intent.hasCategory(Intent.CATEGORY_LAUNCHER) && intentAction != null && intentAction.equals(Intent.ACTION_MAIN)) {
        Log.w(TAG, "Main Activity is not the root. Finishing Main Activity instead of launching.");
        finish();
        return;
    }
}

我在我的项目中使用了这段代码并且工作正常!

答案 1 :(得分:8)

我相信你需要把

<activity
    android:launchMode="singleInstance"
</activity>
清单文件中的

答案 2 :(得分:1)

您的OnPauseOnResumeOnCreate是什么? 我敢打赌,你没有保存任何OnPause,并且一直通过OnCreate开始一个新的实例。

您应该阅读Activity Lifecycles.

上的说明

答案 3 :(得分:0)

如果您尚未对此进行排序,我会说您的应用程序实际上是在按下主页时被杀死,或者您可能有一个错误无法锁定任何对象保持状态。

答案 4 :(得分:0)

//在调用super和setcontentview()

之前将代码放在启动器活动中

ActivityManager am =(ActivityManager)this.getSystemService(ACTIVITY_SERVICE);

    // get the info from the currently running task
    List< ActivityManager.RunningTaskInfo > taskInfo = am.getRunningTasks(10);
    boolean alreadyTask=false;
    for(ActivityManager.RunningTaskInfo info : taskInfo){
        ComponentName componentInfo = info.topActivity;
        String value= componentInfo.getPackageName();
        if(value.contains(getPackageName()) && !info.topActivity.getClassName().contains(getPackageName()+".LauncherActivity")){
            alreadyTask=true;
            Log.i(TAG, "second instance found!!!");
            break;
        }
    }

    if(alreadyTask){
        finish();
    }

答案 5 :(得分:0)

我没有解决方案,但问题是,与从主屏幕打开相比,从安装中直接打开应用程序时启动应用程序的意图有所不同。由于它将以两个不同的意图开始,它将在第二轮打开一个新实例。

快速解决方法是避免按下&#34;打开&#34;安装应用程序时。按&#34;完成&#34;然后自己找到应用程序。

请参阅:http://code.google.com/p/android/issues/detail?id=2373