'Bối cảnh' trên Android là gì?


Câu trả lời:


1507

Đặt nó đơn giản:

Như tên cho thấy, đó là bối cảnh của trạng thái hiện tại của ứng dụng / đối tượng. Nó cho phép các đối tượng mới được tạo ra hiểu những gì đang diễn ra. Thông thường bạn gọi nó để nhận thông tin liên quan đến một phần khác của chương trình của bạn (hoạt động và gói / ứng dụng).

Bạn có thể lấy bối cảnh bằng cách gọi getApplicationContext(), getContext(), getBaseContext()hoặc this(khi trong một lớp học kéo dài từ Context, chẳng hạn như các ứng dụng, Hoạt động, dịch vụ và IntentService lớp).

Sử dụng điển hình của bối cảnh:

  • Tạo đối tượng mới : Tạo chế độ xem mới, bộ điều hợp, người nghe:

    TextView tv = new TextView(getContext());
    ListAdapter adapter = new SimpleCursorAdapter(getApplicationContext(), ...);
    
  • Truy cập các tài nguyên phổ biến tiêu chuẩn : Các dịch vụ như LAYOUT_INFLATER_SERVICE, SharedPreferences:

    context.getSystemService(LAYOUT_INFLATER_SERVICE)
    getApplicationContext().getSharedPreferences(*name*, *mode*);
    
  • Truy cập các thành phần ngầm : Liên quan đến nhà cung cấp nội dung, chương trình phát sóng, ý định

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

51
Trong ví dụ của bạn context.getSystemService(LAYOUT_INFLATER_SERVICE), được contextđịnh nghĩa ở đâu và như thế nào ?
Dennis

8
Nó cũng được giải thích tại sao chúng ta cần bối cảnh trong khi tự động tạo chế độ xem văn bản. Nhưng trong khi tự động tạo ra các mảng xem văn bản, chúng tôi không phải đề cập đến bất kỳ bối cảnh nào. Tại sao lại như vậy? TextView [] textview = TextView mới [10];
Abhinav Arora

38
@AbhinavArora khi xác định mảng, bạn không thực sự xây dựng một thể hiện của bất kỳ chế độ xem văn bản nào (về cơ bản bạn chỉ đang tạo không gian cho chúng đi vào). Tại thời điểm bạn đến để đặt bất kỳ giá trị nào vào mảng đó, bạn sẽ cần TextViews được tạo trước hoặc cần một Ngữ cảnh để cho phép bạn tạo chúng.
mc1arke 18/03/2015

24
Tại sao quan điểm cần bối cảnh? Ví dụ, TextView sẽ không thể làm gì nếu nó không có ngữ cảnh?
khủng long

15
Một đoạn mã không có "Ngữ cảnh" có thể chạy trên mỗi hệ điều hành có JVM. Nhưng nếu có một bối cảnh thì nó nên chạy trên Android. Nếu bạn muốn sử dụng những thứ cụ thể của Android (truy cập vị trí thiết bị, chụp ảnh, chạy dịch vụ nền, v.v.) bạn cần một bối cảnh Mặc dù bạn không cần nếu bạn thực hiện yêu cầu http. Bối cảnh có thể được coi là cầu nối giữa Java và Android.
Faruk Toptas

508

Định nghĩa bối cảnh

  • Bối cảnh đại diện cho dữ liệu môi trường
  • Nó cung cấp quyền truy cập vào những thứ như cơ sở dữ liệu

Các thuật ngữ đơn giản hơn (ví dụ 1)

  • Hãy xem Person-X là CEO của một công ty phần mềm khởi nghiệp.

  • Có một kiến ​​trúc sư trưởng có mặt trong công ty, kiến ​​trúc sư trưởng này làm tất cả các công việc trong công ty liên quan đến cơ sở dữ liệu, giao diện người dùng, v.v.

  • Bây giờ CEO thuê một Nhà phát triển mới.

  • Chính Kiến trúc sư nói lên trách nhiệm của người mới được tuyển dụng dựa trên các kỹ năng của người mới rằng liệu anh ta sẽ làm việc trên Cơ sở dữ liệu hay Giao diện người dùng, v.v.

Các thuật ngữ đơn giản hơn (ví dụ 2)

  • Nó giống như quyền truy cập của hoạt động Android vào tài nguyên của ứng dụng.

  • Nó tương tự như khi bạn ghé thăm một khách sạn, bạn muốn bữa sáng, bữa trưa và bữa tối theo thời gian phù hợp, phải không?

  • Có nhiều thứ khác bạn thích trong thời gian ở lại. Làm thế nào để bạn có được những điều này?

  • Bạn yêu cầu người phục vụ phòng mang những thứ này cho bạn.

  • Ở đây, người phục vụ phòng là bối cảnh coi bạn là hoạt động đơn lẻ và khách sạn là ứng dụng của bạn, cuối cùng, bữa sáng, bữa trưa và bữa tối phải là tài nguyên.


Những thứ liên quan đến bối cảnh là:

  1. Đang tải tài nguyên.
  2. Ra mắt một hoạt động mới.
  3. Tạo quan điểm.
  4. có được dịch vụ hệ thống.

