上一节说到广播的原理、流程等。那在应用中,该怎么去用。系统的广播可以检测到电量变化、网络变化、用户的拨打电话、用户接入电话、检测接收短信。。。
那么我们就开始以案例开始,深入广播的使用
实例:
==一==、检测手机电量
只能是动态注册在Activity中的OnCreate()中注册
receiverPower = new MyReceiverPower();
registerReceiver(receiverPower,new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
public class MyReceiverPower extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if(intent.getAction().equals(Intent.ACTION_BATTERY_CHANGED)){
//1、得到当前系统电量
int level=intent.getIntExtra("level",100);
//2、得到系统总电量
int total=intent.getIntExtra("scale",100);
//3、计算电量比
int currLevel=level*100/total;
Toast.makeText(context, "当前电量"+currLevel, Toast.LENGTH_SHORT).show();
}
}
}
==二==、检测手机网络状态
涉及到网络权限问题,需要在AndroidManifest.xml中添加
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
动态注册
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
receiverPower = new MyReceiverPower();
registerReceiver(receiverPower,new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
}
在广播接收者中
public class MyReceiverPower extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = manager.getActiveNetworkInfo();
if (info != null) {
if (info.isConnected()) {
Toast.makeText(context, "网络连接成功", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(context, "网络连接异常!!!", Toast.LENGTH_LONG).show();
}
} else {
Toast.makeText(context, "网络连接异常!!!", Toast.LENGTH_LONG).show();
}
}
}}
==三==、检测手机来电
一样涉及权限问题
<!--添加检测用户拨打电话的权限-->
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>
public class MyReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle = intent.getExtras();
//获取用户拨打的电话号码
String number = bundle.getString(Intent.EXTRA_PHONE_NUMBER);
Log.e("MyReceiver ", "当前拨打的电话号码为: " + number);
}
}
==四==、检测手机来电状态
添加权限:
<!--添加获取拨入电话的权限-->
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
public class MyReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
//1, 获取电话管理器对象
TelephonyManager manager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
//2, 获得电话号码
Bundle bundle = intent.getExtras();
String number = bundle.getString(TelephonyManager.EXTRA_INCOMING_NUMBER);
//3, 获取电话的状态
int state= manager.getCallState();
switch (state)
{
case TelephonyManager.CALL_STATE_RINGING://响铃 1
Log.e("MyReceiver", "响铃 === " + number);
break;
case TelephonyManager.CALL_STATE_OFFHOOK://接听 2
Log.e("MyReceiver", "=====接听====");
break;
case TelephonyManager.CALL_STATE_IDLE://挂断 0
Log.e("MyReceiver", "=====挂断====");
break;
}
}
}
==五==、手机短信监听
<!--添加检测短信的权限-->
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
public class MyReceiver extends BroadcastReceiver{
private String TAG = "MyReceiver";
@Override
public void onReceive(Context context, Intent intent) {
Object[] pdus = (Object[]) intent.getExtras().get("pdus");
for (Object pdu:pdus)
{
SmsMessage message = SmsMessage.createFromPdu((byte[]) pdu);
//获取短信的发送者
String send = message.getDisplayOriginatingAddress();
//获取短信的内容
String body = message.getMessageBody();
//获取短信的接收时间
long date = message.getTimestampMillis();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String time = format.format(date);
Log.e(TAG, "短信来自于: " + send);
Log.e(TAG, "短信内容为: "+ body );
Log.e(TAG, "接收的时间: " + time );
}
}
}