BroadcastReceiver(二)

四、接收系统广播:

1 短信拦截

public class ShortMessageReceiver extends BroadcastReceiver{

  

   @Override

   public void onReceive(Contextcontext, Intent intent) {

     // TODO Auto-generated method stub

     System.out.println("receiver message");

    

     //接受Intent对象当中的数据

     Bundlebundle = intent.getExtras();

     if(bundle !=null)

     {

        //在Bundle对象当中有一个属性名为pdus,这个属性的值是一个Object数组

        Object[]myOBJpdus = (Object[]) bundle.get("pdus");

        //创建一个SmsMessage类型的数组

         SmsMessage[] messages = newSmsMessage[myOBJpdus.length]; 

         System.out.println(messages.length);

         for (int i = 0;i<myOBJpdus.length; i++)

         { 

            //使用Object数组当中的对象创建SmsMessage对象

            messages[i] = SmsMessage.createFromPdu((byte[])myOBJpdus[i]); 

            //获得放送短信的电话号码

            String str = "手机号:" + messages[i].getOriginatingAddress() +"\n";

            //获取短信的内容

            str += messages[i].getDisplayMessageBody();

            Toast.makeText(context, str, Toast.LENGTH_LONG);

         }

     }

   }

}

注册广播接收器:

<receiverandroid:name="ShortMessageReceiver">

        <intent-filter>

          <actionandroid:name="android.provider.Telephony.SMS_RECEIVED"/>

        </intent-filter>

     </receiver>

添加接收短信的权限:

<uses-permission android:name=android.permission.RECEIVE_SMS/>

 

2 来去电拦截

来去电的广播动作如下:

来电:android.intent.action.PHONE_STATE

去电:android.intent.action.NEW_OUTGOING_CALL

来电可分解为3个状态:未接电话时的响铃、接听电话和挂断电话

接收来电广播的接收器代码如下:

public class InCallReceiver extends BroadcastReceiver

{

   private static Object obj;

   //显示永不关闭的Toast信息框

   public static void showToast(Contextcontext, String msg)

   {

     Toasttoast = Toast.makeText(context, msg, Toast.LENGTH_SHORT);

     toast.setGravity(Gravity.TOP | Gravity.CENTER_HORIZONTAL, 0, 0);

     try

     {

        Fieldfield = toast.getClass().getDeclaredField("mTN");

        field.setAccessible(true);

        obj = field.get(toast);

        Methodmethod = obj.getClass().getDeclaredMethod("show",null);

        method.invoke(obj,null);

     }

     catch (Exception e)

     {

     }

 

   }

   //关闭Toast信息框

   public static void closeToast()

   {

     if (obj !=null)

     {

        try

        {

 

          Methodmethod = obj.getClass().getDeclaredMethod("hide",null);

          method.invoke(obj,null);

        }

        catch (Exception e)

        {

        }

 

     }

   }

 

   @Override

   public void onReceive(final Context context,final Intent intent)

   {

 

     TelephonyManager tm = (TelephonyManager) context

          .getSystemService(Service.TELEPHONY_SERVICE);

 

     switch (tm.getCallState())

     {

        case TelephonyManager.CALL_STATE_RINGING:

          //获得来电号码

          String incomingNumber = intent

               .getStringExtra("incoming_number");

          showToast(context,incomingNumber);

          break;

        case TelephonyManager.CALL_STATE_OFFHOOK:

          Log.d("call_state","offhook");

          break;

 

        case TelephonyManager.CALL_STATE_IDLE:

          closeToast();

 

     }

 

   }

}

注册广播接收器:

<receiverandroid:name="InCallReceiver">

        <intent-filter>

          <actionandroid:name="android.intent.action.PHONE_STATE"/>

        </intent-filter>

     </receiver>

添加监听来电状态的权限:

<uses-permission android:name=android.permission.READ_PHONE_STATE/>

 

接收去电广播的接收器代码如下:

public class OutCallReceiver extends BroadcastReceiver

{

 

   @Override

   public void onReceive(Contextcontext, Intent intent)

   {

     //获得去电号码

     StringoutcomingNumber = intent

          .getStringExtra(Intent.EXTRA_PHONE_NUMBER);

     InCallReceiver.showToast(context,outcomingNumber);

   }

 

}

注册广播接收器:

<receiverandroid:name="OutCallReceiver">

        <intent-filter>

          <actionandroid:name="android.intent.action.NEW_OUTGOING_CALL"/>

        </intent-filter>

     </receiver>