Ngữ cảnh là lớp cơ sở cho Hoạt động , Dịch vụ , Ứng dụng , v.v.

Một cách khác để mô tả điều này: Hãy xem ngữ cảnh là điều khiển từ xa của TV và kênh trong truyền hình là tài nguyên, dịch vụ, sử dụng ý định, v.v. - - Ở đây hoạt động như một quyền truy cập để truy cập vào tất cả các tài nguyên khác nhau vào tiền cảnh.

  • Vì vậy, Remote có quyền truy cập vào các kênh như tài nguyên, dịch vụ, sử dụng ý định, v.v ....

  • Tương tự như vậy ... Bất cứ ai có quyền truy cập từ xa đều có quyền truy cập vào tất cả những thứ như tài nguyên, dịch vụ, sử dụng ý định, v.v.


Phương pháp khác nhau mà bạn có thể nhận được bối cảnh

  • getApplicationContext()
  • getContext()
  • getBaseContext()
  • hoặc this(khi ở trong lớp hoạt động)

Thí dụ:

TextView tv = new TextView(this);

Từ khóa thisđề cập đến bối cảnh của hoạt động hiện tại.


3
Ok, do đó, lớp bắt nguồn từ Activity IS là một bối cảnh. Đó là lý do tại sao bằng cách chuyển cái này đến các khung nhìn mới được tạo, chúng ta vượt qua bối cảnh.
0leg 25/1/2015

7
Tôi tự hỏi nếu đó là một quyết định thiết kế tốt để có bối cảnh có thể truy cập từ nhiều nơi khác nhau? Theo tôi, một getContext () tĩnh trong ứng dụng là đủ.
Trilarion

@Trilarion ... Nó phụ thuộc vào cách bạn muốn sử dụng bối cảnh getApplicationContext(), getContext(), getBaseContext()..... Tham khảo này -> ( stackoverflow.com/a/10641257 )
Devrath

Chỉ để mở rộng phần cuối cùng với việc tạo một textview: Trong một số trường hợp có thể cần phải gọi SomeActivityName.this. Trong một chủ đề cho một ví dụ, thisđề cập đến chủ đề chứ không phải hoạt động
Zoe

1
Là đối tượng bối cảnh duy nhất cho apk hoặc hệ điều hành Android? Một ứng dụng có thể có hai bối cảnh khác nhau?
valijon

367

Nguồn


Chủ đề về bối cảnh trong Android dường như gây nhầm lẫn cho nhiều người. Mọi người chỉ biết rằng Ngữ cảnh là cần thiết khá thường xuyên để làm những điều cơ bản trong Android. Mọi người đôi khi hoảng loạn vì họ cố gắng thực hiện một số thao tác đòi hỏi Bối cảnh và họ không biết làm thế nào để có được một bối cảnh đúng. Tôi sẽ cố gắng làm sáng tỏ ý tưởng về Ngữ cảnh trong Android. Một cách xử lý vấn đề đầy đủ nằm ngoài phạm vi của bài đăng này, nhưng tôi sẽ cố gắng đưa ra một cái nhìn tổng quan chung để bạn có ý thức về bối cảnh là gì và cách sử dụng nó. Để hiểu Ngữ cảnh là gì, hãy xem mã nguồn:

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

Chính xác thì bối cảnh là gì?

Chà, bản thân tài liệu này cung cấp một lời giải thích khá đơn giản: Lớp Ngữ cảnh là một Giao diện trên nền tảng thông tin toàn cầu về môi trường ứng dụng ".

Bản thân lớp Ngữ cảnh được khai báo là lớp trừu tượng, có triển khai được cung cấp bởi HĐH Android. Tài liệu tiếp tục cung cấp rằng Bối cảnh Gian hàng cho phép truy cập vào các tài nguyên và lớp cụ thể của ứng dụng, cũng như các cuộc gọi lên cho các hoạt động ở cấp ứng dụng như khởi chạy các hoạt động, phát sóng và nhận ý định, v.v. ".

Bây giờ bạn có thể hiểu rất rõ, tại sao tên là Bối cảnh. Đó là bởi vì nó chỉ có vậy. Ngữ cảnh cung cấp liên kết hoặc hook, nếu bạn sẽ, cho một Hoạt động, Dịch vụ hoặc bất kỳ thành phần nào khác, do đó liên kết nó với hệ thống, cho phép truy cập vào môi trường ứng dụng toàn cầu. Nói cách khác: Bối cảnh cung cấp câu trả lời cho câu hỏi về các thành phần của Trang, nơi tôi thường liên quan đến ứng dụng và làm thế nào để tôi truy cập / liên lạc với phần còn lại của ứng dụng? Nếu tất cả điều này có vẻ hơi khó hiểu, thì việc xem nhanh các phương thức được hiển thị bởi lớp Ngữ cảnh cung cấp một số manh mối tiếp theo về bản chất thực sự của nó.

Đây là một mẫu ngẫu nhiên của các phương pháp đó:

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

Tất cả những phương pháp này có điểm gì chung? Tất cả đều cho phép bất cứ ai có quyền truy cập vào Ngữ cảnh để có thể truy cập các tài nguyên trên toàn ứng dụng.

