Android'de 'Bağlam' nedir?


Yanıtlar:


1507

Basitçe söylemek gerekirse:

Adından da anlaşılacağı gibi, uygulamanın / nesnenin geçerli durumunun bağlamı budur. Yeni oluşturulan nesnelerin neler olup bittiğini anlamasını sağlar. Genellikle programınızın başka bir bölümü (etkinlik ve paket / uygulama) hakkında bilgi almak için bunu çağırırsınız.

Sen çağırarak bağlamı alabilirsiniz getApplicationContext(), getContext(), getBaseContext()veya this(zaman uzanan bir sınıfta Context, bu tür uygulama, Aktivite, Servis ve IntentService sınıfları gibi).

Bağlamın tipik kullanımları:

  • Yeni nesneler oluşturma: Yeni görünümler, bağdaştırıcılar, dinleyiciler oluşturma:

    TextView tv = new TextView(getContext());
    ListAdapter adapter = new SimpleCursorAdapter(getApplicationContext(), ...);
  • Standart ortak kaynaklara erişme : LAYOUT_INFLATER_SERVICE, Paylaşılan Tercihler gibi hizmetler:

    context.getSystemService(LAYOUT_INFLATER_SERVICE)
    getApplicationContext().getSharedPreferences(*name*, *mode*);
  • Bileşenlere dolaylı olarak erişme : İçerik sağlayıcılar, yayınlar, niyet hakkında

    getApplicationContext().getContentResolver().query(uri, ...);

51
Örneğinizde context.getSystemService(LAYOUT_INFLATER_SERVICE), nerede ve nasıl contexttanımlanır?
Dennis

8
Dinamik olarak bir metin görünümü oluştururken neden içeriğe ihtiyacımız olduğu açıklanmaktadır. Ancak dinamik olarak metin görünümleri dizileri oluştururken herhangi bir bağlamdan bahsetmek zorunda değiliz. Neden böyle ? TextView [] textview = yeni TextView [10];
Abhinav Arora

38
@AbhinavArora diziyi tanımlarken, aslında herhangi bir metin görünümünün örneğini oluşturmuyorsunuz (temelde sadece girmeleri için alan oluşturuyorsunuz). Bu diziye herhangi bir değer koymak için geldiğiniz noktada, önceden oluşturulmuş TextView'lere veya bunları oluşturmanıza izin vermek için bir İçeriğe ihtiyacınız olacaktır.
15'te mc1arke

24
Görünümler neden bağlam gerektirir? Örneğin, TextView bağlamı olmasaydı ne yapamazdı?
dinozor

15
"Bağlam" içermeyen bir kod parçası, JVM olan her işletim sisteminde çalışabilir. Ancak Android'de çalışması gereken bir içerik varsa. Android'e özgü şeyleri kullanmak istiyorsanız (cihaz konumuna erişmek, fotoğraf çekmek, arka plan hizmeti çalıştırmak vb.) Bir içeriğe ihtiyacınız var. http isteği. Bağlam Java ve Android arasında bir köprü olarak kabul edilebilir.
Faruk Toptaş

508

Bağlamın Tanımı

  • Bağlam ortam verilerini temsil eder
  • Veritabanları gibi şeylere erişim sağlar

Daha basit terimler (örnek 1)

  • Person-X'i bir başlangıç ​​yazılımı şirketinin CEO'su olarak düşünün.

  • Şirkette bir lider mimar var, bu lider mimar şirketteki veritabanı, UI vb.Gibi tüm işleri yapıyor.

  • Şimdi CEO yeni bir geliştirici tutuyor.

  • Yeni işe alınan kişinin sorumluluğunu yeni kişinin becerilerine dayanarak Veritabanında mı yoksa kullanıcı arayüzünde mi çalışacağını söyleyen Mimar'dır.

Daha basit terimler (örnek 2)

  • Android etkinliğinin uygulamanın kaynağına erişimi gibi.

  • Bir oteli ziyaret ettiğinizde, uygun zamanlamalarda kahvaltı, öğle ve akşam yemeği istersiniz, değil mi?

  • Kaldığınız süre boyunca hoşunuza giden başka birçok şey var. Bunları nasıl elde edersiniz?

  • Oda servisi görevlisinden bunları sizin için getirmesini istersiniz.

  • Burada oda servisi kişi tek aktivite ve otel app olmak düşünüyor bağlamdır, nihayet kahvaltı, öğle ve akşam yemeği kaynakları olmak zorunda.


Bağlam içeren şeyler:

  1. Bir kaynak yükleniyor.
  2. Yeni bir etkinlik başlatmak.
  3. Görünümler oluşturma.
  4. sistem hizmeti almak.

