Android廣播接收機(jī)制詳細(xì)介紹(附短信接收實(shí)現(xiàn))
Android中廣播(BroadcastReceiver)的詳細(xì)講解.
1. BroadcastReceiver的注冊(cè)過程:
(1).廣播消息發(fā)出來后,只有訂閱了該廣播的對(duì)象才會(huì)接收發(fā)出來的廣播消息并做出相應(yīng)處理。
**(2).**Android廣播分為兩個(gè)方面:廣播發(fā)送者和廣播接收者。Android中的廣播使用了觀察者模式,基于消息的發(fā)布/訂閱事件模型。廣播接收者通過Binder機(jī)制向AMS進(jìn)行注冊(cè),AMS查找符合相應(yīng)條件的Broadcastreceiver,將廣播發(fā)送到BroadcastReceiver(一般情況下是Activity)相應(yīng)的消息循環(huán)隊(duì)列中。消息循環(huán)執(zhí)行拿到此廣播,回調(diào)BroadcastReceiver中的onReceive()方法。
(3).廣播發(fā)送者和廣播接收者的執(zhí)行順序是異步的,發(fā)出去的廣播不會(huì)關(guān)心有無接收者的接收,也不確定接收者是什么時(shí)候能接收到。
2. BroadcastReceiver的步驟:
(1).注冊(cè)廣播:廣播接收者在AMS中注冊(cè)廣播。
(2).發(fā)送廣播:廣播發(fā)送者向AMS中發(fā)送廣播。
(3).接收廣播:廣播接收者拿到廣播后調(diào)用onReceive()方法執(zhí)行。
以下是一個(gè)發(fā)送短信的例子,代碼如下:
BroadcastReceiverHelper 類: package com.scd.broadcastreceiver.helper; import com.scd.broadcastreceiver.activity.MainActivity; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.widget.Toast; /** * 廣播接收 * * @author scd * */ public class BroadcastReceiverHelper extends BroadcastReceiver { /** 上下文 */ private MainActivity mActivity = null; public BroadcastReceiverHelper(MainActivity mContext) { super(); mActivity = mContext; } @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(MainActivity.ACTION_SENDMESSAGE)) { toast("發(fā)送成功"); } else if (intent.getAction() .equals(MainActivity.ACTION_DELIVERMESSAGE)) { toast("接收成功"); } } public void toast(String text) { Toast.makeText(mActivity, text, Toast.LENGTH_SHORT).show(); } }
MainActivity類:
package com.scd.broadcastreceiver.activity; import com.scd.broadcastreceiver.R; import com.scd.broadcastreceiver.helper.BroadcastReceiverHelper; import android.app.Activity; import android.app.PendingIntent; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.telephony.gsm.SmsManager; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.Toast; public class MainActivity extends Activity implements OnClickListener { private Button mButton = null; /** 發(fā)送短信 */ public static String ACTION_SENDMESSAGE = "com.scd.broadcastreceiver.MainActivity.SendMessage"; /** 接收短信 */ public static String ACTION_DELIVERMESSAGE = "com.scd.broadcastreceiver.MainActivity.DeliverMessage"; /** Reciver類 */ private BroadcastReceiverHelper mHelperS = null; private BroadcastReceiverHelper mHelperD = null; /** 短信管理類 */ private SmsManager mSmsManager = null; /** 電話號(hào)碼 */ private String mTelephone = "13607567010"; /** 短信內(nèi)容 */ private String mContext = "你好,有什么需要幫助的嗎?"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mButton = (Button) findViewById(R.id.sendBroadcast); mButton.setOnClickListener(this); mSmsManager = SmsManager.getDefault(); // 注冊(cè)廣播 registerBroadcast(); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.sendBroadcast: { //發(fā)送廣播 sendBroadcastReceiver(mTelephone, mContext); break; } default: break; } } /** * 注冊(cè)廣播 */ public void registerBroadcast() { // 發(fā)送 IntentFilter intentFilterS = new IntentFilter(ACTION_SENDMESSAGE); mHelperS = new BroadcastReceiverHelper(MainActivity.this); this.registerReceiver(mHelperS, intentFilterS); // 接收 IntentFilter intentFilterD = new IntentFilter(ACTION_DELIVERMESSAGE); mHelperD = new BroadcastReceiverHelper(MainActivity.this); this.registerReceiver(mHelperD, intentFilterD); } /** * 發(fā)送廣播 短信發(fā)送的過程:發(fā)送的時(shí)候需要發(fā)送廣播一次,接收的時(shí)候需要發(fā)送廣播一次 */ public void sendBroadcastReceiver(String telephone, String content) { if (telephone != null) { Intent sIntent = new Intent(ACTION_SENDMESSAGE); // 短信成功發(fā)送后才發(fā)送該廣播 PendingIntent sentIntent = PendingIntent.getBroadcast( MainActivity.this, 0, sIntent, 0); Intent dIntent = new Intent(ACTION_DELIVERMESSAGE); // 短信接收后才發(fā)送該廣播 PendingIntent deliveryIntent = PendingIntent.getBroadcast( MainActivity.this, 0, dIntent, 0); mSmsManager.sendTextMessage(telephone, null, content, sentIntent, deliveryIntent); // this.sendBroadcast(intent); } } }
注意:需要添加以下權(quán)限:
<!-- 短信權(quán)限 --> <uses-permission android:name="android.permission.SEND_SMS" > </uses-permission> <uses-permission android:name="android.permission.READ_SMS" > </uses-permission> <uses-permission android:name="android.permission.RECEIVE_SMS" > </uses-permission>
相關(guān)文章
Android實(shí)現(xiàn)橫向無限循環(huán)滾動(dòng)的單行彈幕效果
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)橫向無限循環(huán)滾動(dòng)的單行彈幕效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-06-06Android中實(shí)現(xiàn)圖文并茂的按鈕實(shí)例代碼
這篇文章主要介紹了Android中實(shí)現(xiàn)圖文并茂的按鈕實(shí)例代碼,代碼簡單易懂,非常不錯(cuò),需要的朋友可以參考下2017-04-04Android中PathMeasure仿支付寶支付動(dòng)畫
這篇文章主要為大家詳細(xì)介紹了Android中PathMeasure仿支付寶支付動(dòng)畫,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08Android中ViewPager組件的基本用法及實(shí)現(xiàn)圖片切換的示例
這篇文章主要介紹了Android中ViewPager組件的基本用法及實(shí)現(xiàn)圖片切換的示例,ViewPager主要被用來實(shí)現(xiàn)滑動(dòng)切換效果,需要的朋友可以參考下2016-03-03Android利用Intent實(shí)現(xiàn)讀取圖片操作
這篇文章主要為大家詳細(xì)介紹了Android利用Intent實(shí)現(xiàn)讀取圖片操作的相關(guān)資料,感興趣的小伙伴們可以參考一下2016-06-06Android 8.0系統(tǒng)中應(yīng)用圖標(biāo)的適配微技巧
這篇文章主要介紹了Android 8.0系統(tǒng)中應(yīng)用圖標(biāo)的適配微技巧 ,需要的朋友可以參考下2018-04-04Android基于ibeacon實(shí)現(xiàn)藍(lán)牙考勤功能
這篇文章主要為大家詳細(xì)介紹了Android基于ibeacon實(shí)現(xiàn)藍(lán)牙考勤功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-10-10