Androidグローバル変数


293

どのようにしてグローバル変数を作成すれば、実行中のアクティビティーに関係なく、アプリケーションのライフサイクルの前後で値を維持できます。


そして、なぜset and get(Jeff Gilfeltのasnwer)を使用する必要があるのですか?なぜ値を変数に直接設定するのですか?このように:public volatile static String x; 値を設定するには:GeneralClass.x = value;
Dr.jacky 2014年

回答:


531

基本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();

4
素晴らしいヘルプ、私は本当に適用します。
d-man

6
残念ながら私にはうまくいきません。この後、マニフェストに2つの<application>タグがあることを確認してください。正しい?一部の場所で、これを既存のアプリケーションタグに追加する必要があると言われるのを聞いたからです。助けてください !!
Adil Malik

9
@AdilMalik android:nameタグを既存のアプリケーションタグに追加する必要があります
Marijn

2
コンテキストにアクセスする必要なしに、パブリック静的フィールドを持つクラスを作成しないのはなぜですか?
Laserson、2014

51
メモリのクリーンアップが原因で、予期しない動作やNPEが発生する可能性があるため、これは正解ではありません。developerphil.com/dont-store-data-in-the-application-object
bakua

43

あなたは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

28
アクティビティが一時停止し、ユーザーが別のアプリケーションを開始し、そのメモリが少ない場合、ユーザーがアプリケーションを再開し、この静的参照がnullであることがわかったときに、androidがこの静的オブジェクトを削除したのはどうしてですか?
d-man

4
staticは、別々のプロセスのアクティビティ全体では役に立ちません。
ateiob 2012

3
インスタンスがガベージコレクションされている場合、これは機能しません。コードブロックif(null == mInstance){mInstance = new MyProperties(); }が機能し、新しいインスタンスが返され、プロパティがリセットされます
Lalith B

1
@ Mr.Hydeシングルトンは役に立たないわけではありません。シングルトンの内部に何を保持するかを知る必要があるだけです。巨大なビットマップ配列またはいくつかのコレクションを保持すると、危険になる可能性があります。シングルトンの内部に保持しているものをメモしておきます。
Lalith B 2014

1
私は少し遅れていることを知っていますが、将来の読者のために、SharedPreferences、SQLLite Database、または内部メモリファイルに値を格納できます。これらはすべて、アプリケーションが閉じている場合でもデータの永続性を持ちます。
powernit 2016

15

このグローバル変数は私のプロジェクトで機能します:

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;

2
しかし、それをどのように複数のアクティビティに渡すのですか?
Zapnologica 2013

15
これらの統計(少なくとも文字列と配列)は、アプリケーションが一時停止され、デバイスのメモリが不足している場合、Android VMによってnullにされる可能性があります。
アントン

4
@mahasam staticは正しい方法だとは思いません...唯一のアクティビティの場合は、アプリケーションコンテキストを介する必要があります。それ以外の場合は、上記の他の回答にあるようにシングルトンの方法です。staticはコードを強力に結合し、テスト容易性も低下させます
Punith Raj

14

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


リンクを更新しました。プロジェクトはGoogle Codeでホストされていたため、ご存知のとおり閉鎖されました。リンクはGithubからのものです。
r1k0

8

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

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

}

その後、いつでもカスタムアプリケーションオブジェクトからシングルトンを呼び出すことができます。

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

次に、アクティビティまたはフラグメントからcreateメソッドを呼び出すだけで、存在しない場合は新しいコントローラーが作成されます。それ以外の場合は、既存のコントローラーが返されます。

3.)最後に、Squareで作成された洗練されたフレームワークがあり、Android内に依存性注入を提供します。それはダガーと呼ばれています。ここではその使用方法については触れませんが、そのようなものが必要な場合は非常に洗練されています。

あなたが望んでいることをどのように行うことができるかに関して十分な詳細を提供したことを願っています。


6

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

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

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

あなたは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();

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


3
// 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;

1
同じ質問に2つの回答を投稿するのはなぜですか?1つに編集できます。
Kunu

2

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

