BroadcastReceiver是用于接收广播通知的组件,例如按下拍照键、电池电量低、安装新应用等,还有普通应用程序,例如启动特定的线程、文件下载完毕等。
BroadcastReceiver类是所有广播接收器的抽象基类。当消息到达时,接收器调用onReceive()方法,在该方法结束后,BroadcastReceiver实例失活。
onReceive()方法是实现BroadcastReceiver类时需要重写的方法。
用于接收广播有以下两类:
- 普通广播:使用Context.sendBroadcast()方法发送,异步,以未定义的顺序运行。
- 有序广播:使用Context.sendOrderedBroadcast()方法发送,每次只发送给一个接受者。有序接收者的顺序由匹配的intent-filter的android:priority属性控制,具有相同优先级的接收者运行顺序任意。
当接收到短信时给出提示信息的功能
public class SMSReceive extends BroadcastReceiver {
private static final String action = "android.provider.Telephony.SMS_RECEIVED";
@Override
public void onReceive(Context context, Intent intent) {
if(intent.getAction().equals(action)){
Toast.makeText(context, context.getResources().getString(R.string.message), Toast.LENGTH_LONG).show();
}
}
}
编写AndroidMainfest.xml文件,注册Activity及BroadcastReceiver,如下:
<activity
android:name=".SMSActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name=".SMSReceive">
<intent-filter >
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
编写BatteryReceiver类,继承自BroadcastReceiver类,重写onReceive()方法
public class BatteryReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
String action = intent.getAction();
if (action.equals(Intent.ACTION_BATTERY_CHANGED)) {
int level = intent.getIntExtra("level", 0);
int scale = intent.getIntExtra("scale", 100);
Toast.makeText(context, "剩余电量:"+(level *100 / scale)+"%", Toast.LENGTH_LONG).show();
}
}
}
编写BatteryActivity类,如下:
public class BatteryActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button button = (Button)findViewById(R.id.button1);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
registerReceiver(new BatteryReceiver() , new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
}
});
}
}
效果如下:
另一个例子,注册通知、发送通知、取消注册通知,界面如下:
自定义MyBroadcastReceiver类,如下,当接收到通知时,输出通知的信息。
package com.example.usingbroadcast;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class MyBroadcastReceiver extends BroadcastReceiver {
public static final String ACTION = "com.example.usingbroadcast.intent.action.MYBC";
@Override
public void onReceive(Context arg0, Intent intent) {
System.out.println(intent.getStringExtra("text"));
}
}
MainActivity如下:
package com.example.usingbroadcast;
import android.app.Activity;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
public class MainActivity extends Activity {
private Button btnSendBroadcast, btnRegisterBCR, btnUnregisterBRC;
private final MyBroadcastReceiver myBC = new MyBroadcastReceiver();//Broadcast
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnSendBroadcast = (Button) findViewById(R.id.btnSendBroadcastReceiver);
btnSendBroadcast.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
//Intent intent = new Intent(MainActivity.this, MyBroadcastReceiver.class);
Intent intent = new Intent(MyBroadcastReceiver.ACTION);
intent.putExtra("text", "Hello Broadcast");
sendBroadcast(intent);//发送广播
}
});
btnRegisterBCR = (Button) findViewById(R.id.btnRegisterBroadcast);
btnRegisterBCR.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
registerReceiver(myBC, new IntentFilter(MyBroadcastReceiver.ACTION));//注册广播
}
});
btnUnregisterBRC = (Button) findViewById(R.id.btnUnregisterBroadcast);
btnUnregisterBRC.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
unregisterReceiver(myBC);//取消注册广播
}
});
}
}
点击按钮,查看输出结果。