Java 当方向改变时,如何禁用onCreate操作?

Java 当方向改变时,如何禁用onCreate操作?,java,android,Java,Android,当我从纵向旋转设备时,如何禁用onCreate事件?因为当应用程序启动时,它将从互联网上获取大量数据,而每次用户打开设备时下载这些数据是不好的 在manifest.xml中为活动添加android:configChanges=“orientation”。在manifest write的活动标记中 android:configChanges=“方向|屏幕大小” 例如: <activity android:name=".MainActivity" android:con

当我从纵向旋转设备时,如何禁用onCreate事件?因为当应用程序启动时,它将从互联网上获取大量数据,而每次用户打开设备时下载这些数据是不好的

在manifest.xml中为活动添加android:configChanges=“orientation”。

在manifest write的活动标记中

android:configChanges=“方向|屏幕大小”

例如:

<activity android:name=".MainActivity"
            android:configChanges="orientation|screenSize">

在onCreate中使用标志检查。在初始化/声明时使标志为真 在您的清单文件中添加android:configChanges=“orientation”

在ur java文件中,重写onConfigurationChanged方法,并将标志设为false

执行此操作后,将调用ur onCreate,但不会调用if中提到的代码。 将ur代码移到if条件内

试着用这个

static boolean flag = true;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    if(flag)
        Log.d("ONCREATE", "flag is true");
}    
@Override
public void onConfigurationChanged(Configuration newConfig) {
    // TODO Auto-generated method stub
    Log.d("ONCONFIGCHANGE", "CALLED" );
    flag = false;
    super.onConfigurationChanged(newConfig);
}

另一种方法是使用
onSaveInstanceState
方法将任何非持久性数据保存到捆绑包中。状态应在
onRestoreInstanceState
onCreate
中还原。在
onCreate
中,您必须分析
savedInstanceState
参数,如果该参数不为空,则应恢复以前保存的状态。

此解决方案是目前为止最有效的解决方案。 在清单文件中添加

<activity
        android:configChanges="keyboardHidden|orientation|screenSize"
        android:name="your activity name"
        android:label="@string/app_name" 
        android:screenOrientation="landscape">
      </activity
对于C#Xamarin,我有以下解决方案:

using System.Collections.Concurrent;


public static class ObjectExchanger
{
    private static ConcurrentDictionary<string, object> ObjectList = new ConcurrentDictionary<string, object>();

    /// <summary>
    /// Add key and object. Do not add the same key twice.
    /// </summary>
    /// <param name="key"></param>
    /// <param name="obj"></param>
    public static void Add(string key, object obj)
    {
        ObjectList.GetOrAdd(key, obj);
    }

    /// <summary>
    /// Get object via key. Do net Get twice. Key/object will remove after get it once.
    /// </summary>
    /// <param name="key"></param>
    public static object Get(string key)
    {
        object obj = null;

        ObjectList.TryRemove(key, out obj);

        return obj;
    }
}
使用System.Collections.Concurrent;
公共静态类对象交换器
{
私有静态ConcurrentDictionary对象列表=新ConcurrentDictionary();
/// 
///添加键和对象。不要添加同一个键两次。
/// 
/// 
/// 
公共静态无效添加(字符串键,对象对象对象)
{
ObjectList.GetOrAdd(key,obj);
}
/// 
///通过键获取对象。执行两次net Get。键/对象在获取一次后将被删除。
/// 
/// 
公共静态对象Get(字符串键)
{
objectobj=null;
TryRemove(key,out obj);
返回obj;
}
}

您可以使用OnCreate方法备份和恢复旋转后活动的数据。

注意:从Android 3.2(API级别13)开始,当设备在纵向和横向之间切换时,“屏幕大小”也会改变。因此,如果要防止在为API级别13或更高版本(如minSdkVersion和targetSdkVersion属性所声明)开发时由于方向更改而导致运行时重新启动,则必须在“方向”值之外包含“屏幕大小”值。也就是说,您必须是android:configChanges=“orientation | screenSize”。()Rubix:方向和屏幕大小值在这里意味着什么。这个问题只是出于好奇。
using System.Collections.Concurrent;


public static class ObjectExchanger
{
    private static ConcurrentDictionary<string, object> ObjectList = new ConcurrentDictionary<string, object>();

    /// <summary>
    /// Add key and object. Do not add the same key twice.
    /// </summary>
    /// <param name="key"></param>
    /// <param name="obj"></param>
    public static void Add(string key, object obj)
    {
        ObjectList.GetOrAdd(key, obj);
    }

    /// <summary>
    /// Get object via key. Do net Get twice. Key/object will remove after get it once.
    /// </summary>
    /// <param name="key"></param>
    public static object Get(string key)
    {
        object obj = null;

        ObjectList.TryRemove(key, out obj);

        return obj;
    }
}