Bağlam Etkinlik , Hizmet , Uygulama vb. İçin temel sınıftır

Bunu tanımlamanın başka bir yolu: Bağlamı televizyondaki bir TV'nin ve kanalın uzakları olarak düşünün, kaynaklar, hizmetler, niyetleri kullanma vb. - - - Burada uzaktan, tüm farklı kaynaklara ön plana erişmek için erişim görevi görür.

  • Yani, Remote kaynakları, hizmetleri, niyetlerini kullanarak vb gibi kanallara erişebilir ....

  • Aynı şekilde ... Uzaktan kumandaya kimin doğal erişimi varsa, kaynaklar, hizmetler, niyetleri kullanma vb.


Bağlam alabileceğiniz farklı yöntemler

  • getApplicationContext()
  • getContext()
  • getBaseContext()
  • veya this(aktivite sınıfındayken)

Misal:

TextView tv = new TextView(this);

Anahtar kelime thismevcut etkinliğin bağlamını ifade eder.


3
Tamam, böylece Faaliyetten türetilen sınıf bir bağlamın kendisidir. Bu yüzden bunu yeni oluşturulan görüşlere geçirerek bağlamı geçiyoruz.
bacak

7
Bağlamın birçok farklı yerden erişilebilir olması iyi bir tasarım kararı olup olmadığını merak ediyorum. Uygulamada bir statik getContext () bence yeterli olurdu.
Trilarion

@Trilarion ... Size bağlamını nasıl kullanmak istediğinize bağlıdır getApplicationContext(), getContext(), getBaseContext()..... bu başvurun -> ( stackoverflow.com/a/10641257 )
Devrath

Bir metin görünümü oluşturarak son parçayı genişletmek için: Bazı durumlarda aramak gerekebilir SomeActivityName.this. Bir örnek için bir thisiş parçacığında, etkinliği değil iş parçacığını ifade eder
Zoe

1
Bağlam nesnesi bir apk veya Android işletim sistemi için benzersiz mi? Bir uygulamanın iki farklı bağlamı olabilir mi?
valijon

367

Kaynak


Android'de Context konusu pek çok kişi için kafa karıştırıcı görünüyor. İnsanlar Android'de temel şeyleri yapmak için Bağlamın oldukça sık ihtiyaç duyulduğunu biliyorlar. İnsanlar bazen paniğe kapılır çünkü Bağlam gerektiren bir işlem yapmaya çalışırlar ve doğru Bağlamı “nasıl alacaklarını” bilmezler. Android'de Context fikrini açıklamaya çalışacağım. Sorunun tam bir tedavisi bu yazının kapsamı dışındadır, ancak genel bir genel bakış sunmaya çalışacağım, böylece Bağlamın ne olduğu ve nasıl kullanılacağı hakkında bir fikir sahibi olursunuz. Bağlamın ne olduğunu anlamak için kaynak koduna bir göz atalım:

https://github.com/android/platform_frameworks_base/blob/master/core/java/android/content/Context.java

Bağlam tam olarak nedir?

Belgelerin kendisi oldukça basit bir açıklama sağlar: Context sınıfı bir “Uygulama ortamı hakkında küresel bilgilere arayüz” dür.

Context sınıfının kendisi, uygulaması Android işletim sistemi tarafından sağlanan soyut sınıf olarak bildirilir. Dokümantasyon ayrıca, “… uygulamaya özgü kaynaklara ve sınıflara erişimin yanı sıra başlatma etkinlikleri, yayın ve alma hedefleri, vb. Gibi uygulama düzeyinde işlemler için çağrılara izin veriyor”.

Artık adın neden Bağlam olduğunu çok iyi anlayabilirsiniz. Çünkü sadece bu. Bağlam, bir Etkinlik, Hizmet veya başka bir bileşen için bağlantıyı veya kancayı sağlar, böylece sisteme bağlanır ve genel uygulama ortamına erişim sağlar. Başka bir deyişle: Bağlam, “genel olarak uygulama ile ilgili olarak neredeyim ve uygulamanın geri kalanına nasıl erişebilirim / iletişim kurabilirim?” Bileşeninin sorusuna yanıt verir. Tüm bunlar biraz kafa karıştırıcı görünüyorsa, Context sınıfının maruz kaldığı yöntemlere hızlı bir bakış, gerçek doğası hakkında bazı ipuçları verir.

İşte bu yöntemlerden rastgele bir örnekleme:

  1. getAssets()
  2. getResources()
  3. getPackageManager()
  4. getString()
  5. getSharedPrefsFile()

Tüm bu yöntemlerin ortak noktası nedir? Hepsi, Bağlam'a erişimi olanların uygulama genelindeki kaynaklara erişebilmesini sağlar.

