Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/184.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android全局变量_Android_Global Variables - Fatal编程技术网

Android全局变量

Android全局变量,android,global-variables,Android,Global Variables,如何创建全局变量并在应用程序的生命周期内保持值不变,而不考虑运行的是哪个活动。您可以使用如下单例模式: package com.ramps; public class MyProperties { private static MyProperties mInstance= null; public int someValueIWantToKeep; protected MyProperties(){} public static synchronized MyProperties ge

如何创建全局变量并在应用程序的生命周期内保持值不变,而不考虑运行的是哪个活动。

您可以使用如下
单例模式:

package com.ramps;

public class MyProperties {
private static MyProperties mInstance= null;

public int someValueIWantToKeep;

protected MyProperties(){}

public static synchronized MyProperties getInstance() {
        if(null == mInstance){
            mInstance = new MyProperties();
        }
        return mInstance;
    }
}
public class GlobalClass extends Application{

    private String name;
    private String email;

    public String getName() {
        return name;
    }

    public void setName(String aName) {
        name = aName;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String aEmail) {
        email = aEmail;
    }
}
final GlobalClass globalVariable = (GlobalClass) getApplicationContext();
globalVariable.setName("Android Example context variable");
final GlobalClass globalVariable = (GlobalClass) getApplicationContext();
final String name  = globalVariable.getName();
在应用程序中,您可以通过以下方式访问您的singleton:

MyProperties.getInstance().someValueIWantToKeep

您可以扩展基本的
android.app.Application
类,并添加如下成员变量:

public class MyApplication extends Application {

    private String someVariable;

    public String getSomeVariable() {
        return someVariable;
    }

    public void setSomeVariable(String someVariable) {
        this.someVariable = someVariable;
    }
}
在android清单中,必须声明实现android.app.Application的类(将
android:name=“.MyApplication”
属性添加到现有的应用程序标记中):


您可以使用应用程序首选项。只要您传递上下文对象,就可以从任何活动或代码段访问它们,并且它们对于使用它们的应用程序是私有的,因此您不必担心公开特定于应用程序的值,除非您处理路由设备。即使如此,您也可以使用哈希或加密方案来保存这些值。此外,这些首选项从应用程序运行到下一个应用程序运行都会存储。 这是一些代码示例,您可以查看。

简单

那些您想作为全局变量访问的变量,您可以将它们声明为静态变量。现在,您可以使用

classname.variablename

public class MyProperties {
private static MyProperties mInstance= null;

static int someValueIWantToKeep;

protected MyProperties(){}

public static synchronized MyProperties getInstance(){
    if(null == mInstance){
        mInstance = new MyProperties();
    }
    return mInstance;
}
}

我想保留我的财产


就这样!;)

此全局变量适用于我的项目:

public class Global {
    public static int ivar1, ivar2;
    public static String svar1, svar2;
    public static int[] myarray1 = new int[10];
}


//  How to use other or many activity
Global.ivar1 = 10;

int i = Global.ivar1;

如果可能的话,您应该在文件中声明您需要保持活动状态的变量,这些变量还没有被垃圾收集器清除或被OS卸载
要做到这一点,您必须使用C/C++编写代码并编译成.so lib文件,然后将其加载到MainActivity中。

有几种不同的方法可以实现您的要求

1.)扩展应用程序类并在其中实例化控制器和模型对象。

public class FavoriteColorsApplication extends Application {

    private static FavoriteColorsApplication application;
    private FavoriteColorsService service;

    public FavoriteColorsApplication getInstance() {
        return application;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        application = this;
        application.initialize();
    }

    private void initialize() {
        service = new FavoriteColorsService();
    }

    public FavoriteColorsService getService() {
        return service;
    }

}
然后,您可以随时从自定义应用程序对象调用您的singleton:

public class FavoriteColorsActivity extends Activity {

private FavoriteColorsService service = null;
private ArrayAdapter<String> adapter;
private List<String> favoriteColors = new ArrayList<String>();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_favorite_colors);

    service = ((FavoriteColorsApplication) getApplication()).getService();
    favoriteColors = service.findAllColors();

    ListView lv = (ListView) findViewById(R.id.favoriteColorsListView);
    adapter = new ArrayAdapter<String>(this, R.layout.favorite_colors_list_item,
            favoriteColors);
    lv.setAdapter(adapter);
}
然后,您可以从任何活动或片段调用create方法,它将创建一个新的控制器(如果还不存在),否则它将返回先前存在的控制器

3.)最后,在Square创建了一个灵活的框架,可以在Android中提供依赖注入。它被称为。我不会在这里讨论如何使用它,但如果您需要这种东西,它会非常灵活。

public class FavoriteColorsApplication extends Application {

    private static FavoriteColorsApplication application;
    private FavoriteColorsService service;

    public FavoriteColorsApplication getInstance() {
        return application;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        application = this;
        application.initialize();
    }

    private void initialize() {
        service = new FavoriteColorsService();
    }

    public FavoriteColorsService getService() {
        return service;
    }

}

我希望我提供了足够的详细信息,说明如何实现您的期望。

您可以创建一个
全局类,如下所示:

package com.ramps;

