[mobilesafe] 03_BROADCAST RECEIVER及提高广播接收者权限(优先级、先注册)

Android 4.0

提高广播接收者权限

BROADCAST RECEIVER广播接收者
1.接受广播的intent
 
2.可以在清单文件中注册和代码中注册
 
3.无序广播 异步,不可被终止 (假异步)
里面也是按照优先级别来先后广播的

4.有序广播  同步,可以被终止
如何提高广播接收者的权限
1、权限越高的广播接收者,优先得到广播

IntentFilter filter = new IntentFilter();
filter.addAction("android.provider.Telephony.SMS_RECEIVED");
filter.setPriority(Integer.MAX_VALUE);// 设置为最大优先级别
registerReceiver(mySmsReciver, filter);  
2、权限相同的广播接收者,谁先注册,就谁先得到广播(一般在重启广播接收者注册)
所以,可以在手机重启时,就注册广播接收者,而且是纯净的代码,速度最快

核心代码:(在手机重启的时候开启短信拦截)
1、手机重启广播接收者BootCompletedReceiver.java
package cn.zengfansheng.receiverreboot;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
/**
 * 手机重启广播接收者
 * @author hacket
 *
 */
public class BootCompletedReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        System.out.println("手机重启完毕~~~");
        // 开启短信监听的服务
        // Toast.makeText(context, "手机重启完毕~~~", 0).show();
        Intent smsIntent = new Intent(context, SmsReceiverServices.class);
        context.startService(smsIntent);
    }
}
2、短信拦截服务(里面注册了短信到来广播接收者)
package cn.zengfansheng.receiverreboot;

import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.IBinder;
import android.telephony.SmsMessage;

/**
 * 监听短信到来的服务
 * @author hacket
 */

public class SmsReceiverServices extends Service {

    private MySmsReciver mySmsReciver;

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();

        // 注册短信到来广播接收者

        mySmsReciver = new MySmsReciver();

        IntentFilter filter = new IntentFilter();
        filter.addAction("android.provider.Telephony.SMS_RECEIVED");
        filter.setPriority(Integer.MAX_VALUE);// 设置为最大优先级别
        registerReceiver(mySmsReciver, filter);
        System.out.println("注册短信监听~~~");
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        // 取消注册短信到来广播接收者
        if (mySmsReciver != null) {
            unregisterReceiver(mySmsReciver);
            mySmsReciver = null;
            System.out.println("取消注册短信监听~~~");
        }
    }
   
    /**
     * 短信到来的广播接收者
     * @author hacket
     */

    private class MySmsReciver extends BroadcastReceiver{

        @Override
        public void onReceive(Context context, Intent intent) {

            //MyUncaughtExceptionHandler handler = new MyUncaughtExceptionHandler();
            //Thread.setDefaultUncaughtExceptionHandler(handler);

            Object[] objects = (Object[]) intent.getExtras().get("pdus");
            for (Object obj : objects) {

                SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) obj);

                String messageAddress = smsMessage.getOriginatingAddress();
                String messageBody = smsMessage.getMessageBody();
                System.out.println("短信地址:" + messageAddress);
                System.out.println("短信内容:" + messageBody);

                abortBroadcast();// 停止广播
            }
        }
    }
}