অ্যান্ড্রয়েড গ্লোবাল ভেরিয়েবল


293

আমি কীভাবে বিশ্বব্যাপী ভেরিয়েবল তৈরি করতে পারি অ্যাপ্লিকেশনটির জীবনচক্রের চারপাশের মানগুলি বজায় রাখতে পারি না নির্বিশেষে কোন কার্যকলাপ চলমান।


এবং কেন আমাদের সেট ব্যবহার করা উচিত (জেফ গিলফেল্টের অ্যাঞ্জার) ?! কেন আমরা কেবল ভেরিয়েবলের জন্য সরাসরি মান সেট করি? এর মতো: পাবলিক অস্থির স্ট্যাটিক স্ট্রিং এক্স; এবং মান সেট করতে: জেনারেল ক্লাস.এক্স = মান;
ডাঃ জ্যাকি

উত্তর:


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

আপনার অ্যান্ড্রয়েড ম্যানিফেস্টে আপনাকে অবশ্যই অ্যান্ড্রয়েড.এপ প্রয়োগের ক্লাসটি প্রয়োগ করতে হবে 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();

4
দুর্দান্ত সাহায্য, আমি সত্যিই আবেদন।
ডি-ম্যান

6
দুর্ভাগ্যক্রমে এটি আমার পক্ষে কাজ করছে না। দয়া করে নিশ্চিত করুন যে এর পরে আমাদের দুটি ম্যানিফেস্টে <অ্যাপ্লিকেশন> ট্যাগ থাকবে। রাইট? কারণ কিছু জায়গায় আমি লোকদের বলতে শুনেছি যে আমাদের এটি বিদ্যমান অ্যাপ্লিকেশন ট্যাগে যুক্ত করতে হবে। সাহায্য করুন !!
আদিল মালিক

9
@ অ্যাডিলমালিক আপনাকে বিদ্যমান অ্যাপ্লিকেশন ট্যাগটিতে অ্যান্ড্রয়েড: নাম ট্যাগ যুক্ত করতে হবে
মারিজন

2
কোনও প্রসঙ্গে অ্যাক্সেস করার কোনও প্রয়োজন ছাড়াই কেন পাবলিক স্ট্যাটিক ফিল্ড সহ কেবল একটি শ্রেণি তৈরি করা হচ্ছে না?
লেজারসন

50
এটি সঠিক উত্তর হওয়া উচিত নয় কারণ এটি মেমরি ক্লিনআপের কারণে অনাকাঙ্কিত আচরণ এবং এনপিই-তে নেতৃত্ব দিতে পারে। ডেভেলপারফিল.
com

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
যদি কার্যকলাপ বন্ধ হয়ে যায় এবং ব্যবহারকারী অন্য অ্যাপ্লিকেশন শুরু করে এবং সেই স্মৃতিশক্তি কম চলাকালীন ব্যবহারকারী যখন পুনরায় অ্যাপ্লিকেশনটি পুনরায় চালু করেন এবং এই স্থিতিক রেফারেন্সটি বাতিল হয়ে যায় তখন অ্যান্ড্রয়েড কেন এই স্থির অবজেক্টটি সরিয়ে দেয় ???
d-man

4
একটি স্ট্যাটিক পৃথক প্রক্রিয়াগুলির ক্রিয়াকলাপগুলিতে অকেজো।
ateiob

