Глобальная переменная или переменная контекста приложения - Android

// Как работют глобальные переменные на уровне приложения   ( Оригинал статьи... )

Объявив переменную в контексте приложения вы можете использовать её в качестве глобальной переменной. Вы можете задавать ей значение и получать из неё значение в любом месте приложения ( activity / broadcast recieiver / service ) из контекста приложения.

Используя этот способ, становится проще следовать шаблону SINGLETON и шаблону MVC в android.

Здесь показано решение проблемаы, заключающейся в том, как сохранить значение (переменной) проходя через несколько Activity и во всех других частях вашего приложения. Кончно Вы можете добиться этого, создав статическую переменную, но это приведёт к утечке памяти. Путь в Android - связать вашу переменную с контекстом приложения.

Каждое приложение имеет контекст, и Android гарантирует, что Application context будет существовать как экземпляр в любом месте вашего приложения.

Чтобы сделать это - надо создать класс, порождённый от android.app.Application и указать свой класс в теге Application в вашем файле AndroidManifest.xml. Android создаст экземпляр этого класса и сделает его доступным для всего контекста приложения. Вы можете получить объект своего класса в любом месте приложения (activity / broadcast reciever / service) используя метод Context.getApplicationContext().

Как работют глобальные переменные на уровне приложения

Файл : src/GlobalClass.java

package com.androidexample.globalvariable;

import android.app.Application;

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

}

Файл : AndroidManifest.xml

Определим GlobalClass.java в application теге, внимание на строку в теге application android:name=".GlobalClass" После этого экземпляр класса GlobalClass.java будет доступен в любом месте приложения ( activity / broadcast reciever / service ) в виде контекста приложения.
	<?xml version="1.0" encoding="utf-8" ?>

	<manifest xmlns:android="http://schemas.android.com/apk/res/android"
	package=".....your package ...."
	android:versionCode="1"
	android:versionName="1.0">
 
		<uses-sdk android:minSdkVersion="8"
					android:targetSdkVersion="9" />


 
		<application android:name=".GlobalClass"
						android:allowBackup="true"
						android:icon="@drawable/ic_launcher"
						android:label="@string/app_name"
						android:theme="@style/AppTheme">
		<activity android:name=".FirstScreen"
					android:label="@string/app_name">
		<intent-filter>
		<action android:name="android.intent.action.MAIN" />

		<category android:name="android.intent.category.LAUNCHER" />

	</intent-filter>
             
	</activity>
         
			<activity android:name=".SecondScreen"></activity>  
			<activity android:name=".ThirdScreen"></activity>
		</application>
 
	</manifest>
				
			

Файл : src/FirstScreen.java

Метод getApplicationContext() возвращает экземпляр класса GlobalClass.java. Далле присваиваются значения полям name/email в экземпляре GlobalClass.java класса.
				
package .... your packagename .....;
 
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.app.Activity;
import android.content.Intent;
 
public class FirstScreen extends Activity {
 
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.firstscreen);
         
		final Button secondBtn = (Button) findViewById(R.id.second);
         
		// Calling Application class (see application tag in AndroidManifest.xml)
		final GlobalClass globalVariable = (GlobalClass) getApplicationContext(); 
         
		//Set name and email in global/application context
		globalVariable.setName("Android Example context variable");
		globalVariable.setEmail("xxxxxx@aaaa.com"); 
         
         
		secondBtn.setOnClickListener(new OnClickListener() {
			public void onClick(View v) {
                 
				Intent i = new Intent(getBaseContext(), SecondScreen.class);
				startActivity(i);
			}
		}); 
	}   
}
			

Файл : src/SecondScreen.java

Метод getApplicationContext() возвращает Context в виде экземпляра GlobalClass.java класса, через который вы можете получать/задавать значения полям name/email этого экземпляра GlobalClass.java.
package com.androidexample.globalvariable;
 
	import android.app.Activity;
	import android.content.Intent;
	import android.os.Bundle;
	import android.view.View;
	import android.view.View.OnClickListener;
	import android.widget.Button;
	import android.widget.TextView;
 
	public class SecondScreen extends Activity {
     
		@Override
		public void onCreate(Bundle savedInstanceState) {
			super.onCreate(savedInstanceState);
			setContentView(R.layout.secondscreen); 
     
			TextView showGlobal     = (TextView) findViewById(R.id.showGlobal);
			final Button thirdBtn = (Button) findViewById(R.id.third);
         
			// Calling Application class (see application tag in AndroidManifest.xml)
			final GlobalClass globalVariable = (GlobalClass) getApplicationContext(); 
         
			// Get name and email from global/application context
			final String name  = globalVariable.getName();
			final String email = globalVariable.getEmail(); 
         
			String showString = "Name : "+name+", Email : "+email;
         
			// Show name/email values in TextView
			showGlobal.setText(showString);
         
			thirdBtn.setOnClickListener(new OnClickListener() {
				public void onClick(View v) {
                 
					Intent i = new Intent(getBaseContext(), ThirdScreen.class);
					startActivity(i);
				}
			});
         
		} 
     
		@Override
		protected void onDestroy() {
         
			super.onDestroy();
         
		}
	}
			

File : src/ThirdScreen.java

Метод getApplicationContext() возвращает Context в виде экземпляра GlobalClass.java класса, через который вы можете получать/задавать значения полям name/email этого экземпляра GlobalClass.java.
package com.androidexample.globalvariable;
 
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
 
public class ThirdScreen extends Activity {
     
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.thirdscreen); 
     
		TextView showGlobal = (TextView) findViewById(R.id.showGlobal);
         
		// Calling Application class (see application tag in AndroidManifest.xml)
		final GlobalClass globalVariable = (GlobalClass) getApplicationContext(); 
         
		// Get name and email from global/application context
		final String name  = globalVariable.getName();
		final String email = globalVariable.getEmail(); 
         
		String showString = "Name : "+name+ ", Email : "+email;
         
		// Show name/email values in TextView
		showGlobal.setText(showString);
         
	} 
}