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

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

例如:

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

现在,当用户按下时,它必须两次(同一个对象,当它被编辑时返回到详细页面)通过“对象子细节”,并且“父对象细节”发生同样的事情。

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

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

Solutions Collecting From Web of "有没有办法让每个活动有一个且只有一个实例?"

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

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

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

 intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT) 

注意'addFlags'。 另外请注意,当一个新的Intent被传递给它时, onCreate将不会被调用。 它将通过onNewIntent()传递。

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

使用android:launchMode =“singleTask”可能是最好的方法,因为如果它已经在运行,它不会重新创build活动。 只需将它添加到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或singleInstance启动模式?

是的,您只能要求创build这些活动的一个实例,但通常不推荐。 如果您只关注历史logging,请查看Intent.FLAG_ACTIVITY_CLEAR_TOP 。

添加意图标志为

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

然后在onPause() DesiredActivity

添加finish() ,这为我做了工作。

 Intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_NO_HISTORY); 

这个对我有用 :)

这对我有效。

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

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