Nói cách khác, bối cảnh, móc thành phần có tham chiếu đến phần còn lại của môi trường ứng dụng. Ví dụ, thư mục tài sản (nghĩ '/ tài sản' trong dự án của bạn) có sẵn trên ứng dụng, miễn là Hoạt động, Dịch vụ hoặc bất cứ điều gì biết cách truy cập các tài nguyên đó. Điều tương tự cũng cho getResources()phép thực hiện những việc như getResources().getColor()sẽ đưa bạn vào colors.xmltài nguyên (không bao giờ việc aapt cho phép truy cập vào tài nguyên thông qua mã java, đó là một vấn đề riêng biệt).

Kết quả là Contextlà những gì cho phép truy cập vào tài nguyên hệ thống và những gì móc linh kiện vào “ứng dụng lớn hơn". Hãy nhìn vào các lớp con của nó Context, các lớp học cung cấp việc thực hiện trừu tượng Contextlớp. Lớp rõ ràng nhất là các Activitylớp. ActivityKế thừa từ ContextThemeWrapper, vốn thừa hưởng từ ContextWrapper, vốn thừa hưởng từ Contextchính nó. Các lớp đó rất hữu ích để xem xét để hiểu mọi thứ ở mức độ sâu hơn, nhưng bây giờ đủ để biết điều đó ContextThemeWrappervà gần ContextWrappernhư là những gì chúng nghe giống như. Chúng thực hiện các yếu tố trừu tượng của Contextbản thân lớp bằng cách quấn gói Một bối cảnh (bối cảnh thực tế) và ủy thác các chức năng đó cho bối cảnh đó. Một ví dụ rất hữu ích - trongContextWrapperlớp, phương thức trừu tượng getAssetstừ Contextlớp được thực hiện như sau:

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

mBasechỉ đơn giản là một trường được thiết lập bởi nhà xây dựng cho một bối cảnh cụ thể. Vì vậy, một bối cảnh được bao bọc và các ContextWrapperđại biểu thực hiện phương thức getAssets cho bối cảnh đó. Chúng ta hãy quay lại kiểm tra Activitylớp cuối cùng kế thừa Contextđể xem tất cả những thứ này hoạt động như thế nào.

Bạn có thể biết Hoạt động là gì, nhưng để xem lại - về cơ bản, đó là điều duy nhất người dùng có thể làm. Nó cung cấp một cửa sổ để đặt UI mà người dùng tương tác với '. Các nhà phát triển quen thuộc với các API khác và thậm chí cả những người không phải là nhà phát triển có thể nghĩ về nó một cách kỳ lạ như một màn hình. Điều đó về mặt kỹ thuật không chính xác, nhưng nó không quan trọng đối với mục đích của chúng tôi. Vậy làm thế nào để làm ActivityContexttương tác và chính xác những gì đang diễn ra trong mối quan hệ thừa kế của họ?

Một lần nữa, thật hữu ích khi xem xét các ví dụ cụ thể. Chúng ta đều biết cách khởi động Hoạt động. Với điều kiện bạn có một bối cảnh mà bạn đang bắt đầu Hoạt động, bạn chỉ cần gọi startActivity(intent), trong đó Ý định mô tả bối cảnh mà bạn đang bắt đầu một Hoạt động và Hoạt động bạn muốn bắt đầu. Đây là quen thuộc startActivity(this, SomeOtherActivity.class).

Và là thisgì? thislà Hoạt động của bạn vì Activitylớp kế thừa từ Context. Toàn bộ tin sốt dẻo là như thế này: Khi bạn gọi startActivity, cuối cùng Activitylớp thực hiện một cái gì đó như thế này:

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

Vì vậy, nó sử dụng execStartActivitytừ Instrumentationlớp (thực sự từ một lớp bên trong Instrumentationđược gọi ActivityResult).

Tại thời điểm này, chúng tôi đang bắt đầu có một cái nhìn sơ lược về các hệ thống bên trong.

Đây là nơi HĐH thực sự xử lý mọi thứ. Vậy làm thế nào để Thiết bị bắt đầu Hoạt động chính xác? Chà, thông số thistrong execStartActivityphương thức trên là Hoạt động của bạn, tức là Bối cảnh và execStartActivitysử dụng bối cảnh này.

Tổng quan 30.000 là thế này: lớp Thiết bị theo dõi danh sách các Hoạt động mà nó đang theo dõi để thực hiện. Danh sách này được sử dụng để phối hợp tất cả các hoạt động và đảm bảo mọi thứ diễn ra suôn sẻ trong việc quản lý luồng hoạt động.

Có một số thao tác mà tôi chưa hoàn toàn xem xét trong đó phối hợp các vấn đề xử lý và xử lý. Cuối cùng, việc ActivityResultsử dụng một thao tác gốc - ActivityManagerNative.getDefault().startActivity()sử dụng thao tác Contextmà bạn đã truyền khi bạn gọi startActivity. Bối cảnh bạn đã thông qua được sử dụng để hỗ trợ giải quyết ý định của cải thiện nếu có. Độ phân giải ý định là quá trình mà hệ thống có thể xác định mục tiêu của ý định nếu nó không được cung cấp. (Kiểm tra hướng dẫn ở đây để biết thêm chi tiết).

