ความแตกต่างและเวลาที่จะใช้ getApplication (), getApplicationContext (), getBaseContext () และ someClass.this


122

ฉันใหม่เพื่อ Android และฉันพยายามที่จะเข้าใจความแตกต่างระหว่างgetApplication(), getApplicationContext() getBaseContext(), getContext()และsomeClass.thisโดยเฉพาะอย่างยิ่งเมื่อมีการใช้วิธีการเหล่านี้ในสายรหัสต่อไปนี้:

เมื่อฉันเปิดขนมปังปิ้งอะไรคือความแตกต่างระหว่างสิ่งเหล่านี้และในกรณีใดที่ฉันจะใช้?

Toast.makeText(LoginActivity.this, "LogIn successful", Toast.LENGTH_SHORT).show();
Toast.makeText(getApplication(), "LogIn successful", Toast.LENGTH_SHORT).show();
Toast.makeText(getApplicationContext(), "LogIn successful", Toast.LENGTH_SHORT).show();
Toast.makeText(getBaseContext(), "LogIn successful", Toast.LENGTH_SHORT).show();

เหมือนกันกับความตั้งใจ:

Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
Intent intent = new Intent(MenuPagina., LoginActivity.class);
Intent intent = new Intent(getBaseContext(), LoginActivity.class);
Intent intent = new Intent(getApplication(), LoginActivity.class);

สามารถทำสำเนาstackoverflow.com/q/1026973/741249หรือstackoverflow.com/q/6854265/741249
THelper

พวกเขาจัดการบริบทและ baseContext เท่านั้น แต่ฉันอยากจะเข้าใจการใช้งานทั้งหมดของพวกเขาใน 2 contexes ขอบคุณ
Pheonix7

คำตอบ:


216

ขนมปังปิ้งและเจตนาทั้งต้องมีการอ้างอิงถึงบริบท และgetApplication , getApplicationContext , LoginActivity.thisและgetBaseContextพวกเขาทั้งหมดเสนอการอ้างอิงถึงบริบท

ตอนนี้สิ่งที่ทำให้สับสนคือการประกาศบริบทที่แตกต่างกันและการใช้งานเฉพาะของพวกเขา เพื่อให้ง่ายขึ้นคุณควรนับบริบทสองประเภทที่มีอยู่ในกรอบงาน Android

  1. บริบทการใช้งาน
  2. บริบทกิจกรรม

แอพลิเคชันบริบทที่แนบมากับแอพลิเคชันของวงจรชีวิตและมักจะไม่เหมือนเดิมตลอดชีวิตของการประยุกต์ใช้ ดังนั้นหากคุณใช้Toastคุณสามารถใช้บริบทของแอปพลิเคชันหรือแม้กระทั่งบริบทกิจกรรม (ทั้งสองอย่าง) ได้เนื่องจากขนมปังปิ้งสามารถยกได้จากทุกที่ในแอปพลิเคชันของคุณและไม่ได้ติดกับหน้าต่าง

กิจกรรมบริบทถูกแนบไปกับกิจกรรมของวงจรชีวิตและสามารถทำลายถ้ากิจกรรมที่onDestroy()จะเพิ่มขึ้น หากคุณต้องการเปิดตัวกิจกรรมใหม่คุณต้องใช้บริบทของกิจกรรมในIntentเพื่อให้กิจกรรมการเปิดตัวใหม่เชื่อมต่อกับกิจกรรมปัจจุบัน (ในแง่ของสแต็กกิจกรรม) อย่างไรก็ตามคุณอาจใช้บริบทของแอปพลิเคชันเพื่อเปิดกิจกรรมใหม่ แต่คุณต้องตั้งค่าสถานะโดยIntent.FLAG_ACTIVITY_NEW_TASKตั้งใจที่จะถือว่าเป็นงานใหม่

ตอนนี้อ้างถึงกรณีของคุณ:

LoginActivity.this แม้ว่าจะอ้างถึงคลาสของคุณเองซึ่งขยายคลาสกิจกรรม แต่คลาสพื้นฐาน (กิจกรรม) ยังขยายคลาสบริบทดังนั้นจึงสามารถใช้เพื่อเสนอบริบทกิจกรรมได้

getApplication() แม้ว่าจะอ้างถึงแอปพลิเคชันอ็อบเจ็กต์ แต่คลาสแอ็พพลิเคชันขยายคลาสบริบทดังนั้นจึงสามารถใช้เพื่อเสนอบริบทแอ็พพลิเคชัน

getApplicationContext() เสนอบริบทการใช้งาน

getBaseContext() เสนอบริบทกิจกรรม

เคล็ดลับ: เมื่อใดก็ตามที่คุณต้องการจัดการViewsให้ไปที่ Activity-Contextอื่น ๆApplication-Contextก็เพียงพอแล้ว