添加权限:

<uses-permission android:name=android.permission.READ_PHONE_STATE/>

<uses-permission android:name=android.permission.PROCESS_OUTGOING_CALLS/>

 

3 截获屏幕休眠与唤醒

休眠状态:Intent.ACTION_SCREEN_ON

唤醒状态:Intent.ACTION_SCREEN_OFF

public class ScreenOnOffReceiver extends BroadcastReceiver{

  

   @Override

   public void onReceive(Contextcontext, Intent intent) {

     //接收屏幕唤醒状态的广播

     if(Intent.ACTION_SCREEN_ON.equals(intent.getAction()))

        Log.d("screen","on");

     //接收屏幕休眠状态的广播

     else if(Intent.ACTION_SCREEN_OFF.equals(intent.getAction()))

        Log.d("screen","off");

  

   }

}

屏幕唤醒和休眠的广播只能在代码中注册,如果在AndroidManifest.xml中注册将不起作用。

screenOnOffReceiver =new ScreenOnOffReceiver();

IntentFilter filter = new IntentFilter();

filter.addAction(Intent.ACTION_SCREEN_ON);

filter.addAction(Intent.ACTION_SCREEN_OFF);

registerReceiver(screenOnOffReceiver,filter);

 

4 开机自动运行

public class StartupReceiver extends BroadcastReceiver{

  

   @Override

   public void onReceive(Contextcontext, Intent intent) {

     IntentmainIntent = new Intent(context,BroadcastReceiverTest.class);

     //在广播接收器中显示Activity要设置FLAG_ACTIVITY_NEW_TASK标志

     mainIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

     context.startActivity(mainIntent);

   }

}

<receiverandroid:name="StartupReceiver">

        <intent-filter>

          <actionandroid:name="android.intent.action.BOOT_COMPLETED"/>

        </intent-filter>

     </receiver>

这样开机后就会自动运行BroadcastReceiverTest这个Activity。

 

5 显示手机电池的当前电量

public class BatteryChangedReceiver extends BroadcastReceiver{

  

   @Override

   public void onReceive(Contextcontext, Intent intent)

   {

     if (Intent.ACTION_BATTERY_CHANGED.equals(intent.getAction()))

     {

        //当前剩余电量的值

        int level =intent.getIntExtra("level", 0);

        //电量的总刻度点击打开链接

        int scale =intent.getIntExtra("scale", 100);

        Toast.makeText(context,"电池剩余电量:" + (level * 100 / scale) +"%",Toast.LENGTH_LONG).show();

     }

   }

}

batteryChangedReceiver = new BatteryChangedReceiver();

IntentFilter filter = newIntentFilter(Intent.ACTION_BATTERY_CHANGED);

registerReceiver(batteryChangedReceiver,filter);

 

五、验证广播接收器是否注册

//获得PackageManager对象

PackageManager packageManager =getPackageManager();

//指定要查询广播的动作

Intent intent = new Intent("android.provider.Telephony.SMS_RECEIVED");

//返回以查询到的广播接收器集合,如果没有符合条件的广播,List对象的长度为0

List<ResolveInfo> resolveInfos =packageManager

.queryBroadcastReceivers(intent,PackageManager.GET_INTENT_FILTERS);

String s = "";

//显示查询到的广播接收器的信息

for (ResolveInfo resolveInfo : resolveInfos)

{

s += String.valueOf(resolveInfo.toString())+ "\n\n";

}

Toast.makeText(BroadcastReceiverTest.this,"已发现" + resolveInfos.size() +"个接收短信广播的接收器."+"\n接收器的信息分别为:"+s,Toast.LENGTH_LONG).show();

 

拓展:查询Activity Action是否存在

PackageManager packageManager =getPackageManager();

Intent intent = new Intent("com.android.phone");

List<ResolveInfo> resolveInfos =packageManager

  .queryIntentActivities(intent,PackageManager.GET_INTENT_FILTERS);         

String s = "";

for (ResolveInfo resolveInfo : resolveInfos)

{

s += String.valueOf(resolveInfo.toString())+ "\n\n";

}

Toast.makeText(BroadcastReceiverTest.this,"已发现" + resolveInfos.size() +"个Activity."+"\nActivity的信息分别为:"+s,Toast.LENGTH_LONG).show();


源码下载:http://download.csdn.net/detail/codingbuddy/5103811

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值