public class MyProperties {
private static MyProperties mInstance= null;

public int someValueIWantToKeep;

protected MyProperties(){}

public static synchronized MyProperties getInstance() {
        if(null == mInstance){
            mInstance = new MyProperties();
        }
        return mInstance;
    }
}
public class GlobalClass extends Application{

    private String name;
    private String email;

    public String getName() {
        return name;
    }

    public void setName(String aName) {
        name = aName;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String aEmail) {
        email = aEmail;
    }
}
final GlobalClass globalVariable = (GlobalClass) getApplicationContext();
globalVariable.setName("Android Example context variable");
final GlobalClass globalVariable = (GlobalClass) getApplicationContext();
final String name  = globalVariable.getName();
然后在清单中定义它:

<application
    android:name="com.example.globalvariable.GlobalClass" ....
您可以像这样获得这些值:

package com.ramps;

public class MyProperties {
private static MyProperties mInstance= null;

public int someValueIWantToKeep;

protected MyProperties(){}

public static synchronized MyProperties getInstance() {
        if(null == mInstance){
            mInstance = new MyProperties();
        }
        return mInstance;
    }
}
public class GlobalClass extends Application{

    private String name;
    private String email;

    public String getName() {
        return name;
    }

    public void setName(String aName) {
        name = aName;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String aEmail) {
        email = aEmail;
    }
}
final GlobalClass globalVariable = (GlobalClass) getApplicationContext();
globalVariable.setName("Android Example context variable");
final GlobalClass globalVariable = (GlobalClass) getApplicationContext();
final String name  = globalVariable.getName();
请从这个博客中找到完整的例子

试着这样做:

创建共享数据类:

SharedData.java

import android.app.Application;

/**
 * Created by kundan on 6/23/2015.
 */
public class Globals {


    private static Globals instance = new Globals();

    // Getter-Setters
    public static Globals getInstance() {
        return instance;
    }

    public static void setInstance(Globals instance) {
        Globals.instance = instance;
    }

    private String notification_index;


    private Globals() {

    }


    public String getValue() {
        return notification_index;
    }


    public void setValue(String notification_index) {
        this.notification_index = notification_index;
    }



}
声明/初始化要设置/获取数据的类中的类的全局实例(在
onCreate()方法之前使用此代码):-

设置数据:

sharedData.setValue("kundan");
获取数据:

String n = sharedData.getValue();

我检查了类似的答案,但这里给出的不符合我的需要。 在我看来,我找到了你想要的东西。唯一可能的黑点是安全问题(或者可能不是),因为我不知道安全问题

我建议使用接口(无需将类与构造函数一起使用等等…),因为您只需创建如下内容:

public interface ActivityClass {

    public static final String MYSTRING_1 = "STRING";

    public static final int MYINT_1 = 1;

}
然后,您可以使用以下命令访问类中的任何位置:

int myInt = ActivityClass.MYINT_1;
String myString = ActivityClass.MYSTRING_1;

从技术上讲,这并不能回答这个问题,但我建议使用Room数据库,而不是任何全局变量。 即使您“只”需要存储一个全局变量,这也没什么大不了的,但是使用Room数据库是在活动的生命周期中保存值的最优雅、最自然、最受支持的方法。 它将有助于防止许多问题,尤其是数据的完整性。
我知道数据库和全局变量是不同的,但为了代码维护、应用程序稳定性和数据完整性,请使用Room

使用SharedReferences存储和检索全局变量

SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
String userid = preferences.getString("userid", null);

如果活动暂停,用户启动了另一个应用程序,并且在此期间内存不足,这就是为什么android在用户恢复应用程序时删除了此静态对象,并发现此静态引用为空???静态对象在不同进程中的活动中无效。如果您的实例被垃圾收集,则此操作无效。因此,如果(null==MinInstance){MinInstance=new MyProperties();}代码块将工作,并返回新实例,这将重置properties@Mr.HydeSingleton不是无用的,只是我们需要知道在Singleton中保存什么,如果我们保存巨大的位图数组或一些集合,那么它可能会变得危险。请注意您在Singleton中保存的内容。我知道我有点晚了,但对于未来的读者,我们可以将值存储在SharedReferences、SQLLite数据库或内部内存文件中。即使应用程序关闭,这些都将具有数据持久性。真棒的帮助,我真的应用了。不幸的是,它对我不起作用。请确认在此之后,我们将在清单中有两个标签。对吗?因为在某些地方,我听到人们说我们必须将其添加到现有的应用程序标记中。请帮忙@AdilMalik您必须将android:name标记添加到现有的应用程序标记中,为什么不创建一个带有公共静态字段的类,而不需要访问上下文?这不应该是正确的答案,因为它可能会导致不可预测的行为,并由于内存清理而导致NPE。但如何将其传递给多个活动?当应用程序挂起且设备内存不足时,这些静态(至少是字符串和数组)可能会被android VM清除。@mahasam我认为静态不应该是正确的方式。。。如果它只是活动,则应该通过应用程序上下文。否则,将采用上述其他答案中给出的单一方式。静态将强烈耦合代码,并降低可测试性本机代码在RAM中保存数据是一种痛苦的方式,并且