Bağlam, diğer bir deyişle, ona, başvuru ortamının geri kalanına referans veren bileşeni bağlar. Örneğin, bir Etkinlik, Hizmet veya bu kaynaklara nasıl erişileceğini bilenler şartıyla, varlıklar (projenizdeki '/ asset' klasörünü düşünün) uygulama genelinde kullanılabilir. Aynı şey, sizi kaynağa bağlayacak getResources()gibi şeyler yapmanıza izin verir (boş zaman, aapt'ın java kodu ile kaynaklara erişime izin verdiğini, ayrı bir sorun).getResources().getColor()colors.xml

Görüşünüzü yani Contextsistem kaynaklarına erişimi sağlayan ve neyi “büyük app" sınıfının alt de. Atalım içine bileşenleri kanca nedir Context, soyut uygulanmasını sağlamak sınıfları Contextsınıfının. En belirgin sınıftır Activitysınıfı. ActivityDevralır dan ContextThemeWrapperhangi devralır ContextWrapper, gelen hangi devralır Context. bu sınıflar daha derinlemesine şeyleri anlamak için bakmak yararlıdır, ama şimdilik bunu bilmek yeterlidir var kendisi ContextThemeWrapperveContextWrapper hemen hemen onlar gibi ses şeylerdir. bunlar soyut unsurlarını uygulamak Contextbir bağlamı (asıl bağlam) "sararak" ve bu işlevleri bu bağlam için devrederek kendini sınıflandırabilirsiniz.ContextWrappersınıf, özet bir yöntem getAssetsile ilgili Contextaşağıdaki gibi sınıf uygulanır:

@Override
    public AssetManager getAssets() {
        return mBase.getAssets();
    }

mBaseyalnızca kurucu tarafından belirli bir bağlama ayarlanmış bir alandır. Böylece bir bağlam tamamlanır ve ContextWrappergetAssets yönteminin uygulanmasını bu bağlamda yetkilendirir. Tüm Activitybunların Contextnasıl çalıştığını görmek için nihayetinde miras alan sınıfı incelemeye geri dönelim .

Muhtemelen bir Faaliyetin ne olduğunu biliyorsunuz, ama gözden geçirmek - bu temelde 'kullanıcının yapabileceği tek bir şey. Kullanıcının etkileşimde bulunduğu kullanıcı arayüzünü yerleştirmek için bir pencere sağlamaya özen gösterir. Diğer API'lara aşina olan geliştiriciler ve hatta geliştiriciler bile bunu bir “ekran” olarak düşünebilirler. Bu teknik olarak yanlış, ama bizim amaçlarımız için önemli değil. Peki nasıl Activityve Contextetkileşim içinde ve miras ilişkilerinde tam olarak neler oluyor?

Yine, belirli örneklere bakmak faydalıdır. Aktiviteleri nasıl başlatacağımızı hepimiz biliyoruz. Etkinliği başlattığınız “bağlama” sahip olmanız şartıyla, basitçe arayın startActivity(intent); burada Amaç, bir Etkinliği başlattığınız bağlamı ve başlatmak istediğiniz Etkinliği tanımlar. Bu tanıdık startActivity(this, SomeOtherActivity.class).

Peki nedir this? thisEtkinliğinizdir çünkü Activitysınıf devralınır Context. Tam kepçe şuna benzer: Aradığınızda startActivity, sonuçta Activitysınıf şöyle bir şey yürütür:

Instrumentation.ActivityResult ar =
                mInstrumentation.execStartActivity(
                    this, mMainThread.getApplicationThread(), mToken, this,
                    intent, requestCode);

Yani kullanır execStartActivitydan Instrumentation(aslında bir iç sınıftan sınıfa Instrumentationdenir ActivityResult).

Bu noktada, sistem içlerine bir göz atmaya başlıyoruz.

İşletim sistemi aslında her şeyi işliyor. Öyleyse Enstrümantasyon Etkinliği tam olarak nasıl başlatır? Eh, param thisiçinde execStartActivityyöntemde yukarıda yani Bağlam Etkinlik ve execStartActivitymarkaları bu bağlamda kullanımı.

30.000 genel bakış şöyledir: Enstrümantasyon sınıfı, işini yapmak için izlediği Faaliyetler listesini takip eder. Bu liste, tüm faaliyetleri koordine etmek ve etkinlik akışını yönetmede her şeyin sorunsuz bir şekilde çalışmasını sağlamak için kullanılır.

İş parçacığı ve işlem sorunlarını koordine eden tam olarak bakmadığım bazı işlemler var. Sonuçta, ActivityResultyerel bir işlem ActivityManagerNative.getDefault().startActivity()kullanır - bu Context, aradığınızda geçirdiğiniz işlemi kullanır startActivity. Aktardığınız bağlam, gerekirse "niyet çözümüne" yardımcı olmak için kullanılır. Niyet çözünürlüğü, eğer sistem tedarik edilmezse amacın hedefini belirleyebilen süreçtir. (Daha fazla bilgi için buradaki kılavuza göz atın).

Ve Android'in bunu yapabilmesi için, tarafından sağlanan bilgilere erişmesi gerekiyor Context. Özellikle, sistemin ContentResolver"niyetin verilerinin MIME türünü belirleyebilmesi" için erişmesi gerekir startActivity. sadece bir uygulama için gerekli olan işlemlerin çoğunu gerçekleştirmek için uygulama çapındaki kaynaklara nasıl erişilmesi gerektiğini göstermekti. Contextbu kaynaklara erişim sağlayan şey budur. Özel Görünüm'ü genişleterek RelativeLayoutveya başka bir Viewsınıfla,Contextbir tartışma olarak. Özel Görünümünüzü somutlaştırdığınızda içeriğe geçersiniz. Neden? Çünkü Görünüm'ün temalara, kaynaklara ve diğer Görünüm yapılandırma ayrıntılarına erişebilmesi gerekir. Görünüm yapılandırması aslında harika bir örnektir. Her Bağlam, ContextOS'nin kendisi tarafından ekranın boyutu veya yoğunluğu gibi şeyler için ayarlanan çeşitli parametrelere ( uygulamalarındaki alanlar ) sahiptir. Bu bilgilerin Görünüm vb. Ayarlarını yapmak için neden önemli olduğunu kolayca görebilirsiniz.

Son bir kelime: Bazı nedenlerden dolayı Android'de yeni olan insanlar (ve hatta çok yeni olmayan insanlar bile), Android söz konusu olduğunda nesne yönelimli programlamayı tamamen unutuyor gibi görünüyor. Nedense, insanlar Android geliştirmelerini önceden tasarlanmış paradigmalara veya öğrenilmiş davranışlara yönelmeye çalışırlar.

Android'in kendi paradigması ve önceden tasarlanmış fikirlerinizi bırakıp sadece belgeleri ve geliştirici kılavuzunu okuyorsanız oldukça tutarlı olan belirli bir deseni vardır. Ancak benim asıl meselem, “doğru bağlamı elde etmek” bazen zor olsa da, insanlar haksız yere paniğe kapılıyorlar, çünkü bağlama ihtiyaç duydukları ve buna sahip olmadıklarını düşündükleri bir durumla karşılaşıyorlar. Java bir kez daha miras tasarımına sahip nesne yönelimli bir dildir.

Etkinliğinizin içinde yalnızca bağlamınız vardır, çünkü etkinliğinizin kendisi Bağlamdan miras alır. Bunun hiçbir sihri yoktur (işletim sisteminin çeşitli parametreleri ayarlamak ve bağlamınızı doğru bir şekilde "yapılandırmak" için tek başına yaptığı her şey hariç). Bu nedenle, bellek / performans sorunlarını bir kenara bırakmak (örneğin, ihtiyacınız olmadığında içeriğe referansları tutmak veya bellekte olumsuz sonuçları olan bir şekilde yapmak vb.), Bağlam diğerleri gibi bir nesnedir ve etrafından geçilebilir herhangi bir POJO (Plain Old Java Object) gibi. Bazen bu bağlamı almak için akıllıca şeyler yapmanız gerekebilir, ancak Object'in kendisinden başka bir şey içermeyen normal bir Java sınıfı, bağlama erişimi olan bir şekilde yazılabilir; bir bağlamı alan herkese açık bir yöntemi ortaya çıkarın ve daha sonra bu sınıfta gerektiği gibi kullanın.


33
Bu mükemmel bir cevap. Sadece herkesin sezgisel olarak bildiklerini söyleyen kabul edilenden çok daha iyi.
Honza Kalfus

5
Aradığınız uzun cevap budur! iyi açıkladı
Nick Jian

4
Mükemmel ans! Ciddi anlamda !
zeekhuge

3
Hmmm, bana göre, eski zamanlayıcıların küresel değişkenleri çağırmak için kullandığımız gibi görünüyor, nesne yönelimi sahneye girdiğinde çok kaşlarını çattı 8-)
Ulf Edholm

