【问题标题】:Android - Preventing duplicate window on Intent & StartActivityAndroid - 防止 Intent 和 StartActivity 上的重复窗口
【发布时间】:2017-01-31 23:11:36
【问题描述】:

我正在尝试解决我的 android 应用程序的问题。

问题是,当我通过调用 Intent 和 StartActivity 启动新实例或类时,会打开一个重复的窗口或视图。

我想保留相同的活动或视图,但在不影响视图的情况下执行/运行新类。目的只是执行扩展类,但我不希望它重新创建或打开重复视图。

我尝试过使用 android:Launchmode="singleTop" 但没有效果。

我使用了标准的 android 抽屉式导航示例 xml 和类。您将看到 content_main.xml 包含一个视图切换器,其中包括 2 个其他 xml 文件,它们不需要加载新实例或活动......如果这有意义的话。

我不确定问题是否出在 BeaconTracking.java 上,它再次调用 super.onCreate(...) 事件可能导致父视图重新打开??

任何想法我哪里出错了?

提前致谢!

AndroidManifest.xml

<activity
    android:name=".MainActivity"
    android:label="@string/app_name"
    android:launchMode="singleTop"
    android:screenOrientation="portrait"
    android:theme="@style/AppTheme.NoActionBar">
</activity>
<activity
    android:name=".BeaconTracking"
    android:label="@string/app_name"
    android:launchMode="singleTop"
    android:screenOrientation="portrait"
    android:theme="@style/AppTheme">
</activity>

MainActivity.java

public class MainActivity extends AppCompatActivity implements ...

public ViewSwitcher switcher;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

...

}


@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {
    int id = item.getItemId();
    if (id == R.id.nav_vehicle_tracking) {

    Intent intent = new Intent(getApplicationContext(), BeaconTracking.class).setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
    startActivity(intent);

        }
    } else if (id == R.id.nav_vehicle_info) {
            //SWITCH TO BEACON SCREEN
            switcher.setDisplayedChild(2);
}

    //CLOSE NAVIGATION DRAWER WHEN BUTTON IS PRESSED
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    drawer.closeDrawer(GravityCompat.START);
    return true;
}

BeaconTracking.java

public class BeaconTracking extends MainActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    switcher.setDisplayedChild(1);

}

content_main.xml

<?xml version="1.0" encoding="utf-8"?>
<ViewSwitcher
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/content_frame"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">

<include
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    layout="@layout/content_beacons" />

<include
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    layout="@layout/content_map" />
</ViewSwitcher>

【问题讨论】:

标签: android android-intent android-activity launchmode


【解决方案1】:

android:Launchmode="singleTop" 在这里没有帮助,你为什么要打开另一个活动,你可以在当前活动中使用视图切换器管理它,但你仍然想打开另一个没有重复窗口的活动。在这种情况下,您可以制作打开活动的透明 ui。

<activity  android:name = "BeaconTracking" 
      android:label = "@string/app_name" 
      android:theme = "@android:style/Theme.NoDisplay" >

或主题@android:style/Theme.Translucent.NoTitleBar"

并将父类替换为BeaconTracking的AppCompatActivity。但 BeaconTracking 活动仍将添加到后台堆栈中。

【讨论】:

    【解决方案2】:

    每个Activity 都有自己的观点。如果您不想打开新视图,则不应开始新的Activity。只需将BeaconActivity 的功能移至MainActivity

    【讨论】:

      【解决方案3】:

      尝试在 Manifest 中使用 android:launchMode="singleInstance"。

      【讨论】:

      • 一般来说这是一个糟糕的主意。特殊的启动模式singleInstancesingleTask 通常会产生比它们解决的问题更多的问题,您需要确切地知道自己在做什么才能正确使用它们。在这种情况下,使用它们不会改变任何东西。
      • 如果我们能正确处理activity的状态,研究singleInstance、singleTask的启动方式,那么实现就不成问题了。
      • 不,抱歉。这是错误的。这不是正确的解决方案。这是一种通常不起作用的解决方法。我已经纠正了数百名错误地使用这些启动模式的人。请参阅我关于启动模式的任何帖子。根据经验,我可以说使用这些启动模式带来的问题多于解决的问题。但祝你好运!
      猜你喜欢
      • 1970-01-01
      • 2018-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多