Android廣播錯誤.MainActivity$MyReceiver; no empty constructor

廣播的定義,若是是內部類,必須爲靜態類.html

下面總結一下做爲內部類的廣播接收者在註冊的時候須要注意的地方
 
1.清單文件註冊廣播接收者時,廣播接收者的名字格式須要注意。由於是內部類,因此須要在內部類所在的類與內部類之間加上$符號:
 
<receiver android:name=".MainActivity$MyReciver">
<intent-filter>
<action android:name="com.qianfeng.1605"></action>
</intent-filter>
</receiver>


2.內部類在聲明時必定要寫成靜態內部類(class關鍵字前加上static)。不然會拋出相似這樣的異常:java

java.lang.RuntimeException: Unable to instantiate receiver com.example.brocastdemo.MainActivity$MyReceiver: 
java.lang.InstantiationException: 
      can't instantiate class com.example.brocastdemo.MainActivity$MyReceiver; no empty constructor 
 
 
3.靜態內部類裏面的控件也須要寫成static

static
TextView tv_name;

static TextView tv_password;
public static class MyReciver extends BroadcastReceiver{

@Override
public void onReceive(Context context, Intent intent) {

Toast.makeText(context,intent.getStringExtra("name"),Toast.LENGTH_SHORT).show();
Toast.makeText(context,intent.getStringExtra("password"),Toast.LENGTH_SHORT).show();
tv_name.setText(intent.getStringExtra("name"));
tv_password.setText(intent.getStringExtra("password"));
}
}
 
你們可能會發現,採用靜態註冊的做爲內部類的廣播接收者使用起來很不方便,由於是靜態內部類,因此該類中若是想使用外部類的變量/方法,該變量/方法也得是靜態的。
因此仍是強烈推薦你們使用動態方式註冊。
相關文章
相關標籤/搜索