インターフェイスを使用することをお勧めします(コンストラクターで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;

1

技術的にはこれは質問の答えにはなりませんが、グローバル変数の代わりにRoomデータベースを使用することをお勧めします。 https://developer.android.com/topic/libraries/architecture/room.html グローバル変数を格納する必要があるだけで、大したことではなく、何でもない場合でも、Roomデータベースを使用するのが最もエレガントです、ネイティブで十分にサポートされ、アクティビティのライフサイクルの周りで値を維持する方法。多くの問題、特にデータの整合性を防止するのに役立ちます。データベースとグローバル変数が異なることを理解していますが、コードのメンテナンス、アプリの安定性、データの整合性のためにRoomを使用してください。


1

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

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

0

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


1
ネイティブコードは、データをRAMに保持するための面倒な方法であり、Java static変数と同じです。
Jerry101 2014年

このアプローチの要点はわかりません。詳しく説明していただけますか。
miva2

-1
import android.app.Application;

public class Globals extends Application
{
    private static Globals instance = null;
    private static int RecentCompaignID;
    private static int EmailClick;
    private static String LoginPassword;
    static String loginMemberID;
    private static String CompaignName = "";
    private static int listget=0;
    //MailingDetails
    private static String FromEmailadd="";
    private static String FromName="";
    private static String ReplyEmailAdd="";
    private static String CompaignSubject="";
    private static int TempId=0;
    private static int ListIds=0;

    private static String HTMLContent="";
    @Override
    public void onCreate() 
    {
        super.onCreate();
        instance = this;
    }

    public static Globals getInstance()
    {
        return instance;
    }

    public void setRecentCompaignID(int objRecentCompaignID)
    {
        RecentCompaignID = objRecentCompaignID;
    }

    public int getRecentCompaignID() 
    {
        return RecentCompaignID;
    }

    public void setLoginMemberID(String objloginMemberID) 
    {
        loginMemberID = objloginMemberID;
    }

    public String getLoginMemberID() 
    {
        return loginMemberID;
    }

    public void setLoginMemberPassword(String objLoginPassword)
    {
        LoginPassword = objLoginPassword;
    }

    public String getLoginMemberPassword()
    {
        return LoginPassword;
    }

    public void setEmailclick(int id)
    {
        EmailClick = id;
    }

    public int getEmailClick() 
    {
        return EmailClick;
    }
    public void setCompaignName(String objCompaignName)
    {
        CompaignName=objCompaignName;
    }
    public String getCompaignName()
    {
        return CompaignName;
    }
    public void setlistgetvalue(int objlistget)
    {
        listget=objlistget;
    }
    public int getlistvalue()
    {
        return listget;
    }
    public void setCompaignSubject(String objCompaignSubject)
    {
         CompaignSubject=objCompaignSubject;
    }
    public String getCompaignSubject()
    {
        return CompaignSubject;
    }
    public void setHTMLContent(String objHTMLContent)
    {
        HTMLContent=objHTMLContent;
    }
    public String getHTMLContent()
    {
        return HTMLContent;
    }
    public void setListIds(int objListIds)
    {
        ListIds=objListIds;
    }
    public int getListIds()
    {
        return ListIds;
    }
    public void setReplyEmailAdd(String objReplyEmailAdd)
    {
        ReplyEmailAdd=objReplyEmailAdd;
    }
    public String getReplyEmailAdd()
    {
        return ReplyEmailAdd;
    }
    public void setFromName(String objFromName)
    {
        FromName=objFromName;
    }
    public String getFromName()
    {
        return FromName;
    }
    public void setFromEmailadd(String objFromEmailadd)
    {
        FromEmailadd=objFromEmailadd;
    }
    public String getFromEmailadd()
    {
        return FromEmailadd;
    }
}

-5

簡単!!!!

アクセスしたい変数をグローバル変数として、静的変数として宣言できます。そして今、あなたはこれらを使用してこれらの変数にアクセスできます

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

}

MyProperites.someValueIWantToKeep;

それでおしまい!;)


それがなぜそんなに反対票を投じられたのかわからない。他のネットで支持されたいくつかの回答と比較すると、これsynchronizedは静的(iirc)で正しく使用されているのgetInstance()に対し、他では使用されていないことがわかります。それに応じて賛成票を投じた。
user2297550
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.