【问题标题】:Is there any way to have one and only one instance of each activity?有没有办法让每个活动只有一个实例?
【发布时间】:2012-01-24 23:44:22
【问题描述】:

我发现在我的应用程序中,用户可以完全“嵌套”在用户使用应用程序时打开的各种活动中。

例如:

  1. 主菜单
  2. 对象列表
  3. 对象详细信息
  4. 对象编辑
  5. 对象详细信息
  6. 对象子详细信息
  7. 对象子编辑
  8. 对象子详细信息

现在,当用户按下返回时,它必须经过两次“对象子详细信息”(同一个对象,编辑时返回详细页面),“父对象详细信息”也会发生同样的事情.

有没有办法重用活动,如果它们已经在堆栈中打开,并将它们重新排序到前面?我看到的唯一方法是使用 launcher 属性的活动。我相信我看到了singleTasksingleTop

如果我应该使用这两个属性,singleTasksingleTop,我应该如何使用它们?当我试图将它们包含在应用程序中时,它没有任何区别。使用startActivity 启动意图时是否还需要设置标志?

【问题讨论】:

    标签: android android-manifest android-activity


    【解决方案1】:

    在Manifest Activity属性中你可以给这个参数android:launchMode="singleInstance"

    在此处阅读更多详细信息http://developer.android.com/guide/topics/manifest/activity-element.html

    【讨论】:

    • 在不了解launchMode="singleInstance" 的所有含义之前不要使用它。这实际上重新排序活动,因为它强制活动完全在一个单独的任务中(即,它将与应用程序在最近的应用程序列表)。因此,如果您对应用程序中的每个活动都执行此操作,您将在“最近的应用程序”列表中看到它们中的每一个作为单独的条目。至少文档是这么说的。 reality is a little different.
    • 我的建议是改用Intent.FLAG_ACTIVITY_REORDER_TO_FRONT(正如下面维克拉姆的回答所建议的那样),尽管这不是一个完美的解决方案。
    【解决方案2】:

    这是你的旗帜! http://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_REORDER_TO_FRONT

    intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT)
    

    注意“addFlags”。另请注意,onCreate 将不会在此 Activity 上被调用,当一个新的 Intent 被传递给它时。它将通过onNewIntent() 发送。

    这并不能确保只有一个 Activity 实例正在运行。为确保这一点,请查看:http://developer.android.com/guide/topics/manifest/activity-element.html#lmode

    【讨论】:

      【解决方案3】:

      使用 android:launchMode="singleTask" 可能是最好的方法,因为如果 Activity 已经在运行,它就不会重新创建它。只需将其添加到您的 AndroidManifest.xml 中的活动中,您就应该一切就绪。

      <activity
          android:name=".MyActivity"
          android:label="@string/app_name"
          android:launchMode="singleTask"
          >
          <intent-filter>
              <action android:name="android.intent.action.MAIN" />
              <category android:name="android.intent.category.LAUNCHER" />
          </intent-filter>
       </activity>
      

      这是另一个可能有用的问题:Android singleTask or singleInstance launch mode?

      【讨论】:

        【解决方案4】:

        这对我有用。

        Intent intent = new Intent(this, MyActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
        startActivity(intent);
        

        如果这个Activity的实例已经存在,那么它将被移到前面。如果实例不存在,则会创建一个新实例。

        【讨论】:

          【解决方案5】:

          是的,您只能要求创建这些活动的一个实例,但通常不建议这样做。如果您只是关心历史,请查看Intent.FLAG_ACTIVITY_CLEAR_TOP

          【讨论】:

            【解决方案6】:

            将意图标志添加为

            Intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TOP); StartActivity(srcActivity.java, DesiredActivity.class);

            然后在onPause()DesiredActivity

            添加finish(), 这对我有用。

            【讨论】:

              【解决方案7】:

              在科特林中:

              fun AppCompatActivity.startSingleActivity(intent: Intent) {
                  startActivity(intent.apply {
                      flags = Intent.FLAG_ACTIVITY_REORDER_TO_FRONT
                  })
              }
              

              【讨论】:

                【解决方案8】:

                我希望只有一个 MainActivity 实例,但是当我添加时:

                launchMode="singleInstance"
                

                在我的清单中,我的所有应用活动之前都会出现一个白屏,因此我从清单中删除了单实例代码。 我将 MainActivity 的两个公共静态变量添加到 MainActivity 类:

                public static MainActivity mainActivity_instance = null;
                public static MainActivity mainActivity_OldInstance = null;
                

                然后我在 onCreate() 中添加了以下代码:

                 if(mainActivity_instance != null)//if true, it means there was an instance of mainActivity before and it had to be closed.
                        mainActivity_OldInstance = mainActivity_instance;
                    mainActivity_instance = this;
                 if(mainActivity_OldInstance != null)
                        mainActivity_OldInstance.finish();
                

                如你所见,我完成了 MainActivity 的前一个实例,就像创建新实例一样!

                【讨论】:

                  【解决方案9】:

                  https://developer.android.com/guide/topics/manifest/activity-element

                  android:launchMode = "singleTop"
                  

                  如果活动在堆栈顶部,则不会创建新的活动实例,否则将创建新的活动实例。这将保持一般用户群所期望的正常活动流程。

                  【讨论】:

                    【解决方案10】:
                    Intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_NO_HISTORY);
                    

                    它对我有用:)

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 2023-04-01
                      • 1970-01-01
                      • 2016-06-11
                      • 1970-01-01
                      • 1970-01-01
                      • 2018-05-22
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多