Yani getApplicationContext'ten aldığım Bağlam Aktivitede getContext ile aynı mı?
JPM


89

Contextbir uygulama ortamıyla ilgili global bilgilere bir "arayüz" dür. Pratikte, Contextaslında soyut bir sınıftır Android sistemi tarafından sağlanan .

Uygulamaya özgü kaynaklara ve sınıflara erişimin yanı sıra başlatma etkinlikleri, yayınlama ve alma amaçları gibi uygulama düzeyinde işlemler için çağrılara izin verir.

Aşağıdaki resimde, Contextbu hiyerarşinin kök sınıfı olan bir sınıflar hiyerarşisi görebilirsiniz. Özellikle, bunun Activitybir torunu olduğunu vurgulamakta fayda var Context.

Etkinlik şeması


bu fotoğraf nasıl oluşturuldu?
d0ye

70

Nedir Contexttam olarak?

Android başvuru belgelerine göre, çeşitli ortam verilerini temsil eden bir varlıktır. Yerel dosyalara, veritabanlarına, çevreyle ilişkili sınıf yükleyicilere, hizmetlere (sistem düzeyi hizmetler dahil) ve daha fazlasına erişim sağlar. Bu kitap boyunca ve Android ile günlük kodlamanızda, Bağlamın sık sık geçtiğini göreceksiniz.