Và để Android thực hiện điều này, nó cần quyền truy cập vào thông tin được cung cấp bởi Context. Cụ thể, hệ thống cần truy cập vào ContentResolverđể có thể xác định loại MIME của dữ liệu của mục đích ". Toàn bộ phần này về cách startActivitysử dụng bối cảnh hơi phức tạp và bản thân tôi không hiểu đầy đủ về nội bộ. chỉ để minh họa cách các tài nguyên trên toàn ứng dụng cần được truy cập để thực hiện nhiều thao tác cần thiết cho ứng dụng. ContextĐó là những gì cung cấp quyền truy cập vào các tài nguyên này. Một ví dụ đơn giản hơn có thể là Chế độ xem. Chế độ xem tùy chỉnh bằng cách mở rộng RelativeLayouthoặc một số Viewlớp khác , bạn phải cung cấp hàm tạo có mộtContextnhư một cuộc tranh luận Khi bạn khởi tạo Chế độ xem tùy chỉnh, bạn sẽ chuyển qua ngữ cảnh. Tại sao? Bởi vì Chế độ xem cần có khả năng truy cập vào các chủ đề, tài nguyên và các chi tiết cấu hình khác của Chế độ xem. Xem cấu hình thực sự là một ví dụ tuyệt vời. Mỗi Ngữ cảnh có các tham số khác nhau (các trường trong Contexttriển khai) do chính HĐH đặt cho các nội dung như kích thước hoặc mật độ của màn hình. Thật dễ dàng để biết lý do tại sao thông tin này quan trọng để thiết lập Chế độ xem, v.v.

Một từ cuối cùng: Vì một số lý do, những người mới sử dụng Android (và thậm chí cả những người không quá mới) dường như hoàn toàn quên đi lập trình hướng đối tượng khi nói đến Android. Vì một số lý do, mọi người cố gắng uốn cong sự phát triển Android của họ thành các mô hình được hình thành trước hoặc các hành vi được học.

Android có mô hình riêng và một mô hình nhất định thực sự khá nhất quán nếu buông bỏ các khái niệm được hình thành từ trước của bạn và chỉ cần đọc tài liệu và hướng dẫn phát triển. Tuy nhiên, quan điểm thực tế của tôi, trong khi đó, việc sử dụng bối cảnh phù hợp, đôi khi có thể rất khó khăn, mọi người lại hoảng loạn một cách vô lý vì họ gặp phải tình huống cần bối cảnh và nghĩ rằng họ không có nó. Một lần nữa, Java là một ngôn ngữ hướng đối tượng với thiết kế kế thừa.

Bạn chỉ duy nhất có một bối cảnh bên trong Hoạt động của mình vì chính hoạt động của bạn kế thừa từ Ngữ cảnh. Không có phép thuật nào đối với nó (ngoại trừ tất cả những thứ mà HĐH tự làm để thiết lập các tham số khác nhau và để cấu hình chính xác cho cấu hình của bạn). Vì vậy, đặt các vấn đề về bộ nhớ / hiệu năng sang một bên (ví dụ: giữ các tham chiếu đến ngữ cảnh khi bạn không cần hoặc thực hiện theo cách có hậu quả tiêu cực đối với bộ nhớ, v.v.), Ngữ cảnh là một đối tượng như bất kỳ đối tượng nào khác và nó có thể được truyền qua giống như bất kỳ POJO nào (Đối tượng Java cũ). Đôi khi bạn có thể cần phải làm những điều thông minh để truy xuất bối cảnh đó, nhưng bất kỳ lớp Java thông thường nào mở rộng từ không có gì khác ngoài chính Object có thể được viết theo cách có quyền truy cập vào ngữ cảnh; chỉ cần hiển thị một phương thức công khai có một bối cảnh và sau đó sử dụng nó trong lớp đó khi cần thiết.


33
Đây là một câu trả lời tuyệt vời. Tốt hơn nhiều so với cái được chấp nhận, chỉ nói những gì mọi người biết bằng trực giác.
Honza Kalfus

5
đây là câu trả lời dài mà bạn đang tìm kiếm! giải thích rõ ràng
Nick Jian

4
Ans tuyệt vời! Nghiêm túc !
zeekhuge

3
Hmmm, đối với tôi tất cả nghe giống như những gì chúng ta đã sử dụng để gọi các biến toàn cục, điều này rất khó chịu khi hướng đối tượng bước vào cảnh 8-)
Ulf Edholm

Vì vậy, bối cảnh tôi nhận được từ getApplicationContext có giống với getContext trong Activity không?
JPM

120

Một bối cảnh là một tay cầm cho hệ thống; nó cung cấp các dịch vụ như giải quyết các tài nguyên, có được quyền truy cập vào cơ sở dữ liệu và các tùy chọn, v.v. Một ứng dụng Android có các hoạt động. Ngữ cảnh giống như một điều khiển đối với môi trường mà ứng dụng của bạn hiện đang chạy. Đối tượng hoạt động kế thừa đối tượng Ngữ cảnh.

