如何避免同一个Activity的多个实例?

时间:2012-05-16 08:20:02

标签: android android-activity


在我的PoC中,我有一些活动,HomeActivityCreateActivitySearchActivityResultsActivityResultDetailsActivityUpdateActivity

我有两条主要的导航路径:创建搜索

创建路径的导航如下:HomeActivity - > CreateActivity - (完成后) - > HomeActivity

搜索的导航如下:HomeActivity - > SearchActivity - > ResultsActivityListActivity) - > ResultDetailsActivity - > UpdateActivity - (完成后) - > ResultDetailsActivity(已更新数据)。

目前,通过Activity方法导航到新的startActivity(intent)。但是,这会导致每个Activity的多个实例被打开。

我对Android很新。有人可以建议我如何避免这种情况吗?

6 个答案:

答案 0 :(得分:29)

设置以下标志可以帮助您解决问题:

  • Intent.FLAG_ACTIVITY_CLEAR_TOP
  • Intent.FLAG_ACTIVITY_REORDER_TO_FRONT

答案 1 :(得分:24)

在您的Android清单中,将<activity>

添加到android:launchMode="singleTask"标记中

有关完整列表,请查看documentation of activity

在你的清单中:

    <activity android:name=".YourActivity"
              android:launchMode="singleTask"
              android:label="@string/app_name" />

注意:不要使用单身。

答案 2 :(得分:7)

Intent时使用startActivity标志:

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

旗帜有很多种。

这会有所帮助: android singleton activity

答案 3 :(得分:3)

管理活动的最佳形式是使用

startActivityForRestult(Intent,ID)

使用此方法调用活动,您的HomeActivity可以管理覆盖方法中其他活动的结果

    @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // TODO Auto-generated method stub
    super.onActivityResult(requestCode, resultCode, data);
}

您可以为差异活动发送已知结果并进行管理。例如:
(Allways with startActivityForResult)

HomeActivity - &gt; SearchActivity - &gt; ResultsActivity(ListActivity) - &gt; ResultDetailsActivity - &gt; UpdateActivity - (完成时) - &gt; ResultDetailsActivity(带有更新的数据)。按Return键并发送SEARCH_FINISHED - &gt; UpdateActivity捕获此信息并在onActivityResult方法中发送相同的结果并完成() - &gt;与searchActivity相同 - &gt;家

这也可以帮到你:

Intent.FLAG_ACTIVITY_CLEAR_TOP
Intent.FLAG_ACTIVITY_REORDER_TO_FRONT

http://blog.akquinet.de/2010/04/15/android-activites-and-tasks-series-intent-flags/

答案 4 :(得分:1)

JoonSung Kim发布的答案很少添加,更改addFlag方法会抛出“无法解决错误”

更改:intent.addFlag(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);

至:intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);

代码应该是:

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

要防止同一个Activity的多个实例更改标志

来自:intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);

至:intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

代码应该是:

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

答案 5 :(得分:0)

我的问题是setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 在Activity的onCreate(...)方法中。