11
ดังนั้นถ้าฉันทำให้ถูกต้อง someClass.this, getBaseContext และ getContext () คือคอนเท็กซ์ของกิจกรรมในขณะที่ getApplicationContext () และ getApplication () เป็นแอปพลิเคชัน contexes?
Pheonix7

บริบทเป็นเพียงข้อมูลเกี่ยวกับสิ่งแวดล้อมใช่ไหม
committedandroider

ใช่มันเหมือนกับแซนด์บ็อกซ์ที่โฮสต์แอปพลิเคชัน
waqaslam

@committedandroider เนื่องจากบริบทกิจกรรมมีข้อมูลเพิ่มเติมสำหรับธีมที่เลือกดังนั้นเมื่อมุมมองถูกสร้างขึ้นในโค้ดธีมที่ถูกต้องจะถูกนำไปใช้โดยอัตโนมัติ สำหรับข้อมูลเพิ่มเติมคุณอาจจะอ่านนี้
waqaslam

@waqaslam อ้างถึงคลาส sdk android, Context-> ContextWrapper-> 1. Application& 2. ContextThemeWrapper-> Activity; และgetBaseContext()เป็นวิธีการContextWrapperเพื่อให้getBaseContext() offers activity context.เช่นเดียวกับApplication Contextเกินไป ... ไม่ได้ที่?
Bhuro

26

คำตอบโดย Waqas เป็นอย่างชัดเจนและสมบูรณ์ แต่ผมอยากจะชี้แจงความแตกต่างระหว่างการใช้thisกับgetBaseContext()หรือเทียบกับgetApplication() getApplicationContext()ทั้งสองActivityและApplicationขยายไม่ใช่Contextตัวเอง แต่ContextWrapperเป็นไฟล์

"การใช้งานการContextมอบฉันทะนั้นเป็นเพียงการมอบหมายการเรียกทั้งหมดไปยังผู้อื่นContext"

นั่นบริบท "ของจริง" getBaseContext()คือสิ่งที่คุณจะได้รับโดยใช้

ดังนั้นแม้ว่าthis(สำหรับActivity) และgetBaseContext()ทั้งสองให้บริบทของกิจกรรมพวกเขา

  • (ก) อย่าอ้างถึงวัตถุเดียวกัน ( this != getBaseContext()) และ
  • (b) บริบทการโทรผ่านthisนั้นมีประสิทธิภาพน้อยกว่าเล็กน้อยเนื่องจากการโทรต้องผ่านระดับความสามารถพิเศษ ฉันสงสัยว่ามันสร้างความแตกต่างในทางปฏิบัติแม้ว่า

ใช้ตรรกะเดียวกันgetApplication()กับgetApplicationContext().


เท่าที่getBaseContext()เป็นห่วงนักพัฒนา Android ของ Google แนะนำสิ่งนี้: "อย่าใช้ getBaseContext () เพียงแค่ใช้บริบทที่คุณมี" ดังนั้นพวกเขาจึงแนะนำให้คุณใช้thisสำหรับกิจกรรม
ChuongPham

นี่คือคำอธิบายที่ชัดเจนที่สุดที่getBaseContextฉันพบบนอินเทอร์เน็ต ขอบคุณ !!
q126y

6
LoginActivity.this 

บรรทัดด้านบนเป็นกิจกรรมที่เป็นบริบทที่น่ารังเกียจ .. ซึ่งใช้เมื่อคุณสร้าง AlertDialogs บางส่วน ... ในบางสถานที่จะบังคับให้คุณใช้บริบทกิจกรรม ...

getApplication()

วิธีการสร้างข้อความเหมือนกันที่นี่ต้องใช้บริบทและแอปพลิเคชันเอง Context

getApplicationContext()

นี่เป็นวิธีที่ต้องการมากที่สุดเนื่องจากContextยังมีชีวิตอยู่จนถึงแอปพลิเคชันปิดตัวลง

getBaseContext()

บริบทนี้พร้อมใช้งานสำหรับวิดเจ็ตและมุมมอง ..

แต่ทั้งหมดนั้นให้Context object และไม่มีอะไรอื่น ..


ดังนั้นในข้อความขนมปังหรือเมื่อสร้างความตั้งใจพวกเขาทั้งหมดมีผลเหมือนกันแม้ว่าการใช้ getApplicationContext () จะถูกต้องที่สุด?
Pheonix7

1
@Hassan Samii: สำหรับ Toast คุณสามารถใช้ได้getApplicationContext()กับทุกสถานการณ์ แต่ควรใช้thisเมื่อทำ Toast ในกิจกรรม
ChuongPham

0

คลาสนี้ใช้หากคลาสของคุณขยาย Activity getapplication () แอปพลิเคชันการอ้างอิงที่ใช้และแอปพลิเคชันขยายบริบทแอปพลิเคชัน getbasecontext () อ้างถึงบริบทบริบทกิจกรรมของคุณอ้างถึงบริบทแอปพลิเคชันบริบทวงจรชีวิตกิจกรรมของคุณอ้างถึงวงจรชีวิตแอปของคุณ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.