Để biết thêm thông tin, hãy xem Giới thiệu về phát triển Android với Android Studio - Hướng dẫn .


89

Contextlà một "giao diện" cho thông tin toàn cầu về môi trường ứng dụng. Trong thực tế, Contextthực sự là một lớp trừu tượng , có triển khai được cung cấp bởi hệ thống Android.

Nó cho phép truy cập vào các tài nguyên và các lớp dành riêng cho ứng dụng, cũng như các cuộc gọi lên cho các hoạt động ở cấp ứng dụng, chẳng hạn như các hoạt động khởi chạy, phát sóng và nhận ý định, v.v.

Trong hình dưới đây, bạn có thể thấy một hệ thống phân cấp của các lớp, trong đó Contextlớp gốc của hệ thống phân cấp này. Đặc biệt, đáng để nhấn mạnh rằng đó Activitylà hậu duệ của Context.

Sơ đồ hoạt động


bức ảnh này được tạo ra như thế nào?
d0ye

70

Có gì Contextchính xác?

Theo tài liệu tham khảo Android, đó là một thực thể đại diện cho dữ liệu môi trường khác nhau. Nó cung cấp quyền truy cập vào các tệp cục bộ, cơ sở dữ liệu, trình nạp lớp liên quan đến môi trường, dịch vụ (bao gồm các dịch vụ cấp hệ thống), v.v. Trong suốt cuốn sách này và trong quá trình mã hóa hàng ngày của bạn với Android, bạn sẽ thấy Bối cảnh được truyền qua thường xuyên.

Từ cuốn sách " Android in Practice ", p. 60.

Một số API Android yêu cầu Contexttham số làm

Nếu bạn xem qua các API Android khác nhau, bạn sẽ nhận thấy rằng nhiều trong số chúng lấy một android.content.Contextđối tượng làm tham số. Bạn cũng sẽ thấy rằng một Hoạt động hoặc Dịch vụ thường được sử dụng như một Context. Điều này hoạt động vì cả hai lớp này mở rộng từ Context.


52

Ví dụ đơn giản để hiểu contexttrong Android:

Mỗi ông chủ có một trợ lý để chăm sóc, để thực hiện tất cả các nhiệm vụ ít quan trọng và tốn thời gian. Nếu một tập tin hoặc một tách cà phê là cần thiết, một trợ lý đang chạy. Một số ông chủ hầu như không biết những gì đang diễn ra trong văn phòng, vì vậy họ cũng hỏi trợ lý của họ về vấn đề này. Họ tự làm một số công việc nhưng đối với hầu hết những việc khác, họ cần sự giúp đỡ của các trợ lý.

Trong kịch bản này,

Ông chủ - là ứng dụng Android

Trợ lý - là bối cảnh

Tập tin / tách cà phê - là tài nguyên

Chúng tôi thường gọi bối cảnh khi chúng tôi cần nhận thông tin về các phần khác nhau của ứng dụng của mình như Hoạt động, Ứng dụng, v.v.

Một số thao tác (những thứ cần trợ lý) khi có bối cảnh:

  • Đang tải tài nguyên chung
  • Tạo chế độ xem động
  • Hiển thị tin nhắn Toast
  • Hoạt động ra mắt, vv

Các cách khác nhau để có được bối cảnh:

getContext()

getBaseContext()

getApplicationContext()

this

47

Một bối cảnh Android là một Giao diện (theo nghĩa chung, không phải theo nghĩa Java; trong Java, Contextthực sự là một lớp trừu tượng!) Cho phép truy cập vào các tài nguyên và lớp cụ thể của ứng dụng và thông tin về môi trường ứng dụng.

Nếu ứng dụng Android của bạn là một ứng dụng web, ngữ cảnh của bạn sẽ giống với ServletContext(tôi không thực hiện so sánh chính xác ở đây).

Các hoạt động và dịch vụ của bạn cũng mở rộng Context, vì vậy chúng kế thừa tất cả các phương thức đó để truy cập thông tin môi trường mà ứng dụng đang chạy.


35
  • Context đại diện cho một tay cầm để có được dữ liệu môi trường.
  • Context Bản thân lớp được khai báo là trừu tượng, có triển khai được cung cấp bởi HĐH Android.
  • Context giống như điều khiển từ xa của TV & kênh trong truyền hình là tài nguyên, dịch vụ, v.v. nhập mô tả hình ảnh ở đây

Bạn có thể làm gì với nó ?

  • Đang tải tài nguyên.
  • Ra mắt một hoạt động mới.
  • Tạo quan điểm.
  • Có được dịch vụ hệ thống.

Các cách để có được bối cảnh:

  • getApplicationContext()
  • getContext()
  • getBaseContext()nhập mô tả hình ảnh ở đâynhập mô tả hình ảnh ở đây

18

Chỉ cần đưa nó ra cho người mới;

Vì vậy, trước tiên hãy hiểu ngữ cảnh Word:

Trong tiếng Anh-lib. nó có nghĩa là:

"Các trường hợp hình thành các thiết lập cho một sự kiện, tuyên bố hoặc ý tưởng, và về mặt nó có thể được hiểu và đánh giá đầy đủ."

