接收系统广播

来源:互联网 发布:手机淘宝密码修改 编辑:程序博客网 时间:2024/05/20 02:29

1.接受短消息的BroadcastReceiver

public class ShortMessageReceiver extends BroadcastReceiver {    public static final String TAG="ShortMessageReceiver";    @Override    public void onReceive(Context context, Intent intent) {        // TODO: This method is called when the BroadcastReceiver is receiving        // an Intent broadcast.        Bundle bundle = intent.getExtras();        if (bundle != null)        {            Set<String> keys = bundle.keySet();            //查看收到的广播中包含哪些数据类型            for (String key : keys)            {                Log.d("key", key);            }            //获取收到的短信数据,所有的短信数据都需要通过一个名字为pdus的key获取            Object[] objArray = (Object[]) bundle.get("pdus");            //定义封装短信内容的SmsMessage对象数组            SmsMessage[] messages = new SmsMessage[objArray.length];            for (int i = 0; i < objArray.length; i++)            {                //将短信转换成SmsMessage对象                messages[i] = SmsMessage.createFromPdu((byte[]) objArray[i]);                String s = "手机号:" + messages[i].getOriginatingAddress() + "\n";                s += "短信内容:" + messages[i].getDisplayMessageBody();                Toast.makeText(context, s, Toast.LENGTH_LONG).show();            }        }    }}
2.在AndroidManifest.xml中注册

 <receiver            android:name=".ShortMessageReceiver"            android:enabled="true"            android:permission="android.permission.RECEIVE_SMS" >            <intent-filter>                <action android:name="android.provider.Telephony.SMS_RECEIVED" />            </intent-filter> </receiver> 
3.在AndroidManifest.xml申请权限

<uses-permission android:name="android.permission.RECEIVE_MMS" />
4.其他Receiver

(1)接听电话

public class InCallReceiver extends BroadcastReceiver {    public InCallReceiver() {    }    @Override    public void onReceive(Context context, Intent intent) {        // TODO: This method is called when the BroadcastReceiver is receiving        // an Intent broadcast.        Toast.makeText(context,"接收到广播",Toast.LENGTH_SHORT).show();        TelephonyManager manager=(TelephonyManager)context.getSystemService(Service.TELEPHONY_SERVICE);        switch (manager.getCallState()){            case TelephonyManager.CALL_STATE_RINGING:                String number=intent.getStringExtra("incoming_number");                Toast.makeText(context,"来电:"+number,Toast.LENGTH_SHORT).show();                break;            case TelephonyManager.CALL_STATE_OFFHOOK:                Toast.makeText(context,"offhook",Toast.LENGTH_SHORT).show();                break;            case TelephonyManager.CALL_STATE_IDLE:                Toast.makeText(context,"挂断电话",Toast.LENGTH_SHORT).show();                break;            default:                break;        }    }}

(2)拨出电话

public class OutCallReceiver extends BroadcastReceiver {    public OutCallReceiver() {    }    @Override    public void onReceive(Context context, Intent intent) {        String number=intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);        Toast.makeText(context,"去电号码:"+number,Toast.LENGTH_SHORT).show();      }}
(3)屏幕点亮和熄灭

public class ScreenOnOffReceiver extends BroadcastReceiver {    public ScreenOnOffReceiver() {    }    @Override    public void onReceive(Context context, Intent intent) {        // TODO: This method is called when the BroadcastReceiver is receiving        // an Intent broadcast.        if (Intent.ACTION_SCREEN_ON.equals(intent.getAction())) {            Toast.makeText(context, "Screen On", Toast.LENGTH_SHORT).show();        }else if (Intent.ACTION_SCREEN_OFF.equals(intent.getAction())){            Toast.makeText(context,"Screen Off",Toast.LENGTH_SHORT).show();        }      }} 

(4)开机启动

public class StartUpReceiver extends BroadcastReceiver {    public StartUpReceiver() {    }    @Override    public void onReceive(Context context, Intent intent) {        Intent intent1=new Intent(context,MainActivity.class);        intent1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);        context.startActivity(intent1);    }}

(5)电池电量改变

private BroadcastReceiver batteryChangedReceiver=new BroadcastReceiver() {        @Override        public void onReceive(Context context, Intent intent) {            if (Intent.ACTION_BATTERY_CHANGED.equals(intent.getAction())){                int level=intent.getIntExtra("level",0);                int scale=intent.getIntExtra("scale",100);                textView.setText("当前电量:"+(level*100/scale)+"%");            }        }    };


在AndroidManifest.xml中注册的代码

        <receiver            android:name=".OutCallReceiver"            android:enabled="true"            android:exported="true" >            <intent-filter>                <action android:name="android.intent.action.NEW_OUTGOING_CALL" />            </intent-filter>        </receiver>        <receiver            android:name=".StartUpReceiver"            android:enabled="true"            android:exported="true" >            <intent-filter android:priority="999" >                <action android:name="android.intent.action.BOOT_COMPLETED" />            </intent-filter> </receiver>       <receiver            android:name=".InCallReceiver"            android:enabled="true" >            <intent-filter>                <action android:name="android.intent.action.PHONE.STATE" />            </intent-filter>        </receiver>

需在在Java代码中注册

        //收到屏幕点亮和熄灭的BroadcastReceiver        IntentFilter filter1=new IntentFilter(Intent.ACTION_SCREEN_ON);        filter1.addAction(Intent.ACTION_SCREEN_OFF);        screenOnOffReceiver=new ScreenOnOffReceiver();        registerReceiver(screenOnOffReceiver,filter1);<pre name="code" class="java">       //收到电池电量改变的BroadcastReceiver        registerReceiver(batteryChangedReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));

需申请的权限

 <uses-permission android:name="android.permission.READ_PHONE_STATE" />    <uses-permission android:name="android.permission.CALL_PHONE" />    <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />    <uses-permission android:name="android.permission.BATTERY_STATS" />
5.动态注册的BroadcastReceiver需要在onDestory()中解除
        unregisterReceiver(shortMessageReceiver);        unregisterReceiver(screenOnOffReceiver);        unregisterReceiver(batteryChangedReceiver);        unregisterReceiver(inCallReceiver);


0 0