android 公開靜態內部類BroadcastReceiver
第一次寫部落格,寫得不好盼大家指正.
當想實現廣播接收功能時,因java 是單繼承,所以一般一個類都會extends Activity,所以會想到內部類來extends BroadcastReceiver,這中間可能會出現兩種異常
1:java.lang.RuntimeException: Unable to instantiate
receiver com.example.progressbar.ProgressBarActivity$mBroadcastReceiver:
java.lang.InstantiationException: com.example.progressbar.ProgressBarActivity$mBroadcastReceiver
這是因為內部類需要寫成靜態,即static
static class mBroadcastReceiver extends BroadcastReceiver {
//必須為靜態公開的(public static)
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
}
}
2: java.lang.RuntimeException: Unable to instantiate
receiver com.example.progressbar.ProgressBarActivity$mBroadcastReceiver:
java.lang.IllegalAccessException: access to class not allowed
這是因為需要將此類寫成public ,若沒寫預設為protected的,則會出現access to class not allowed
正確的為:
public static class mBroadcastReceiver extends BroadcastReceiver {
//必須為靜態公開的(public static)
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
}
}
內部類需要加上$
<receiver android:name="com.example.progressbar.ProgressBarActivity$mBroadcastReceiver" >
<intent-filter>
<action android:name="com.example.progressbar.ProgressBarActivity.mBroadcastReceiver" />
</intent-filter>
</receiver>
當然還有另一種方法即實現其一個執行個體
private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
}
};
然後就是註冊和登出
在onCreate() 或onResume()中調用registerBoradcastReceiver()
public void registerBoradcastReceiver() {
IntentFilter myIntentFilter = new IntentFilter();
myIntentFilter.addAction(ACTION_NAME);
// 註冊廣播
registerReceiver(mBroadcastReceiver, myIntentFilter);
}
@Override
public void onDestroy() {
super.onDestroy();
unregisterReceiver(mBroadcastReceiver);
}