现在的位置: 首页 > 综合 > 正文

Android–常驻BroadReceiver实现短信提醒

2014年09月05日 ⁄ 综合 ⁄ 共 3560字 ⁄ 字号 评论关闭

    首先,由于BroadReceiver是Android组件之一,所以需要先声明才能使用,声明的方法如下:

   <!-- 建立receiver聆聽系統廣播訊息 -->
    <receiver android:name="EX06_01_SMSreceiver"> 
    <!-- 設定要捕捉的訊息名稱為provider中Telephony.SMS_RECEIVED -->
  <intent-filter> 
    <action 
      android:name="android.provider.Telephony.SMS_RECEIVED" /> 
  </intent-filter> 
    </receiver> 

接着,我们看下实现本实例的截图:

1.程序开始运行时


2.当程序收到短信的时候


下面给出实现本实例的代码:

1.继承自BroadReceiver的类对象

//这个类实现的是处理操作系统的事件,它处于一直监听的状态,知道操作系统有事件发生时才会有所响应
/* 自定义继承自BroadcastReceiver类,监听系统服务广播的信息 */
public class EX06_01_SMSreceiver extends BroadcastReceiver 
{ 
   /*声明静态字符串,并使用android.provider.Telephony.SMS_RECEIVED作为Action为短信的依据*/
  private static final String mACTION = "android.provider.Telephony.SMS_RECEIVED"; 
  
  /*
   * 实现广播的监听反应必须要重载的函数
   * 这个函数有一个重要的参数Intent,它是系统或用户发送的Intent变量
   * @see android.content.BroadcastReceiver#onReceive(android.content.Context, android.content.Intent)
   */
  @Override 
  public void onReceive(Context context, Intent intent) 
  { 
    // TODO Auto-generated method stub 
    /* 判断传来Intent是否为短信
     * 需要在过滤器中设置
     * */
    if (intent.getAction().equals(mACTION)) 
    { 
      /*建构一字符串集集合变量sb*/
      StringBuilder sb = new StringBuilder(); 
      /*接收由Intent传来的数据*/
      Bundle bundle = intent.getExtras(); 
      /*判断Intent是有资料*/
      if (bundle != null) 
      {
        Set<String> keysSet=bundle.keySet();
        for(String keyString:keysSet){
          Log.d("key", keyString);
        }
        /* pdus为 android内建短信参数 identifier
         * 透过bundle.get("")并传一个包含pdus的对象*/
        Object[] myOBJpdus = (Object[]) bundle.get("pdus"); 
        /*建构短信对象array,并依据收到的对象长度来建立array的大小*/
        SmsMessage[] messages = new SmsMessage[myOBJpdus.length];  
        for (int i = 0; i<myOBJpdus.length; i++) 
        {  
          messages[i] = SmsMessage.createFromPdu ((byte[]) myOBJpdus[i]);  
        } 
          
        /* 将送来的短信合并自定义信息于StringBuilder当中 */  
        for (SmsMessage currentMessage : messages) 
        {  
          sb.append("接收到来告:\n");  
          /* 来讯者的电话号码 */ 
          sb.append(currentMessage.getDisplayOriginatingAddress());  
          sb.append("\n------传来的短信------\n");  
          /* 取得传来讯息的BODY */  
          sb.append(currentMessage.getDisplayMessageBody());  
        }  
      }    
      /* 北Notification(Toase)显示短信信息  */
      Toast.makeText(context, sb.toString(), Toast.LENGTH_LONG).show(); 
       
      /* 返并加Activity */ 
      Intent i = new Intent(context, EX06_01.class); 
      Bundle bundle2=new Bundle();
      bundle2.putString("SMS", sb.toString());
      i.putExtra("SMSS", bundle2);
      /*设定让加Activity以一个新的task来执行*/
      i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
      context.startActivity(i); 
    } 
  } 
} 

说明:由于BroadReceiver不是一旦单独的进程,且不是一个单独的线程,所以可以对UI界面进行更新。

2.主程序代码:

public class EX06_01 extends Activity 
{ 
  private TextView mTextView1; 
  private TextView textView;
  /** Called when the activity is first created. */ 
  @Override 
  public void onCreate(Bundle savedInstanceState) 
  { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    /*透过findViewById建构巳建立TextView对象*/ 
    textView=(TextView)findViewById(R.id.myTextView2);
    mTextView1 = (TextView) findViewById(R.id.myTextView1); 
    mTextView1.setText("等待接收短信..."); 
 
    Bundle bundle=getIntent().getBundleExtra("SMSS");
    //初始时并没有短信的内容(因为没有发送),若没有判断会造成空指针异常
    if(bundle!=null){
    String smsString=bundle.getString("SMS");
    textView.setText(smsString); 
    }   
    }
}

3.AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="irdc.EX06_01"
  android:versionCode="1"
  android:versionName="1.0.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
    <activity android:name=".EX06_01"
      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聆聽系統廣播訊息 -->
    <receiver android:name="EX06_01_SMSreceiver"> 
    <!-- 設定要捕捉的訊息名稱為provider中Telephony.SMS_RECEIVED -->
  <intent-filter> 
    <action 
      android:name="android.provider.Telephony.SMS_RECEIVED" /> 
  </intent-filter> 
    </receiver>   
</application>
<uses-sdk android:minSdkVersion="7" />
<uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>
</manifest> 

抱歉!评论已关闭.