" Uygulamada Android " kitabından, s. 60.

Bazı Android API'ları Contextas parametresi gerektirir

Çeşitli Android API'larına bakarsanız, çoğunun bir android.content.Contextnesneyi parametre olarak aldığını fark edeceksiniz . Ayrıca bir Faaliyetin veya Hizmetin genellikle a olarak kullanıldığını da görürsünüz Context. Bu çalışır çünkü bu sınıfların her ikisi de uzanır Context.


52

contextAndroid'de anlamak için basit bir örnek :

Her patron, daha az önemli ve zaman alıcı görevleri yerine getirmek için bir asistana sahiptir. Bir dosya veya bir fincan kahve gerekiyorsa, bir yardımcı çalışıyor. Bazı patronlar ofiste neler olup bittiğini çok az biliyorlar, bu yüzden asistanlarına da bununla ilgili sorular soruyorlar. Bazı işleri kendileri yaparlar, ancak diğer birçok şey için asistanlarının yardımına ihtiyaç duyarlar.

Bu senaryoda,

Boss - Android uygulamasıdır

Asistan - bağlamdır

Dosyalar / Kahve - kaynaklar

Genel olarak başvurumuzun Faaliyetler, Uygulamalar vb. Gibi farklı bölümleri hakkında bilgi almamız gerektiğinde bağlamı çağırırız.

Bağlamın dahil olduğu bazı işlemler (asistanın gerekli olduğu şeyler):

  • Ortak kaynakları yükleme
  • Dinamik görünümler oluşturma
  • Tost mesajlarını görüntüleme
  • Lansman Faaliyetleri vb.

Bağlam elde etmenin farklı yolları:

getContext()

getBaseContext()

getApplicationContext()

this

47

Android Bağlamı bir Arayüzdür (genel anlamda, Java anlamında değil; Java'da,Context uygulamaya özgü kaynaklara ve uygulama ortamıyla ilgili sınıfa ve bilgilere erişim sağlayan aslında soyut bir sınıftır!).

Android uygulamanız bir web uygulaması olsaydı, içeriğiniz benzer bir şey olurdu ServletContext (burada tam bir karşılaştırma yapmıyorum).

Etkinlikleriniz ve hizmetleriniz de genişler Context, böylece uygulamanın çalıştığı ortam bilgilerine erişmek için tüm bu yöntemleri devralırlar.


35
  • Context ortam verilerini elde etmek için bir tanıtıcıyı temsil eder.
  • Context sınıfın kendisi, android işletim sistemi tarafından sağlanan soyut olarak ilan edilir.
  • Context bir televizyonun uzaktan kumandası gibi ve televizyondaki kanallar kaynaklar, hizmetler vb. resim açıklamasını buraya girin

Bununla ne yapabilirsiniz?

  • Kaynak yükleniyor.
  • Yeni bir etkinlik başlatmak.
  • Görünümler oluşturma.
  • Sistem hizmeti alınması.

Bağlam elde etmenin yolları:

  • getApplicationContext()
  • getContext()
  • getBaseContext()resim açıklamasını buraya girinresim açıklamasını buraya girin

18

Sadece yeni başlayanlar için oraya koyuyorum;

Önce Kelime Bağlamını anlayın:

İngilizce-lib. anlamı:

"Bir olay, ifade veya fikir için ortam oluşturan ve bunun tam olarak anlaşılabileceği ve değerlendirilebildiği koşullar."

"Bir kelimenin veya pasajdan hemen önce gelen ve onu takip eden ve anlamını netleştiren, yazılı veya sözlü bir şeyin parçaları."

Şimdi aynı anlayışı programlama dünyasına taşıyın:

uygulamanın / nesnenin geçerli durumunun bağlamı. Yeni oluşturulan nesnelerin neler olup bittiğini anlamasını sağlar. Genellikle programınızın başka bir bölümü (etkinlik, paket / uygulama) hakkında bilgi almak için bunu çağırırsınız

Sen çağırarak bağlamı alabilirsiniz getApplicationContext(), getContext(), getBaseContext()ya dathis (zaman etkinlik sınıfında).

Uygulamada Her Yerde Bağlam Almak için aşağıdaki kodu kullanın:

AppContextAndroid uygulamanızın içinde yeni bir sınıf oluşturun

public class AppContext extends Application {

    private static Context context;

    public void onCreate(){
        super.onCreate();
        AppContext.context = getApplicationContext();
    }

    public static Context getAppContext() {
        return AppContext.context;
    }
}

Artık etkinlik dışı sınıfta uygulama bağlamı istediğinizde, bu yöntemi çağırın ve uygulama bağlamınız olsun.

Umarım bu yardım;)


