2012-01-24 50 views
24

我发现在我的应用程序中,用户可以在用户使用应用程序时打开的各种活动中相当“嵌套”。有没有什么办法可以让每个活动有一个且只有一个实例?

例如:

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

,当用户按压背部,它要经过“子对象详细信息”两次(同一个对象,当编辑它返回到详细页),同样的事情发生为“父对象详细信息”。

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

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

回答

30

你可以给这个参数android:launchMode="singleInstance"

阅读在这里详细http://developer.android.com/guide/topics/manifest/activity-element.html

+6

**如果不理解'launchMode =“singleInstance”'的所有含义,请不要使用它。这实际上并不_re-order_活动**,因为它强制活动完全处于单独的任务中(即,它将显示为与最近的应用程序列表中的应用程序分开)。因此,如果您针对应用中的每项活动执行此操作,则会在“最近使用的应用”列表中将它们看作单独的条目。至少这就是文档所说的。 [现实有点不同](https://inthecheesefactory.com/blog/understand-android-activity-launchmode/en)。 –

+0

我的建议是使用'Intent.FLAG_ACTIVITY_REORDER_TO_FRONT'来代替(如Vikram的回答中所述),尽管这不是一个完美的解决方案。 –

17

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

intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT) 

注意 'addFlags'。另请注意,在将新Intent传递给此Activity时,onCreate将不会被调用。它将通过onNewIntent()交付。

这并不能确保有一个活动运行的单个实例。在清单活动财产http://developer.android.com/guide/topics/manifest/activity-element.html#lmode

0

加入意向标志为

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

:要确保,检查了这一点

然后在onPause() DesiredActivity

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

14

使用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> 

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

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

它为我:)

1

这为我工作。

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

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

相关问题