2012-04-24 38 views
38

Tôi có lớp bên trong như máy thu phát sóng:BroadcastReceiver: không thể khởi tạo lớp; không có constructor rỗng

public class ManualBacklightReceiver extends BroadcastReceiver { 

    public static final String ACTION_MANUAL_BACKLIGHT = "com.android.systemui.statusbar.powerwidget.MANUAL_BACKLIGHT"; 

    public ManualBacklightReceiver() { 
    } 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Log.d("ManualBacklightReceiver", intent.getAction()); 
    } 

}; 

AndroidManifest:

<receiver android:name=".statusbar.powerwidget.PowerWidgetGrid$ManualBacklightReceiver"> 
     <intent-filter> 
      <action android:name="com.android.systemui.statusbar.powerwidget.MANUAL_BACKLIGHT"/> 
     </intent-filter>    
    </receiver> 

Và khi tôi gửi ý với mã này: ý Ý định = Ý định mới();

intent.setAction("com.android.systemui.statusbar.powerwidget.MANUAL_BACKLIGHT"); 
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
mContext.sendBroadcast(intent); 

tôi nhận được những trường hợp ngoại lệ:

java.lang.RuntimeException: Unable to instantiate receiver com.android.systemui.statusbar.powerwidget.PowerWidgetGrid$ManualBacklightReceiver: 
java.lang.InstantiationException: can't instantiate class com.android.systemui.statusbar.powerwidget.PowerWidgetGrid$ManualBacklightReceiver; no empty constructor 
Caused by: java.lang.InstantiationException: can't instantiate class com.android.systemui.statusbar.powerwidget.PowerWidgetGrid$ManualBacklightReceiver; no empty constructor 

Nhưng tôi có một constructor rỗng! Tại sao nó không hoạt động?

+0

Bạn đã thử gọi super(); bên trong constructor của bạn? – Bobbake4

+0

Lỗi tương tự. – arts777

Trả lời

118

Bạn cần khai báo lớp bên trong của mình là tĩnh. Nếu không, một lớp bên trong được liên kết với một cá thể của lớp ngoài của bạn.

Khám phá Java Nested Classes tutorial để biết chi tiết. Dưới đây là một đoạn trích:

Một thể hiện của InnerClass có thể chỉ tồn tại trong một thể hiện của OuterClass và có quyền truy cập trực tiếp đến các phương pháp và lĩnh vực dụ kèm theo của nó. Hình tiếp theo minh họa ý tưởng này.

và:

Một lớp lồng nhau là thành viên của lớp kèm theo của nó. Các lớp học lồng nhau không tĩnh (lớp bên trong) có quyền truy cập vào các thành viên khác của lớp kèm theo , ngay cả khi chúng được khai báo riêng tư. Các lớp lồng nhau tĩnh không có quyền truy cập vào các thành viên khác của lớp kèm theo. Là thành viên của OuterClass, một lớp lồng nhau có thể được tuyên bố riêng tư, công khai, được bảo vệ hoặc gói riêng tư. (Nhớ lại rằng các lớp bên ngoài chỉ có thể là tuyên bố công khai hoặc gói riêng tư.)

+0

Cảm ơn, đã làm việc cho tôi. Nhưng tôi không thể truy cập vào các trường của thể hiện OuterClass từ lớp lồng nhau? Tôi nên làm gì, nếu lớp bên ngoài là quan điểm, và tôi cần sửa đổi nó khi nhận được ý định? – arts777

+7

@RankoR: "Nhưng tôi không thể truy cập các trường của thể hiện OuterClass từ lớp lồng nhau?" -- chính xác. "Tôi nên làm gì, nếu lớp bên ngoài là quan điểm, và tôi cần phải sửa đổi nó khi nhận được ý định?" - đăng ký 'BroadcastReceiver' của bạn thông qua' registerReceiver() 'từ' Hoạt động' của bạn, thay vì thông qua tệp kê khai. – CommonsWare

+0

Tôi đã cố gắng để làm điều đó theo cách này, nhưng nó không hoạt động, phương pháp onReceive không được gọi. Người nhận đã được tạo chính xác. Tôi đang làm điều đó trong gói SystemUI từ nguồn Android. – arts777

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