17

Bunu, uygulamanın veya hizmetin çalıştığı süreci silen VM olarak düşünün. Siled ortamının altında bir dizi temel sistem bilgisine ve izin verilen belirli kaynaklara erişim vardır. Bu hizmetlere erişmek için bu bağlama ihtiyacınız var.


17

Bağlam, mevcut nesneye bu şekilde bir referanstır. Ayrıca bağlam, uygulama ortamıyla ilgili bilgilere erişim sağlar.


13

Sınıf android.content.Context , Android sistemine ve projenin kaynaklarına bağlantı sağlar. Uygulama ortamıyla ilgili küresel bilgilere arayüzdür.

İçerik ayrıca Konum Servisleri gibi Android Hizmetlerine erişim sağlar.

Etkinlikler ve Hizmetler Contextsınıfı genişletir .


9

Bağlam sınıf android.content.Context sınıfının örnekleridir Uygulamayı çalıştıran Android sistemine bağlantı sağlar. Örneğin, geçerli cihaz ekranının boyutunu Bağlam yoluyla kontrol edebilirsiniz.

Ayrıca projenin kaynaklarına erişim sağlar. Uygulama ortamıyla ilgili küresel bilgilere arayüzdür.

Context sınıfı ayrıca zamana dayalı olayları tetiklemek için alarm yöneticisi gibi Android hizmetlerine erişim sağlar.

Etkinlikler ve hizmetler Context sınıfını genişletir. Bu nedenle, doğrudan Bağlam'a erişmek için kullanılabilirler.


9

Bağlam , bir uygulama ortamı hakkında küresel bilgilere bir arabirimdir. Uygulaması Androidsistem tarafından sağlanan soyut bir sınıftır .

Context uygulamaya özgü kaynaklara ve sınıflara erişmenin yanı sıra, launching activities, broadcasting and receiving intents, etc.

