android學習教程—廣播機制
一、知識概要
1、 註冊BroadcastReceiver的方法
2、 Android內置的BroadcastActions
二、知識詳解
所謂廣播機制是指,當觸發一個事件時會做出相應的動作,比如說當別人發一條短信給你,然後BroadcastReceiver會監聽這個事件(Intent),並判斷用到了Intent中的Actiond的哪個BroadcastActions,如SMS_RECEIVED就是處理消息的,所以這個判斷就需要靠註冊BroadcastReceiver來實現。
1、註冊BroadcastReceiver的方法有兩種:
a、在AndroidManifest.xml中進行註冊
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="mars.testbc" android:versionCode="1" android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".TestActivity" 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 android:name=".TestReceiver">
<intent-filter>
<action android:name="android.intent.action.PICK" />
</intent-filter>
</receiver>
</application>
<uses-sdk android:minSdkVersion="4" />
<uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>
</manifest>
b、在應用程序的代碼中進行註冊
//生成一個BroadcastReceiver對象
smsreceiver = new SMSReceiver();
//生成一個IntentFilter對象
IntentFilter intentFilter = new IntentFilter();
//爲IntentFilter添加一個Action
intentFilter.addAction(SMS_ACTION);
//將BroadcastReceiver對象註冊到系統當中去
Activity_broadcast.this.registerReceiver(smsreceiver, intentFilter);
2、Android內置的BroadcastActions
3、完整代碼
Activity_broadcast.java
package com.wyt.Activity_broadcast;
import android.app.Activity;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class Activity_broadcast extends Activity {
/** Called when the activity is first created. */
private Button firstButton = null;
private Button secondButton = null;
private SMSReceiver smsreceiver = null;
private static final String SMS_ACTION = "android.provider.Telephony.SMS_RECEIVED";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
firstButton = (Button) findViewById(R.id.firstButton);
secondButton = (Button) findViewById(R.id.secondButton);
// 設置監聽器
firstButton.setOnClickListener(new RegisterReceiverListener());
secondButton.setOnClickListener(new UnregisterReceiverListener());
}
// 註冊
class RegisterReceiverListener implements OnClickListener {
public void onClick(View v) {
// TODO Auto-generated method stub
// 生成一個BroadcastReceiver對象
smsreceiver = new SMSReceiver();
// 生成一個IntentFilter對象
IntentFilter intentFilter = new IntentFilter();
// 爲IntentFilter添加一個Action
intentFilter.addAction(SMS_ACTION);
// 將BroadcastReceiver對象註冊到系統當中去
Activity_broadcast.this.registerReceiver(smsreceiver, intentFilter);
}
}
// 取消註冊
class UnregisterReceiverListener implements OnClickListener {
public void onClick(View v) {
// TODO Auto-generated method stub
Activity_broadcast.this.unregisterReceiver(smsreceiver);
}
}
}
SMSReceiver.java
package com.wyt.Activity_broadcast;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
public class SMSReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
System.out.println("receive msg");
// 接受Intent對象當中的數據
Bundle bundle = intent.getExtras();
// 在Bundle對象當中有一個屬性名爲pdus,這個屬性的值是一個Object數組
Object[] myPdus = (Object[]) bundle.get("pdus");
// 創建一個SmsMessage類型的數組
SmsMessage[] messages = new SmsMessage[myPdus.length];
for (int i = 0; i < myPdus.length; i++) {
// 使用object數組中的對象創建SmsMessage對象
messages[i] = SmsMessage.createFromPdu((byte[]) myPdus[i]);
// 調用SmsMessage對象的getDisppalyMessageBody()方法,就可以得到消息的內容
System.out.println(messages[i].getDisplayMessageBody());
}
}
}
4、運行結果
單擊第一個按鈕“發送廣播機制”
然後再DDMS中發送消息到模擬器
然後模擬器會顯現你剛剛發送的消息,並在控制檯打印出來。
三、學習心得
在學習這個知識的時候,我遇到了
,然後把之前做的列子看了一遍,終於發現,原來是AndroidManifest.xml沒有設置權限:<uses-permission android:name="android.permission.RECEIVE_SMS"/>,所以說由此可見,我們學習知識好比是在進行堆山的遊戲,越往上堆,下面的基地就越要牢固,我們學習也是一樣的,不要像猴子扳包穀那樣,學習了的知識一定要牢記,掌握,之前學習的知識在以後肯定是會用到的!!!