2012-02-25 28 views
20

Trong Android, có cách nào để có được bối cảnh ứng dụng của một cách tĩnh? Ví dụ để lấy nó từ một chuỗi nền.Làm thế nào để có được bối cảnh từ bất cứ đâu?

Cảm ơn

+1

Nói chung bạn nên vượt qua một tài liệu tham khảo Bối cảnh qua một đối số nếu bạn gọi một phương thức cần nó * (nhưng không lưu trữ tham chiếu, nó có thể dẫn đến rò rỉ bộ nhớ) *. Bạn cũng có thể sử dụng ứng dụng đối tượng cho điều này trong một số trường hợp, xem [câu hỏi này] (http://stackoverflow.com/questions/987072/using-application-context-everywhere). Nhưng giữ giới hạn như mô tả trong câu trả lời trong tâm trí. –

Trả lời

50

Cách đơn giản nhất (và chính xác) là:

Định nghĩa một lớp mới

public class MyApp extends Application { 
    private static MyApp instance; 

    public static MyApp getInstance() { 
     return instance; 
    } 

    public static Context getContext(){ 
     return instance; 
     // or return instance.getApplicationContext(); 
    } 

    @Override 
    public void onCreate() { 
     instance = this; 
     super.onCreate(); 
    } 
} 

Sau đó, trong biểu hiện của bạn bạn cần phải thêm lớp này đến "Tên" thực tế tại tab "Ứng dụng". Hoặc chỉnh sửa xml và đưa

<application 
    android:name="com.example.app.MyApp" 
    android:icon="@drawable/icon" 
    android:label="@string/app_name" 
    ....... 
    <activity 
     ...... 

và sau đó từ bất cứ nơi nào bạn có thể gọi

MyApp.getContext(); 

Hy vọng nó giúp

+2

Điều này sẽ hoạt động nhưng Chỉ cần cẩn thận khi sử dụng bất kỳ singleton nào mà bạn không lạm dụng nó.Đọc câu trả lời cho [câu hỏi này] (http://stackoverflow.com/questions/7298731/when-to-call-activity- context-or-application-context/7298955 # 7298955) giải thích lý do tại sao ApplicationContext hiếm khi (mặc dù đôi khi) Context thích hợp để sử dụng. Cách tốt nhất: Trừ khi bạn chỉ đơn giản vạch trần một phương thức công khai có một bối cảnh như một đối số bên trong các lớp của bạn yêu cầu bối cảnh (và chuyển nó từ hoạt động của bạn, vv), đây là cách để làm điều đó. Exp: void công abc (Ngữ cảnh c, int a); và gọi nó từ bất kỳ hoạt động nào. –

12

Về cơ bản bạn có 2 loại Context - các Hoạt động ContextApplication Context .

Không cần thiết chỉ sử dụng một Ngữ cảnh cho mọi thứ. Có vấn đề nếu bạn sử dụng một Context trong mọi trường hợp bạn cần Context. Tốt nhất là hãy làm theo một cái gì đó như thế này - sử dụng Bối cảnh hoạt động bên trong Hoạt động và Bối cảnh ứng dụng khi chuyển ngữ cảnh vượt quá phạm vi hoạt động, sẽ giúp bạn tránh memory leaks.

Nếu bạn đọc bài viết này, bạn có thể thấy sự khác biệt giữa hai Ngữ cảnh.

Các Application bối cảnh sẽ sống lâu như ứng dụng của bạn là sống và không phụ thuộc vào chu kỳ hoạt động cuộc sống. Nếu bạn có kế hoạch giữ các đối tượng tồn tại lâu dài cần một ngữ cảnh, hãy nhớ đối tượng ứng dụng .

Thay vào đó Hoạt động Context có liên quan đến hoạt động và có thể bị phá hủy nhiều lần như hoạt động bị phá hủy - thay đổi hướng màn hình, nút back, vv

+2

Đây là câu trả lời hay. – ctn

Các vấn đề liên quan