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>