programing

안드로이드 전역 변수

telebox 2023. 10. 29. 19:12
반응형

안드로이드 전역 변수

실행 중인 작업에 관계없이 응용프로그램의 수명 주기 주변에 남아 있는 값을 글로벌 변수로 만들려면 어떻게 해야 합니까?

베이스를 확장할 수 있습니다.android.app.Applicationclass 및 add 멤버 변수는 다음과 같습니다.

public class MyApplication extends Application {

    private String someVariable;

    public String getSomeVariable() {
        return someVariable;
    }

    public void setSomeVariable(String someVariable) {
        this.someVariable = someVariable;
    }
}

안드로이드 매니페스트에서 안드로이드.app을 구현하는 클래스를 선언해야 합니다.응용프로그램(추가)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();

당신은 a를 사용할 수 있습니다.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

이 글로벌 변수는 제 프로젝트에 적합합니다.

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;

응용프로그램 환경설정을 사용할 수 있습니다.컨텍스트 개체를 전달하는 한 모든 활동이나 코드 조각에서 액세스할 수 있으며, 해당 코드는 해당 개체를 사용하는 응용 프로그램에 비공개이므로 라우팅된 장치를 다루지 않는 한 응용 프로그램별 값이 노출될 우려가 없습니다.그래도 해싱이나 암호화 스킴을 사용하여 값을 저장할 수 있습니다.또한 이러한 기본 설정은 실행 중인 응용프로그램에서 다음 프로그램으로 저장됩니다.다음은 당신이 볼 수 있는 몇 가지 코드 예시입니다.

공유 환경설정을 사용하여 전역 변수를 저장하고 검색합니다.

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

원하는 것을 달성할 수 있는 몇 가지 방법이 있습니다.

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 개체에서 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);
}

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 method를 호출하면 새로운 컨트롤러가 생성되고 그렇지 않으면 기존 컨트롤러가 반환됩니다.

3.) 마지막으로, Square에서 만든 매끄러운 프레임워크가 있어 Android 내에서 의존성 주입을 제공합니다.그것은 단검이라고 불립니다.여기서 어떻게 사용하는지는 안 들어가겠지만, 그런 게 필요하시면 굉장히 능글맞습니다.

당신이 희망하는 것을 어떻게 할 수 있는지에 대해 제가 충분히 설명해 주었으면 합니다.

다음과 같이 시도:

공유 데이터 클래스 만들기:

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()method):-

Globals sharedData = Globals.getInstance();

데이터 설정:

sharedData.setValue("kundan");

데이터 가져오기:

String n = sharedData.getValue();

제가 비슷한 답변을 확인했는데, 여기 주어진 답변은 제 요구에 맞지 않습니다.제 관점에서 당신이 찾는 것이 뭔가 발견했습니다.제가 보안에 대해 모르기 때문에 가능한 유일한 블랙 포인트는 보안 문제일 수도 있습니다.

다음과 같은 것만 생성하면 되므로 인터페이스를 사용할 것을 제안합니다(Class with constructor 등을 사용할 필요가 없음).

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

를 생성할 수 있습니다.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();

이 블로그 글로벌 변수에서 완전한 예를 찾으십시오.

엄밀히 말하면 질문에 답하지 않지만 전역 변수 대신 룸 데이터베이스를 사용하는 것이 좋습니다.https://developer.android.com/topic/libraries/architecture/room.html 글로벌 변수를 저장하기 위해 '단순히' 필요한 경우라도, 이는 별 문제가 아닙니다. 하지만 Room 데이터베이스를 사용하는 것이 활동의 라이프사이클을 중심으로 가치를 유지하는 가장 우아하고 기본적이며 잘 지원되는 방법입니다.많은 문제, 특히 데이터의 무결성을 방지하는 데 도움이 될 것입니다.데이터베이스와 글로벌 변수가 다른 것은 이해하지만 코드 유지, 앱 안정성, 데이터 무결성을 위해 Room을 사용해주시기 바랍니다.

가능하면 Garbage Collector나 Unload by OS에서 지워지지 않은 변수를 파일로 선언해야 합니다.그러려면 C/C++로 코딩하고 .sollib 파일로 컴파일하여 MainActivity에 로드해야 합니다.

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

진정해요!!

전역 변수로 액세스하려는 변수를 정적 변수로 선언할 수 있습니다.그리고 이제, 당신은 다음을 이용하여 그 변수들에 접근할 수 있습니다.

클래스 이름.변수 이름;

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

}

내 속성.값을 좀보관하고 싶습니다.

그거에요! ;)

언급URL : https://stackoverflow.com/questions/1944656/android-global-variable

반응형