有没有办法让每个活动只有一个实例?

Cod*_*ody 36 android android-manifest android-activity

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

例如:

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

现在,当用户按下时,它必须经过两次"对象子细节"(相同的对象,当它被编辑时返回到详细页面),"父对象细节"也会发生同样的事情.

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

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

ud_*_*_an 43

在Manifest Activity属性中,您可以提供此参数 android:launchMode="singleInstance"

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

  • **如果不了解`launchMode ="singleInstance"`的所有含义,请不要使用它.这确实_not_实际上_re-order_活动**,因为它强制活动完全在一个单独的任务中(即,它将显示为与最近的应用程序列表中的应用程序分开).因此,如果您对应用中的每个活动执行此操作,您会在"最近的应用"列表中看到每个活动都是单独的条目.至少那是文档所说的.[现实情况略有不同](https://inthecheesefactory.com/blog/understand-android-activity-launchmode/en). (17认同)

Vik*_*rla 27

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

intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT)
Run Code Online (Sandbox Code Playgroud)

注意'addFlags'.另请注意,onCreate在向其传递新Intent时,不会调用此Activity.它将通过onNewIntent().

这不能确保活动的单个实例正在运行.为了确保这一点,请查看:http://developer.android.com/guide/topics/manifest/activity-element.html#lmode


Bal*_*alu 25

使用android:launchMode ="singleTask"可能是最好的方法,因为如果活动已经在运行,它将不会重新创建活动.只需将其添加到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>
Run Code Online (Sandbox Code Playgroud)

这是另一个可能有用的问题:Android singleTask或singleInstance启动模式?


Ani*_*ban 8

这对我有用.

Intent intent = new Intent(this, MyActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)

如果此Activity的实例已存在,则它将移至前面.如果实例不存在,则将创建新实例.


kab*_*uko 7

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