这一节,来复习一下Android中的广播BoadcastReceiver,首先得知道它是什么及作用,用于接收系统或应用发送的广播,实现组件之间的跨进程通讯(允许一对多).
然后它的注册方式:(1)静态注册,在清单文件中(2)动态注册,在java代码中实现。
应用如下:
动态广播常见用法(1):一个Activity类发广播,另一个单独BroadcastReceiver广播类收广播。静态广播就不细说,一般容易实现。
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
//动态注册MyReceiver receiver = new MyReceiver();
IntentFilter intentFilter = new IntentFilter(MyReceiver.action); registerReceiver(receiver,intentFilter);findViewById(R.id.btnsend).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("TAG","onClick");
//静态注册
//Intent intent = new Intent(MyStaticReceiver.ACTION);//
sendBroadcast(intent);
//动态注册
Intent i= new Intent(MyReceiver.action);
//注意广播可以传小数据量,大数据量不宜用广播
i.putExtra("AA","play");
sendBroadcast(i);
}
});
}
// 取消广播
@Override protected void onDestroy() { super.onDestroy(); Log.d("TAG","onDestroy-SecondActivity"); unregisterReceiver(receiver); }}
MyReceiver类:
public class MyReceiver extends BroadcastReceiver {public static final String action = "startimes.com.receiverdemo2.intent.action.receiver";
public MyReceiver() { } @Override public void onReceive(Context context, Intent intent) { Log.d("TAG","onReceive"); String aa = intent.getStringExtra("AA"); Log.d("TAG"," aa= "+aa); } }
静态广播在AndroidManifest注册:
常见用法(2)在两个Activity之间发送广播,这个用的比较多,也容易出问题,比如在X1Activity发广播,同时携带一点少量数据,在X2Activity收广播,常常会发现收不到数据。可能的原因如X2Activity还没有运行起来,应用代码如下:<!--<receiver--> <!--android:name=".MyReceiver"--> <!--android:enabled="true"--> <!--android:exported="true" />-->
public class MainActivity extends Activity { private Button btnSend; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btnSend = (Button) findViewById(R.id.btn_send); btnSend.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(MainActivity.this, SecondActivity.class); startActivity(intent); } }); } @Override protected void onResume() { super.onResume(); Log.d("TAG","onResume"); } @Override protected void onStart() { super.onStart(); Log.d("TAG","onStart"); } @Override protected void onPause() { super.onPause(); Log.d("TAG","onPause"); Intent intent = new Intent(SecondActivity.action); intent.putExtra("AA","understand the broadcastreceiver"); sendBroadcast(intent); } @Override protected void onStop() { super.onStop(); Log.d("TAG","onStop"); Intent intent = new Intent(SecondActivity.action); intent.putExtra("AA","understand the broadcastreceiver"); sendBroadcast(intent); } @Override protected void onRestart() { super.onRestart(); Log.d("TAG","onRestart"); Intent intent = new Intent(SecondActivity.action); intent.putExtra("AA","understand the broadcastreceiver"); sendBroadcast(intent); } @Override protected void onDestroy() { super.onDestroy(); Log.d("TAG","onDestroy"); } }SecondActivity:
public class SecondActivity extends Activity { public static final String action = "startimes.com.receiverdemo2.intent.action.dynamicreceiver"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); //动态注册 IntentFilter intentFilter = new IntentFilter(SecondActivity.action); registerReceiver(this.receiver,intentFilter); } BroadcastReceiver receiver=new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Log.d("TAG","onReceive"); String aa = intent.getStringExtra("AA"); Log.d("TAG"," aa= "+aa); } }; @Override protected void onStart() { super.onStart(); Log.d("TAG","onStart-SecondActivity"); } @Override protected void onResume() { super.onResume(); Log.d("TAG","onResume-SecondActivity"); } @Override protected void onPause() { super.onPause(); Log.d("TAG","onPause-SecondActivity"); } @Override protected void onStop() { super.onStop(); Log.d("TAG","onStop-SecondActivity"); } @Override protected void onDestroy() { super.onDestroy(); Log.d("TAG","onDestroy-SecondActivity"); unregisterReceiver(receiver); } }
布局文件就一个按钮控件,代码就不贴了。
运行结果如下:
这一节就先说这些吧。