3
আপনার দৃষ্টান্ত আবর্জনা সংগ্রহ করা হলে এই কাজ করবে না। সুতরাং কোডের ব্লক যদি (নাল == mInstance) {mInstance = নতুন MyProperties (); work কাজ করবে এবং নতুন উদাহরণ ফিরে আসবে, যা সম্পত্তি পুনরায় সেট করবে
ললিথ বি

1
@ মিঃ হাইডে সিঙ্গেলটন একেবারেই অকেজো নয় যে আমাদের সিঙ্গেলনের ভিতরে কী রাখতে হবে তা জানতে হবে, যদি আমরা বিশাল বিটম্যাপ অ্যারে বা কিছু সংগ্রহ রাখি তবে এটি বিপজ্জনক হয়ে উঠতে পারে। সিঙ্গেলনের ভিতরে আপনি কী রেখেছেন তা নোট করুন।
লালিথ বি

1
আমি জানি যে আমি কিছুটা দেরি করেছি তবে ভবিষ্যতের পাঠকদের জন্য আমরা শেয়ারডপ্রিফেরেন্স, এসকিউএলাইট ডেটাবেস বা একটি অভ্যন্তরীণ মেমরি ফাইলগুলিতে মান সংরক্ষণ করতে পারি। অ্যাপ্লিকেশনটি বন্ধ থাকলেও এই সবগুলিতে ডেটা অধ্যবসায় থাকবে।
পাওয়ারনিট

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
তবে আপনি কীভাবে এটি একাধিক ক্রিয়াকলাপে পাস করবেন?
জাপানোলজিকা

15
অ্যাপ্লিকেশনটি সাসপেন্ড করা এবং ডিভাইসটির স্মৃতিশক্তি কম থাকলে এই স্ট্যাটিকগুলি (কমপক্ষে স্ট্রিং এবং অ্যারে) অ্যান্ড্রয়েড ভিএম দ্বারা কমে যেতে পারে।
আন্তন

4
@ মহাসম আমি স্থির হ'ল সঠিক উপায় হওয়া উচিত বলে মনে করি না ... যদি এর একমাত্র ক্রিয়াকলাপ হয় তবে এটি অ্যাপ্লিকেশন প্রসঙ্গে হওয়া উচিত। উপরের অন্যান্য উত্তরের হিসাবে যেমন একটি একক উপায়। স্থিতিশীল কোডটি জোড় করে জোড় করে, এবং
পরীক্ষার ক্ষমতাও

14

আপনি অ্যাপ্লিকেশন পছন্দ পছন্দ করতে পারেন। আপনি প্রাসঙ্গিক বস্তুটিতে যতক্ষণ পাস করেন ততক্ষণ এগুলি যে কোনও ক্রিয়াকলাপ বা কোডের টুকরো থেকে অ্যাক্সেসযোগ্য এবং এগুলি যে অ্যাপ্লিকেশনগুলিতে ব্যবহার করা হয় সেগুলিতে তারা ব্যক্তিগত, ডিভাইস। তবুও, আপনি মানগুলি সংরক্ষণ করতে হ্যাশিং বা এনক্রিপশন স্কিমগুলি ব্যবহার করতে পারেন। এছাড়াও, এই পছন্দগুলি পরবর্তী কোনও অ্যাপ্লিকেশন থেকে চালিত হয়। এখানে কয়েকটি কোড উদাহরণ রয়েছে যা আপনি দেখতে পারেন।


আমি লিঙ্কটি আপডেট করেছি। গুগল কোডে প্রকল্পটি হোস্ট করা হয়েছিল এবং আমরা জানি যে এটি বন্ধ ছিল। লিঙ্কটি গিথুব থেকে।
r1k0

8

আপনি যা চাইছেন তা অর্জন করার জন্য কয়েকটি আলাদা উপায় রয়েছে।

১) অ্যাপ্লিকেশন শ্রেণি প্রসারিত করুন এবং আপনার নিয়ামক এবং মডেল অবজেক্টগুলিকে সেখানে ইনস্ট্যান্ট করুন।

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

২) আপনি নিজের কন্ট্রোলারকে নিজেই একটি সিঙ্গলটন উদাহরণ তৈরি করতে পারেন:

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

তারপরে আপনি যে কোনও ক্রিয়াকলাপ বা টুকরোগুলি থেকে কেবল তৈরি পদ্ধতিটিকে কল করতে পারেন এবং যদি এটি ইতিমধ্যে বিদ্যমান না থাকে তবে এটি একটি নতুন নিয়ামক তৈরি করবে, অন্যথায় এটি পূর্বনির্ধারিত নিয়ামককে ফিরিয়ে দেবে।

৩) অবশেষে, স্কয়ারে একটি চটজলদি কাঠামো তৈরি করা হয়েছে যা আপনাকে অ্যান্ড্রয়েডের মধ্যে নির্ভরতা ইনজেকশন সরবরাহ করে। একে ড্যাগার বলা হয় । আমি এখানে এটি কীভাবে ব্যবহার করব সেটিতে যাব না, তবে যদি আপনার এই ধরণের জিনিস প্রয়োজন হয় তবে এটি খুব চালাক।