"Các phần của một cái gì đó được viết hoặc nói ngay trước và theo một từ hoặc đoạn văn và làm rõ nghĩa của nó."

Bây giờ hãy hiểu điều tương tự với thế giới lập trình:

bối cảnh của trạng thái hiện tại của ứng dụng / đối tượng. Nó cho phép các đối tượng mới được tạo ra hiểu những gì đang diễn ra. Thông thường bạn gọi nó để nhận thông tin về một phần khác của chương trình của bạn (hoạt động, gói / ứng dụng)

Bạn có thể có được bối cảnh bằng cách gọi getApplicationContext(), getContext(), getBaseContext()hoặc this(khi trong lớp hoạt động).

Để lấy bối cảnh ở mọi nơi trong ứng dụng, hãy sử dụng đoạn mã sau:

Tạo lớp mới AppContextbên trong ứng dụng Android của bạn

public class AppContext extends Application {

    private static Context context;

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

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

Bây giờ bất cứ lúc nào bạn muốn bối cảnh ứng dụng trong lớp không hoạt động, hãy gọi phương thức này và bạn có bối cảnh ứng dụng.

Hy vọng điều này giúp đỡ ;)


17

Hãy nghĩ về nó như là VM đã làm im lặng quá trình ứng dụng hoặc dịch vụ đang chạy. Môi trường im lặng có quyền truy cập vào một loạt các thông tin hệ thống cơ bản và một số tài nguyên được phép. Bạn cần bối cảnh đó để có được tại các dịch vụ.


17

Bối cảnh là một tham chiếu đến đối tượng hiện tại như thế này. Ngoài ra bối cảnh cho phép truy cập vào thông tin về môi trường ứng dụng.


13

Lớp android.content.Contextcung cấp kết nối với hệ thống Android và các tài nguyên của dự án. Nó là giao diện cho thông tin toàn cầu về môi trường ứng dụng.

Ngữ cảnh cũng cung cấp quyền truy cập vào Dịch vụ Android, ví dụ: Dịch vụ vị trí.

Các hoạt động và dịch vụ mở rộng Contextlớp học.


9

Ngữ cảnh là Trường hợp của lớp android.content.Context cung cấp kết nối đến hệ thống Android thực thi ứng dụng. Ví dụ: bạn có thể kiểm tra kích thước của màn hình thiết bị hiện tại thông qua Ngữ cảnh.

Nó cũng cung cấp quyền truy cập vào các tài nguyên của dự án. Nó là giao diện cho thông tin toàn cầu về môi trường ứng dụng.

Lớp Ngữ cảnh cũng cung cấp quyền truy cập vào các dịch vụ Android, ví dụ: trình quản lý báo thức để kích hoạt các sự kiện dựa trên thời gian.

Các hoạt động và dịch vụ mở rộng lớp Ngữ cảnh. Do đó, chúng có thể được sử dụng trực tiếp để truy cập vào Bối cảnh.


9

Bối cảnh là một giao diện cho thông tin toàn cầu về một môi trường ứng dụng. Đó là một lớp trừu tượng có triển khai được cung cấp bởi Androidhệ thống.

Context cho phép truy cập vào các tài nguyên và các lớp dành riêng cho ứng dụng, cũng như các cuộc gọi cho các hoạt động ở cấp ứng dụng như launching activities, broadcasting and receiving intents, etc.

Đây là ví dụ

 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. */

Để biết thêm chi tiết, bạn có thể truy cập http://developer.android.com/reference/android/content/Context.html


8

Ngữ cảnh về cơ bản là để truy cập tài nguyên và nhận thông tin chi tiết về môi trường của ứng dụng (cho bối cảnh ứng dụng) hoặc hoạt động (cho bối cảnh hoạt động) hoặc bất kỳ ...

Để tránh rò rỉ bộ nhớ, bạn nên sử dụng bối cảnh ứng dụng cho mọi thành phần cần đối tượng ngữ cảnh .... để biết thêm bấm vào đây


8

Bối cảnh là bối cảnh của trạng thái hiện tại của ứng dụng / đối tượng. Đây là một thực thể đại diện cho dữ liệu môi trường khác nhau. Bối cảnh giúp hoạt động hiện tại tương tác với môi trường Android bên ngoài như các tệp cục bộ, cơ sở dữ liệu, trình tải lớp liên quan đến môi trường, các dịch vụ bao gồm các dịch vụ cấp hệ thống, v.v.

Một bối cảnh là một tay cầm cho hệ thống. Nó cung cấp các dịch vụ như giải quyết các tài nguyên, có được quyền truy cập vào cơ sở dữ liệu và các tùy chọn, v.v. Một ứng dụng Android có các hoạt động. Nó giống như xử lý môi trường mà ứng dụng của bạn hiện đang chạy. Đối tượng hoạt động kế thừa đối tượng Ngữ cảnh.

Các phương thức gọi khác nhau mà bạn có thể nhận được ngữ cảnh 1. getApplicationContext (), 2. getContext (), 3. getBaseContext () 4. hoặc this (khi ở trong lớp hoạt động).


7

Bối cảnh có nghĩa là Android nhận biết hoạt động nào tôi nên thực hiện hoặc hành động.

