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"));
}
}
 
你们可能会发现,采用静态注册的做为内部类的广播接收者使用起来很不方便,由于是静态内部类,因此该类中若是想使用外部类的变量/方法,该变量/方法也得是静态的。
因此仍是强烈推荐你们使用动态方式注册。
相关文章
相关标签/搜索