আমি আশা করি যে আপনি যা আশা করছেন তা আপনি কীভাবে করতে পারেন সে সম্পর্কে আমি যথেষ্ট বিশদ জানিয়েছি gave


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
কেন আপনি একই প্রশ্নে দুটি উত্তর পোস্ট করছেন? আপনি এটিকে সম্পাদনা করতে পারেন can
কুনু

2

আমি অনুরূপ উত্তরের জন্য চেক করেছি, তবে এখানে প্রদত্তরা আমার প্রয়োজনের সাথে খাপ খায় না। আমি এমন কিছু খুঁজে পেয়েছি যা আমার দৃষ্টিকোণ থেকে আপনি যা খুঁজছেন তা। শুধুমাত্র সম্ভাব্য ব্ল্যাক পয়েন্ট হ'ল একটি সুরক্ষা বিষয় (বা নাও হতে পারে) যেহেতু আমি সুরক্ষা সম্পর্কে জানি না।

আমি ইন্টারফেস (কনস্ট্রাক্টর সহ ক্লাস ব্যবহার করার প্রয়োজন নেই এবং তাই ...) ব্যবহার করার পরামর্শ দিচ্ছি, যেহেতু আপনাকে কেবল এমন কিছু তৈরি করতে হবে:

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

প্রযুক্তিগতভাবে এটি প্রশ্নের উত্তর দেয় না, তবে আমি কোনও বিশ্বব্যাপী ভেরিয়েবলের পরিবর্তে রুম ডাটাবেস ব্যবহার করার পরামর্শ দেব। https://developer.android.com/topic/libraries/architecture/room.html এমনকি যদি আপনি একটি বৈশ্বিক পরিবর্তনশীল সঞ্চয় করতে কেবল 'কেবল' হন এবং এটি কোনও বড় বিষয় এবং কী নয়, তবে রুম ডাটাবেস ব্যবহার করা সবচেয়ে মার্জিত , ক্রিয়াকলাপের জীবনচক্রের চারপাশে মূল্যবোধ রাখার দেশীয় এবং ভাল সমর্থিত উপায়। এটি অনেকগুলি সমস্যা, বিশেষত ডেটার অখণ্ডতা রোধ করতে সহায়তা করবে। আমি বুঝতে পারি যে ডাটাবেস এবং গ্লোবাল ভেরিয়েবল আলাদা তবে দয়া করে কোড রক্ষণাবেক্ষণ, অ্যাপের স্থিতিশীলতা এবং ডেটা অখণ্ডতার জন্য রুমটি ব্যবহার করুন।


1

গ্লোবাল ভেরিয়েবলগুলি সঞ্চয় এবং পুনরুদ্ধার করতে ভাগ করে নেওয়া পছন্দগুলি ব্যবহার করুন।

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

0

যদি সম্ভব হয় তবে আপনার যে পরিবর্তনশীলগুলি বাঁচিয়ে রাখতে হবে তা আপনার ঘোষিত করা উচিত যা আবর্জনা সংগ্রাহক দ্বারা পরিষ্কার করা হয়নি বা ফাইলের মধ্যে ওএস দ্বারা আনলোড করা হয়েছে। সুতরাং এটি করার জন্য আপনাকে অবশ্যই সি / সি ++ দ্বারা কোডিং করতে হবে এবং .so লিব ফাইলটি সংকলন করতে হবে এবং এটি আপনার মেইনএ্যাকটিভিটিতে লোড করুন।


1
নেটিভ কোডটি র‍্যামে ডেটা ধরে রাখার একটি বেদনাদায়ক উপায়, এবং এটি জাভা staticভেরিয়েবলগুলির চেয়ে ভাল না ।
জেরি 101

আমি এই পদ্ধতির বিন্দু দেখতে পাচ্ছি না। এই ক্ষেত্রে একটি ভাল ধারণা আপনি কি বর্ণনা করতে পারেন?
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()অন্যেরা না করে। upvated সেই অনুযায়ী।
ব্যবহারকারী 2297550
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.