1 - Toast.makeText(context, "Enter All Details", Toast.LENGTH_SHORT).show(); nó được sử dụng trong này. Context context = ActivityName.this;

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

trong bối cảnh này có nghĩa là từ hoạt động nào bạn muốn đi đến hoạt động khác. bối cảnh hoặc ActivityName.this nhanh hơn sau đó, getContext và getApplicatinContext.


6

A Contextlà cái mà hầu hết chúng ta sẽ gọi là Ứng dụng . Nó được tạo bởi hệ thống Android và chỉ có thể làm những gì ứng dụng có thể làm được. Trong Tomcat, một bối cảnh cũng là cái mà tôi sẽ gọi là một ứng dụng.

Có một Ngữ cảnh chứa nhiều Hoạt động, mỗi Hoạt động có thể có nhiều Lượt xem.

Rõ ràng, một số người sẽ nói rằng nó không phù hợp vì điều này hoặc điều đó và họ có thể đúng, nhưng nói rằng Ngữ cảnh là ứng dụng hiện tại của bạn sẽ giúp bạn hiểu những gì bạn đang đặt trong các tham số phương thức.


6

Trợ lý ông chủ tương tự

Hãy có một sự tương tự nhỏ trước khi đi sâu vào tính kỹ thuật của Ngữ cảnh

Mỗi ông chủ đều có một trợ lý hoặc một người nào đó (cậu bé lặt vặt), người làm những việc ít quan trọng hơn và tốn nhiều thời gian hơn cho anh ta. Ví dụ, nếu họ cần một tập tin hoặc cà phê thì một trợ lý sẽ được chạy. Ông chủ sẽ không biết những gì đang diễn ra trong nền nhưng tệp hoặc tác vụ sẽ được gửi

Vì vậy, ông
chủ -
Trợ lý ứng dụng Android -
Tệp ngữ cảnh hoặc tách cà phê - Tài nguyên

Trang web chính thức của Nhà phát triển Android nói gì về Ngữ cảnh

Bối cảnh là điểm truy cập của bạn cho các tài nguyên liên quan đến ứng dụng

Chúng ta hãy xem một số tài nguyên hoặc nhiệm vụ như vậy

  • Ra mắt một hoạt động.

  • Nhận đường dẫn tuyệt đối đến thư mục bộ đệm cụ thể của ứng dụng trên hệ thống tệp.

  • Xác định xem sự cho phép có được phép cho một quy trình cụ thể và ID người dùng đang chạy trong hệ thống hay không.

  • Kiểm tra xem bạn đã được cấp một sự cho phép cụ thể.

Và như thế.
Vì vậy, nếu một ứng dụng Android muốn bắt đầu một hoạt động, nó sẽ đi thẳng đến Context(Điểm truy cập) vàContext lớp cung cấp cho anh ta các tài nguyên (Ý định trong trường hợp này).

Giống như bất kỳ lớp Contextlớp nào khác cũng có các trường và phương thức.
Bạn có thể khám phá thêm về Contexttài liệu chính thức, nó bao gồm khá nhiều thứ, phương thức có sẵn, trường và thậm chí cách sử dụng trường với phương thức.


cảm ơn vì đã đứng lên @dhssa. Tôi đã cố gắng cung cấp ý chính cho các tài liệu Android .. Shoul đã cẩn thận hơn. Đã xóa phần "sao chép"
Rohit Singh

5

Các thể hiện của lớp android.content.Context cung cấp kết nối đến hệ thống Android thực thi ứng dụng. Ví dụ: bạn có thể kiểm tra kích thước của màn hình thiết bị hiện tại thông qua Ngữ cảnh.

Nó cũng cung cấp quyền truy cập vào các tài nguyên của dự án. Nó là giao diện cho thông tin toàn cầu về môi trường ứng dụng.

Lớp Ngữ cảnh cũng cung cấp quyền truy cập vào các dịch vụ Android, ví dụ: trình quản lý báo thức để kích hoạt các sự kiện dựa trên thời gian.

Các hoạt động và dịch vụ mở rộng lớp Ngữ cảnh. Do đó, chúng có thể được sử dụng trực tiếp để truy cập vào Bối cảnh.


4

Nếu bạn muốn kết nối Ngữ cảnh với các lớp quen thuộc khác trong Android, hãy ghi nhớ cấu trúc này:

Bối cảnh <ContextWrapper <Ứng dụng

Bối cảnh <ContextWrapper <ContextThemeWrapper <Hoạt động

Bối cảnh <ContextWrapper <ContextThemeWrapper <Hoạt động <ListActivity

Bối cảnh <ContextWrapper <Dịch vụ

Bối cảnh <ContextWrapper <Dịch vụ <IntentService

Vì vậy, tất cả các lớp đó là bối cảnh theo cách riêng của họ. Bạn có thể truyền ServiceListActivity sang Context nếu muốn. Nhưng nếu bạn nhìn kỹ, một số lớp cũng kế thừa chủ đề. Trong hoạt động hoặc đoạn, bạn muốn chủ đề được áp dụng cho quan điểm của mình, nhưng đừng quan tâm đến nó Dịch vụ lớp , chẳng hạn.

