1.动态注册广播接受者
就是在java中指定IntentFilter,然后添加不同的Action即可,想监听什么广播就写什么Action。要注意的是
动态注册广播,一定要调用unregisterReceiver()。
2.静态注册广播接受者
动态注册需要程序启动后才能接收广播,静态广播就弥补了这个短板,在AndroidManifest中定制就可以让程序在未启动的情况下接收到广播了。
示例代码:
MyReceiver .java
public class MyReceiver extends BroadcastReceiver{
//自己定义的Action
private final String ACTION_BOOT = "com.example.broadcasttest.MY_BROADCAST";
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
if(ACTION_BOOT.equals(intent.getAction())){
Toast.makeText(context,"收到广播啦!",Toast.LENGTH_SHORT).show();
}
}
}
动态注册:
MainActivity .java
public class MainActivity extends Activity {
private MyReceiver myReceiver;
private Button btn_start;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn_start=(Button)findViewById(R.id.btn_start);
btn_start.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
sendBroadcast(new Intent("com.example.broadcasttest.MY_BROADCAST"));
}
});
myReceiver=new MyReceiver();
IntentFilter itFilter=new IntentFilter();
//自己定义的广播,也可以监听系统广播,如开机完毕,网络变化等
itFilter.addAction("com.example.broadcasttest.MY_BROADCAST");
registerReceiver(myReceiver, itFilter);
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
unregisterReceiver(myReceiver);
}
}
静态注册:
manifest文件
<receiver android:name=".MyReceiver" >
<intent-filter>
<action android:name="com.example.broadcasttest.MY_BROADCAST" />
</intent-filter>
</receiver>
MainActivity.java
public class MainActivity extends Activity {
private MyReceiver myReceiver;
private Button btn_start;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn_start=(Button)findViewById(R.id.btn_start);
btn_start.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
sendBroadcast(new Intent("com.example.broadcasttest.MY_BROADCAST"));
}
});
}
}
注意事项:
不要在广播里添加过多逻辑或者进行任何耗时操作,因为在广播中是不允许开辟线程的, 当onReceiver( )方法运行较长时间(超过10秒)还没有结束的话,那么程序会报错(ANR), 广播更多的时候扮演的是一个打开其他组件的角色,比如启动Service,Notification提示, Activity等!