web-dev-qa-db-ja.com

Androidグローバル変数

どのアクティビティを実行しているかにかかわらず、グローバル変数を作成してアプリケーションのライフサイクルの前後で値を維持するにはどうすればよいですか。

270
d-man

基本の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"属性を追加します)。

<application 
  Android:name=".MyApplication" 
  Android:icon="@drawable/icon" 
  Android:label="@string/app_name">

それからあなたの活動の中であなたはそのように変数を取得して設定することができます:

// set
((MyApplication) this.getApplication()).setSomeVariable("foo");

// get
String s = ((MyApplication) this.getApplication()).getSomeVariable();
499
Jeff Gilfelt

このようなSingleton Patternを使うことができます:

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;
    }
}

アプリケーションでは、次のようにしてシングルトンにアクセスできます。

MyProperties.getInstance().someValueIWantToKeep
39
Ramps

このグローバル変数は私のプロジェクトのために働きます:

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;
13
mahasam

あなたはアプリケーション設定を使うことができます。 Contextオブジェクトを渡す限り、それらは任意のアクティビティまたはコードからアクセス可能であり、それらを使用するアプリケーションに対してプライベートなので、ルーティングを処理しない限り、アプリケーション固有の値を公開することについて心配する必要はありません。デバイスそれでも、値を保存するためにハッシュまたは暗号化スキームを使用できます。また、これらの設定は、アプリケーションの実行ごとに保存されます。 ここで はあなたが見ることができるいくつかのコード例です。

13
r1k0

あなたが求めていることを達成することができるいくつかの異なる方法があります。

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;
    }

}

そうすれば、いつでもカスタムApplicationオブジェクトからシングルトンを呼び出すことができます。

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);
}

2)コントローラにそれ自身のシングルトンインスタンスを作成させることができます。

public class Controller {
    private static final String TAG = "Controller";
    private static sController sController;
    private Dao mDao;

    private Controller() {
        mDao = new Dao();    
    }

    public static Controller create() {
        if (sController == null) {
            sController = new Controller();
        }
        return sController;
    }
}

その後、任意のActivityまたはFragmentからcreateメソッドを呼び出すだけで、新しいコントローラが存在しない場合は新しいコントローラが作成され、存在しない場合は既存のコントローラが返されます。

3。)最後に、Squareで作成された滑らかなフレームワークがあり、これによってAndroidに依存性注入が提供されます。それは 短剣 と呼ばれます。ここではその使い方を説明しませんが、そのようなことが必要な場合は非常に滑らかです

私はあなたがあなたが望んでいることをどうすることができるかに関して十分な詳細を与えたことを願っています。

7
Dan Mikita

このようにGlobal Classを作成することができます:

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;
    }
}

それをマニフェストで定義します。

<application
    Android:name="com.example.globalvariable.GlobalClass" ....

これで、次のようにグローバル変数に値を設定できます。

final GlobalClass globalVariable = (GlobalClass) getApplicationContext();
globalVariable.setName("Android Example context variable");

あなたはこのような値を得ることができます:

final GlobalClass globalVariable = (GlobalClass) getApplicationContext();
final String name  = globalVariable.getName();

このブログから完全な例を見つけてください グローバル変数

4
san88

このようにしてみてください。

共有データクラスを作成します。

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()メソッドの前にこのコードを使用)。

Globals sharedData = Globals.getInstance();

データを設定します。

sharedData.setValue("kundan");

データを取得する:

String n = sharedData.getValue();
4
kumar kundan

私は同様の答えをチェックしました、しかしここに与えられたものは私のニーズに合いません。私の見地からすると、私はあなたが探しているものを見つけることができます。私はセキュリティについて知らないので、唯一の可能性のあるブラックポイントはセキュリティの問題です(あるいはそうではないかもしれません)。

以下のようなものを作成するだけでよいので、Interfaceを使用することをお勧めします(コンストラクタなどでClassを使用する必要はありません...)。

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;
2
Alexandre
// My Class Global Variables  Save File Global.Java
public class Global {
    public static int myVi; 
    public static String myVs;
}

// How to used on many Activity

Global.myVi = 12;
Global.myVs = "my number";
........
........
........
int i;
int s;
i = Global.myVi;
s = Global.myVs + " is " + Global.myVi;
2
mahasam

SharedPreferencesを使用して、グローバル変数を保存および取得します。

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

技術的には、これでは問題は解決されませんが、グローバル変数の代わりにRoomデータベースを使用することをお勧めします。 https://developer.Android.com/topic/libraries/architecture/room.html グローバル変数を「保存する」だけが必要な場合でも大したことではありませんが、Roomデータベースを使用するのが、活動のライフサイクルの前後で価値を維持するための最も洗練されたネイティブでよくサポートされた方法です。それは多くの問題、特にデータの完全性を防ぐのに役立ちます。データベースとグローバル変数は違いますが、コードのメンテナンス、アプリの安定性、データの完全性のためにRoomを使ってください。

1
hexicle

可能であれば、ファイル.soで、ガベージコレクタまたはOSによるアンロードによって明らかにされていない、生き続ける必要がある変数を宣言する必要があります。それを行うには、C/C++でコーディングし、.so libファイルにコンパイルしてMainActivityにロードしてください。

0
Tran Huu Phuoc