Tôi giải thích sự khác biệt trong bối cảnh ở đây .


4

Nói một cách đơn giản, Android Contextlà một mớ hỗn độn mà bạn sẽ không yêu thích cho đến khi bạn ngừng lo lắng.

Android Contextlà:

  • Thần-đối tượng.

  • Điều bạn muốn vượt qua tất cả các ứng dụng của mình khi bạn bắt đầu phát triển cho Android, nhưng sẽ tránh làm điều đó khi bạn tiến gần hơn một chút đến lập trình, thử nghiệm và chính Android.

    • Sự phụ thuộc không rõ ràng.

    • Nguồn rò rỉ bộ nhớ phổ biến.

    • PITA để thử nghiệm.

  • Bối cảnh thực tế được sử dụng bởi hệ thống Android để gửi quyền, tài nguyên, tùy chọn, dịch vụ, chương trình phát sóng, kiểu, hiển thị hộp thoại và bố cục tăng cao. Và bạn cần các Contexttrường hợp khác nhau cho một số thứ riêng biệt (rõ ràng, bạn không thể hiển thị hộp thoại từ bối cảnh ứng dụng hoặc dịch vụ; bố cục được thổi phồng từ bối cảnh ứng dụng và hoạt động có thể khác nhau).


4

Ngữ cảnh là api cụ thể của Android cho mỗi Sandbox của ứng dụng ứng dụng cung cấp dữ liệu riêng tư của ứng dụng như tài nguyên, cơ sở dữ liệu, hồ sơ cá nhân, tùy chọn, cài đặt ...

Hầu hết các đặc quyền là giống nhau cho tất cả các hoạt động / dịch vụ / danh sách phát sóng của một ứng dụng.

Vì Ứng dụng, Hoạt động, Dịch vụ triển khai giao diện Ngữ cảnh, chúng có thể được sử dụng khi cuộc gọi api cần tham số Ngữ cảnh


4

Contextcó nghĩa là thành phần (hoặc ứng dụng) trong các khoảng thời gian khác nhau. Nếu tôi ăn quá nhiều thực phẩm trong khoảng từ 1 đến 2 giờ chiều thì bối cảnh của tôi thời đó được sử dụng để truy cập tất cả các phương thức (hoặc tài nguyên) mà tôi sử dụng trong thời gian đó. Nội dung là một thành phần (ứng dụng) cho thời gian cụ thể. Contextcủa các thành phần của ứng dụng liên tục thay đổi dựa trên vòng đời cơ bản của các thành phần hoặc ứng dụng. Chẳng hạn, bên trong onCreate () của một Activity,

getBaseContext()- cung cấp cho các contextcủa Activityđược thiết lập (tạo) của các nhà xây dựng hoạt động. getApplicationContext()- cung cấp cho các Contextthiết lập (được tạo) trong quá trình tạo ứng dụng.

Lưu ý: <application>giữ tất cả các thành phần Android.

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

    <service>  .. </service>

    <receiver> .. </receiver>

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

Điều đó có nghĩa là, khi bạn gọi getApplicationContext()từ bên trong bất kỳ thành phần nào, bạn đang gọi bối cảnh chung của toàn bộ ứng dụng.

Context tiếp tục được sửa đổi bởi hệ thống dựa trên vòng đời của các thành phần.


1

Hãy nghĩ về Bối cảnh như một hộp với các tài nguyên khác nhau: chuỗi, màu sắc và phông chữ. Nếu bạn cần một tài nguyên, bạn chuyển sang hộp này. Khi bạn xoay màn hình, hộp này thay đổi vì hướng thay đổi thành ngang.


0

 Contextcó nghĩa là hiện tại. Contextsử dụng để làm hoạt động cho màn hình hiện tại. Ví dụ.
  1. getApplicationContext ()
  2. getContext ()

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

0

Giải thích tuyệt vời! Để bổ sung cho tất cả những điều trên, tôi thấy cái này từ MindOrks rất hữu ích, thậm chí còn cho thấy một số trường hợp sử dụng cơ bản để khiến tâm trí của bạn hoạt động:

Hiểu ngữ cảnh trong ứng dụng Android


-7

Trong Java, chúng tôi nói từ khóa này đề cập đến trạng thái của đối tượng hiện tại của ứng dụng.
Tương tự như vậy, trong một sự thay thế chúng ta có Contexttrong Phát triển Android.

Điều này có thể được định nghĩa rõ ràng hoặc ngầm định,

Context con = this;

getApplicationContext();

getBaseContext();

getContext();

Có thể chỉ là đối tượng của hoạt động hiện tại tôi nghĩ. Tôi sử dụng nó như thể nó là cách này một vài lần.
Ohiovr

1
Có rất nhiều cách để có được bối cảnh. Gọi thischỉ hoạt động trong các hoạt động. Bối cảnh không phải là một thay thế cho "này" - bối cảnh được sử dụng để truy cập các tính năng của hệ thống, và nhiều hơn nữa. Bạn đang quá đơn giản hóa Bối cảnh và thiếu điểm chính với nó.
Zoe

-10

Thuộc tính này khai báo hoạt động nào bố cục này được liên kết với mặc định .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.