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中保存数据是一种痛苦的方式,并且