İşte Örnek

 public class MyActivity extends Activity {

      public void Testing() {

      Context actContext = this; /*returns the Activity Context since   Activity extends Context.*/

      Context appContext = getApplicationContext();    /*returns the context of the single, global Application object of the current process. */

      Button BtnShowAct1 = (Button) findViewById(R.id.btnGoToAct1);
      Context BtnContext = BtnShowAct1.getContext();   /*returns the context of the View. */

Daha fazla ayrıntı için http://developer.android.com/reference/android/content/Context.html adresini ziyaret edebilirsiniz.


8

Bağlam temel olarak kaynak erişimi ve uygulamanın (uygulama bağlamı için) veya etkinliğin (aktivite bağlamı için) veya diğer herhangi bir ortamın ortam ayrıntılarını almak içindir ...

Bellek sızıntısını önlemek için, bir bağlam nesnesine ihtiyaç duyan her bileşen için uygulama bağlamını kullanmalısınız .... daha fazla bilgi için buraya tıklayın


8

Bağlam, uygulamanın / nesnenin geçerli durumunun bağlamıdır.Çeşitli ortam verilerini temsil eden bir varlıktır. Bağlam, mevcut etkinliğin yerel dosyalar, veritabanları, çevre ile ilişkili sınıf yükleyicileri, sistem düzeyi hizmetler dahil hizmetler ve daha fazlası gibi yan android ortamıyla etkileşime girmesine yardımcı olur.

Bağlam sistem için bir tanıtıcıdır. Kaynakları çözümleme, veritabanlarına ve tercihlere erişim sağlama vb. Hizmetler sağlar. Bir android uygulaması faaliyetleri vardır. Uygulamanızın çalışmakta olduğu ortama bir tanıtıcı gibidir. Activity nesnesi, Context nesnesini devralır.

Bağlam 1'i alabileceğiniz farklı başlatma yöntemleri. GetApplicationContext (), 2. getContext (), 3. getBaseContext () 4. ya da bu (etkinlik sınıfındayken).


7

Bağlam, Android'in hangi aktivitede bulunmam veya hareket etmem gerektiğini öğrenmesi anlamına gelir.

1 - Toast.makeText(context, "Enter All Details", Toast.LENGTH_SHORT).show(); bunda kullanıldı. Context context = ActivityName.this;

2 -startActivity(new Intent(context,LoginActivity.class));

bu bağlamda hangi aktiviteden başka bir aktiviteye gitmek istediğiniz anlamına gelir. context veya ActivityName.this daha hızlıdır, getContext ve getApplicatinContext.


6

A Context, çoğumuzun Uygulama dediği şeydir . Android sistemi tarafından yapılır ve sadece bir uygulamanın yapabildiklerini yapabilir. Tomcat'te, bir Bağlam da bir uygulama dediğim şeydir.

Birçok Etkinliği barındıran bir Bağlam vardır, her bir Etkinliğin birçok Görünümü olabilir.

Açıkçası, bazıları bunun ya da bunun yüzünden uygun olmadığını ve muhtemelen haklı olduğunu söyleyecektir, ancak bir Bağlamın mevcut uygulamanız olduğunu söylemek, yöntem parametrelerine ne koyduğunuzu anlamanıza yardımcı olacaktır.


6

Patron Yardımcısı Analojisi

Bağlamın teknik özelliklerine dalmadan önce küçük bir benzetme yapalım

Her Patronun asistanı veya kendisi için daha az önemli ve daha fazla zaman alan şeyler yapan biri (ayak işleyen çocuk) vardır. Örneğin, bir dosyaya veya kahveye ihtiyaç duyarlarsa, bir yardımcı çalıştırılır. Patron arka planda neler olduğunu bilmeyecek, ancak dosya veya görev teslim edilecek

So Here
Boss - Android Uygulama
Asistanı - İçerik
Dosyası veya kahve - Kaynak

Resmi Android Geliştirici sitesi Context hakkında ne diyor

Bağlam, uygulamayla ilgili kaynaklara erişim noktanızdır

Bu tür kaynaklardan veya görevlerden bazılarını görelim

  • Bir faaliyet başlatmak.

  • Dosya sistemindeki uygulamaya özel önbellek dizinine mutlak yol alma.

  • Sistemde çalışan belirli bir işlem ve kullanıcı kimliği için verilen izne izin verilip verilmediğini belirleme.

  • Size belirli bir izin verilip verilmediğini kontrol etme.

Ve bunun gibi.
Dolayısıyla, bir Android uygulaması bir etkinlik başlatmak istiyorsa, doğrudan Context(Erişim Noktası) öğesine gider veContext sınıf ona kaynakları geri verir (bu durumda niyet).

Diğer herhangi bir sınıf Contextsınıfı gibi, alanlar ve yöntemler de vardır. Resmi belgelerde
daha fazla şey keşfedebilirsiniz Context, hemen hemen her şeyi, mevcut yöntemleri, alanları ve hatta alanların yöntemlerle nasıl kullanılacağını kapsar.


Headh up için teşekkürler @ dhssa. Android belgelerinin özünü sağlamaya çalışıyordum .. Daha dikkatli olmalıydım. "Kopyalanan" kısmı kaldırıldı
Rohit Singh

5

Android.content.Context sınıfının örnekleri, uygulamayı çalıştıran Android sistemine bağlantı sağlar. Örneğin, geçerli cihaz ekranının boyutunu Bağlam yoluyla kontrol edebilirsiniz.

Ayrıca projenin kaynaklarına erişim sağlar. Uygulama ortamıyla ilgili küresel bilgilere arayüzdür.

Context sınıfı ayrıca zamana dayalı olayları tetiklemek için alarm yöneticisi gibi Android hizmetlerine erişim sağlar.

Etkinlikler ve hizmetler Context sınıfını genişletir. Bu nedenle, doğrudan Bağlam'a erişmek için kullanılabilirler.


4

Context'i Android'deki diğer tanıdık sınıflarla bağlamak istiyorsanız , bu yapıyı unutmayın:

Context <ContextWrapper <Uygulama

Context <ContextWrapper <ContextThemeWrapper <Etkinlik

Bağlam <ContextWrapper <ContextThemeWrapper <Etkinlik <ListActivity

Context <ContextWrapper <Hizmet

Bağlam <ContextWrapper <Hizmet <IntentService

Yani, tüm bu sınıflar kendi yollarıyla bağlamlardır. Sen yayınlayabileceğim Servisi ve ListActivity için Bağlamında isterseniz. Ancak yakından bakarsanız, bazı sınıflar temayı da miras alır. Etkinlik veya parça halinde, temanın görünümlerinize uygulanmasını istersiniz, ancak bununla ilgilenmeyin Servis sınıfı.

Burada bağlamlardaki farkı açıklıyorum .


4

Basitçe Contextsöylemek gerekirse , Android'ler endişelenmeyi bırakana kadar sevmeyeceğiniz bir karmaşa.

Android Contextler:

  • Allah-nesneleri.

  • Android için geliştirmeye başlarken tüm uygulamanızı aktarmak istediğiniz şey, ancak programlama, test ve Android'in kendisine biraz daha yaklaştığınızda bunu yapmaktan kaçınacaktır.

    • Belirsiz bağımlılık.

    • Yaygın bellek sızıntıları kaynağı.

    • Test için PITA.

  • Android sistemi tarafından izinleri, kaynakları, tercihleri, hizmetleri, yayınları, stilleri, diyalogları gösterme ve düzeni düzenleme için kullanılan gerçek içerik. Ve Contextbazı ayrı şeyler için farklı örneklere ihtiyacınız var (açıkçası, bir uygulama veya hizmet bağlamından bir iletişim kutusu gösteremezsiniz; uygulama ve etkinlik bağlamlarından şişirilmiş düzenler farklı olabilir).


4

Bağlam her uygulama-lar için android özgü API olan Sandbox kaynakları, veri tabanı, özel filedirectories, tercihler, ayarlara gibi erişim uygulaması özel veri sağlar ...

Özel verilerin çoğu, bir uygulamanın tüm etkinlikleri / hizmetleri / yayıncıları için aynıdır.

Uygulama, Etkinlik, Hizmet, Bağlam arayüzünü uyguladığından, bir api çağrısının bir Bağlam parametresine ihtiyaç duyduğu yerlerde kullanılabilirler


4

Context"Bileşen" terimi, çeşitli zaman aralıklarında bileşen (veya uygulama) anlamına gelir. Eğer 1 ile 14:00 arasında çok fazla yemek yersem, o zamanki bağlamım o zaman boyunca kullandığım tüm yöntemlere (veya kaynaklara) erişmek için kullanılır. İçerik belirli bir süre için bir bileşendir (uygulama). Contextuygulama bileşenleri, bileşenlerin veya uygulamanın temel yaşam döngüsüne bağlı olarak değişmeye devam eder. Örneğin, öğesinin onCreate () yönteminin içinde Activity,

getBaseContext()- etkinlik yapıcısı tarafından ayarlanan (oluşturulan) durumun contextdeğerini verir Activity. getApplicationContext()- ContextUygulamanın oluşturulması sırasında kurulumu (oluşturulan) verir .

Not: <application>tüm Android Bileşenlerini içerir.

<application>
    <activity> .. </activity> 

    <service>  .. </service>

    <receiver> .. </receiver>

    <provider> .. </provider>
</application> 

Bu, getApplicationContext()hangi bileşenden olursa olsun aradığınızda, tüm uygulamanın ortak bağlamını çağırdığınız anlamına gelir .

Context bileşenlerin yaşam döngüsüne göre sistem tarafından değiştirilmeye devam eder.


1

Bağlam'ı farklı kaynaklara sahip bir kutu olarak düşünün: dize, renkler ve yazı tipleri. Bir kaynağa ihtiyacınız varsa, bu kutuya dönersiniz. Ekranı döndürdüğünüzde, yön yatay olarak değiştiğinden bu kutu değişir.


0

 Contextakım anlamına gelir. Contextgeçerli ekran için işlem yapmak için kullanın. ex.
  1. getApplicationContext ()
  2. getContext ()

Toast.makeText(getApplicationContext(), "hello", Toast.LENGTH_SHORT).show();


-7

Java'da, bu anahtar kelimenin uygulamanın geçerli nesnesinin durumunu ifade ettiğini söylüyoruz .
Benzer şekilde, ContextAndroid Geliştirme'de bir alternatif var .

Bu açıkça veya dolaylı olarak tanımlanabilir,

Context con = this;

getApplicationContext();

getBaseContext();

getContext();

Sadece bence şu anki faaliyetin nesnesi olabilir. Birkaç kez sanki kullanıyorum.
Ohiovr

1
Bağlam elde etmenin çok çeşitli yolları vardır. Çağrı thissadece etkinliklerde çalışır. Bağlam "buna" bir alternatif değildir - bağlam, sistem özelliklerine ve çok daha fazlasına erişmek için kullanılır. Bağlamı aşırı basitleştiriyorsunuz ve onunla ana noktayı kaçırıyorsunuz.
Zoe

-10

Bu öznitelik, bu düzenin hangi etkinlikle ilişkilendirildiğini varsayılan olarak bildirir .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.