最近需要实现广播消息,发现有几点注意事项:(分为静态注册,动态注册,系统广播,非系统广播)
1,静态注册,为常驻广播,当界面关闭后广播依然有效
1)如果是系统广播,例如监测网络状况广播(android.net.conn.CONNECTIVITY_CHANGE)
静态注册,代码非常简单:
manifest.xml如下
<receiver android:name=".MyBroadcastReceiver" >
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
代码:
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.v(TAG, "onReceive");
Toast.makeText(context, "网络连接....", Toast.LENGTH_LONG).show();
}
}
注意事项:
MyBroadcastReceiver代码中不能重写非默认构造函数(默认可以),否则会crash错误,例如:
public class MyBroadcastReceiver extends BroadcastReceiver {
String TAG = "MyBroadcastReceiver";
Context mContext;
public MyBroadcastReceiver(Context context) {
mContext = context;
}
@Override
public void onReceive(Context context, Intent intent) {
Log.v(TAG, "onReceive");
Toast.makeText(context, "网络连接....", Toast.LENGTH_LONG).show();
}
}
不能主动发送广播,否则crash,例如:
Intent intent = new Intent("android.net.conn.CONNECTIVITY_CHANGE");
sendBroadcast(intent);
2)非系统广播,需要主动发送广播消息:
<receiver android:name=".MyBroadcastReceiver" >
<intent-filter>
<action android:name="com.example.broadcastreceiver.test" />
</intent-filter>
</receiver>
Intent intent = new Intent("com.example.broadcastreceiver.test");
sendBroadcast(intent);
2,动态注册,为非常驻广播,一般在onResume中注册,在onStop中反注册。
1)当为系统广播时,例如监测网络状况广播(android.net.conn.CONNECTIVITY_CHANGE):
需要在代码中注册:
public class BroadcastReceiverActivity extends Activity {
Button mButton = null;
MyBroadcastReceiver mMybroadcastReceiver = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.broadcast_receiver_activity);
mMybroadcastReceiver = new MyBroadcastReceiver();
mButton = (Button) this.findViewById(R.id.button);
mButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
}
});
}
@Override
protected void onResume() {
IntentFilter filter = new IntentFilter();
filter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
registerReceiver(mMybroadcastReceiver, filter);
super.onResume();
}
@Override
protected void onStop() {
unregisterReceiver(mMybroadcastReceiver);
super.onStop();
}
}
public class MyBroadcastReceiver extends BroadcastReceiver {
String TAG = "MyBroadcastReceiver";
@Override
public void onReceive(Context context, Intent intent) {
Log.v(TAG, "onReceive");
Toast.makeText(context, "网络连接....", Toast.LENGTH_LONG).show();
}
}
注意事项,与静态注册不同,可以在MyBroadcastReceiver中实现非默认构造函数。同样不能主动发送广播,否则crash。
2)非系统广播消息,与系统广播一样,需要注册,但消息发送需要主动sendBroadcast。代码如下
public class BroadcastReceiverActivity extends Activity {
Button mButton = null;
MyBroadcastReceiver mMybroadcastReceiver = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.broadcast_receiver_activity);
mMybroadcastReceiver = new MyBroadcastReceiver();
mButton = (Button) this.findViewById(R.id.button);
mButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("com.example.broadcastreceiver.test");
sendBroadcast(intent);
}
});
}
@Override
protected void onResume() {
IntentFilter filter = new IntentFilter();
filter.addAction("com.example.broadcastreceiver.test");
registerReceiver(mMybroadcastReceiver, filter);
super.onResume();
}
@Override
protected void onStop() {
unregisterReceiver(mMybroadcastReceiver);
super.onStop();
}
}
其它,以后在补充。。。