Android中的每个应用程序都可以对自己感兴趣的广播进行注册,这样改程序就只会接收到自己所关心的广播内容,广播内容可能来自系统和其他应用程序。
广播接收器可以自由地对自己感兴趣的广播进行注册。注册广播的方式一般有两种,在代码中注册和在AndroidManifest.xml中注册,前者也叫动态注册,后者也叫静态注册。
创建一个广播接收器
创建一个广播接收器需要新建一个类,继承BroadcastReceiver,并重写父类的onReceive()方法
public class MyBroadCastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"接收到了广播",Toast.LENGTH_LONG).show();
}
}
广播接收器的注册
在代码中注册
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private Button mButtonSend;
private Button mButtonAlarm;
private Button mButtonCancelAlarm;
private IntentFilter mIntentFilter;
private MyBroadCastReceiver mMyReceiver;
private AlarmManager mAlarmManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mButtonSend= (Button) findViewById(R.id.button_send);
mButtonSend.setOnClickListener(this);
mButtonAlarm= (Button) findViewById(R.id.button_alarm);
mButtonAlarm.setOnClickListener(this);
mButtonCancelAlarm= (Button) findViewById(R.id.button_cancel_alarm);
mButtonCancelAlarm.setOnClickListener(this);
mIntentFilter=new IntentFilter();
mMyReceiver=new MyBroadCastReceiver();
mIntentFilter.addAction("com.broadcastreceiver");
registerReceiver(mMyReceiver,mIntentFilter);//在代码中注册广播接收器,也叫动态注册
mAlarmManager= (AlarmManager) getSystemService(ALARM_SERVICE);
Intent intent=new Intent();
intent.setAction("com.broadcastreceiver");
sendBroadcast(intent);
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(mMyReceiver);//当活动关闭时,要取消注册
}
动态注册的广播接收器一定都要取消注册才行
在Manifest中注册
<receiver android:name=".MyBroadCastReceiver">
<intent-filter>
<action android:name="com.broadcastreceiver"/>
</intent-filter>
</receiver>
利用广播写一个小闹钟的例子
首先还是要写一个继承自BrodcastReceiver类的一个广播接收类
package com.example.administrator.mybroadcast;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.content.IntentFilter;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private Button mButtonAlarm;
private Button mButtonCancelAlarm;
private IntentFilter mIntentFilter;
private MyBroadCastReceiver mMyReceiver;
private AlarmManager mAlarmManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mButtonAlarm= (Button) findViewById(R.id.button_alarm);
mButtonAlarm.setOnClickListener(this);
mButtonCancelAlarm= (Button) findViewById(R.id.button_cancel_alarm);
mButtonCancelAlarm.setOnClickListener(this);
mIntentFilter=new IntentFilter();
mMyReceiver=new MyBroadCastReceiver();
mIntentFilter.addAction("com.broadcastreceiver");
registerReceiver(mMyReceiver,mIntentFilter);//在代码中注册广播接收器,也叫动态注册
mAlarmManager= (AlarmManager) getSystemService(ALARM_SERVICE);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.button_alarm:
alarm();
break;
case R.id.button_cancel_alarm:
cancelAlarm();
break;
default:
break;
}
}
private void cancelAlarm() {
Intent intent=new Intent();
intent.setAction("com.broadcastreceiver");
PendingIntent pendingIntent=PendingIntent.getBroadcast(getApplicationContext(),121,intent,PendingIntent.FLAG_UPDATE_CURRENT);
mAlarmManager.cancel(pendingIntent);
}
private void alarm() {
Intent intent=new Intent();
intent.setAction("com.broadcastreceiver");
PendingIntent pendingIntent=PendingIntent.getBroadcast(getApplicationContext(),121,intent,PendingIntent.FLAG_UPDATE_CURRENT);
mAlarmManager.setRepeating(AlarmManager.RTC_WAKEUP,System.currentTimeMillis()+3000,4000,pendingIntent);
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(mMyReceiver);//当活动关闭时,要取消注册
}
}
接收来自系统的广播
在Manifest中添加action,需要监听什么就些什么,需要注意到的是有些是需要权限的。
//权限
<uses-permission android:name="android.permission.broadcast_package_removed"/>
<uses-permission android:name="ANDROID.PERMISSION.CHANGE_NETWORK_STATE"/>
//action
<receiver android:name=".MyBroadCastReceiver">
<intent-filter>
<action android:name="android.intent.action.PACKAGE_REMOVED"></action>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"></action>
</intent-filter>
</receiver>