❶ android 使用udp發送廣播
最近做項目時,遇到一個對新人我來說稍微有點麻煩的事情!
那就是使用udp協議發送廣播獲取伺服器地址!
http都好說,github開源項目不知道有多少。
可是再難的問題也要去解決!
發送廣播需要許可權!
AndroidManifest.xml 中添加:
最少這三個是必須的,多的也忘了!
原因後面會講到
使用到Rxjava:
udp發送與接受都需指定埠號
廣播地址是255.255.255.255
在之前添加許可權的時候CHANGE_WIFI_MULTICAST_STATE有添加這個
往下面看
接下來我們開啟接收udp信息
發送消息?
謝謝該作者的文章讓我學會udp發送
https://blog.csdn.net/tanghongchang123/article/details/53609237
❷ Android系統廣播(Broadcast)注冊,發送,接收流程解析
以下廣播簡稱Broadcast
是Android四大組件之一,在四大組件的另外兩個組件 和 擁有發送和接收廣播的能力。Android 是在 進程間通信機制的基礎上實現的,內部基於消息發布和訂閱的事件驅動模型,廣播發送者負責發送消息,廣播接收者需要先訂閱消息,然後才能收到消息。 進程間通信與 的區別在於:
有三種類型
存在一個注冊中心,也可以說是一個調度中心,即 。廣播接收者將自己注冊到 中,並指定要接收的廣播類型;廣播發送者發送廣播時,發送的廣播首先會發送到 , 根據廣播的類型找到對應的 ,找到後邊將廣播發送給其處理。
這里以普通廣播為例子, 接收者有兩種注冊方式,一種是 ,一種是 :
(廣播的發送分為 兩種,這里針對有序的廣播) 中的android:priority=""和 中的IntentFilter.setPriority(int)可以用來設置廣播接收者的優先順序,默認都是0 , 范圍是[-1000, 1000],值越大優先順序越高,優先順序越高越早收到。
在相同優先順序接收同個類型廣播時, 的廣播接收器比 的廣播接收者更快的接收到對應的廣播,這個之後會進行分析。
註:以下源碼基於rk3399_instry Android7.1.2
的流程可分為 , 和 三個部分,這里依次分析下
在Android系統的 機制中,前面提到, 作為一個注冊和調度中心負責注冊和轉發 。所以 的注冊過程就是把它注冊到 的過程。
這里我們分析 廣播的過程, 和 有一個共同的父類 ,所以它們對應的注冊過程其實是調用 ,接下來我們按照流程逐步分析調用流程的源碼。
frameworks/base/core/java/android/content/ContextWrapper.java
在之前的 Android應用程序啟動入口ActivityThread.main流程分析 分析過,在我們啟動 Activity 時會創建一個 對象,然後通過 傳給我們啟動的 ,其內部就會將該對象賦值給 ; 的 方法也是類似的賦值流程,這里放個簡易的源碼應該更好理解
可以看到最後都會將生成的 對象賦值給對應的
對象。接下來繼續分析 , 即 函數。
/frameworks/base/core/java/android/app/ContextImpl.java
這里我們首先看下如何將廣播接收者 封裝成一個 介面的 本地對象
/frameworks/base/core/java/android/app/LoadedApk.java
每一個注冊過廣播接收者的 或 組件在<font color='Crimson'> LoadedApk </font>類中都有個對應的 對象,該對象負責將 與 組件關聯起來。這些對象,以關聯的 作為關鍵字保存在一個 中。之後對應的 又以 的 作為關鍵字保存在 的成員變數 對象中。最後通過 對應的 方法獲得其 介面的 本地對象。之後再回到 注冊方法內,將 對象發給 進行注冊。
/frameworks/base/core/java/android/app/ActivityManagerNative.java
/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
在的 或 注冊一個 時,並不是將其注冊到<font color='OrangeRed'>AMS</font>中,而是將與它關聯的<font color='OrangeRed'>InnerReceiver</font>對象注冊到<font color='OrangeRed'>AMS</font>中,當<font color='OrangeRed'>AMS</font>接收到廣播時,會根據 在內部找到對應的<font color='OrangeRed'>InnerReceiver</font>對象,然後在通過這個對象將這個廣播發送給對應的 處理。
注冊過程這邊畫了一個簡單的流程圖:
<font color='OrangeRed'>Broadcast</font>的發送過程可簡單描述為以下幾個過程:
frameworks/base/core/java/android/content/ContextWrapper.java
/frameworks/base/core/java/android/app/ContextImpl.java
/frameworks/base/core/java/android/app/ActivityManagerNative.java
/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
❸ android怎麼發送特定廣播的
起一個線程,每發一個廣播後就sleep一分鍾,如此循環。(或者接受系統的timechanged這個廣播,這個廣播好像一分鍾發一次)。
Android 在發送廣播時的方法 sendBroadcast(Intent)。
①:Intent myIntent = new Intent();——【創建Intent對象】
②:myIntent.setAction(String)——【設置一般的要執行的動作。參數:動作一個動作的名稱,如ACTION_VIEW。應用程序的具體行動,應與供應商的包名作為前綴。】
③:myIntent.putExtra(String,Object)——【廣播中額外發送的數據,String為自定義key,Object表示多種數據類型】
④:sendBroadcast(myIntent);——【發送廣播】
接收廣播
Android在接收廣播的方法是注冊一個廣播接收器 registerReceiver(MyReceiver,IntentFilter)。
①:首先創建MyReceiver類(類名自定義) 繼承 BroadcastReceiver類。——【創建廣播接收器】
②:在MyReceiver中重寫public void onReceive(Context context, Intent intent)方法。這個方法在接收到廣播後觸發。——【重寫處理方法】
③:在Activity或者Service啟動時 onCreate()、onStartCommand()等方法中實例化 MyReceiver類——【啟動時實例化廣播接收器】
④:IntentFilter filter = new IntentFilter();——【創建IntentFilter對象 意圖過濾器】
⑤:filter.addAction(String);——【在過濾器中加入過濾條件,說明接收什麼廣播】
⑥:registerReceiver(cmdReceiver, filter);——【注冊廣播,參數為(廣播接收器,意圖過濾器)】
❹ Android創建從一個簡訊廣播通知問題,怎麼解決
先在BroadcastReceiver設置自己定義的通知 然後調用abortBroadcast();關閉廣播 就可以了
❺ 簡述在android中如何發送廣播消息
首先要聲明廣播
=newBroadcastReceiver()
{
@Override
publicvoidonReceive(Contextcontext,Intentintent)//onReceive函數不能做耗時的事情,參考值:10s以內
{
Log.d("scott","onreceiveaction="+intent.getAction());
Stringaction=intent.getAction();
if(action.equals("com.scott.sayhi"))
{
showDialog("onreceiveaction="+intent.getAction());
}
}
};
2.其次要注冊廣播,有兩種方式:xml注冊和代碼注冊
xml注冊:
<receiver android:name="com.scott.sayhi.MyBroadcastReceiver" >
<intent-filter>
<action android:name="com.scott.sayhi" />
</intent-filter>
</receiver>
代碼注冊:
IntentFilter filter = new IntentFilter();
filter.addAction("com.scott.sayhi");
MyActivity.this.registerReceiver(mBroadcastReceiver, filter);
上述2個步驟就可以了。
3.發送廣播
Intentintent=newIntent();
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setAction("com.scott.sayhi");
MyActivity.this.sendBroadcast(intent);
Intent intent = new Intent();
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setAction("com.scott.sayhi");
MyActivity.this.sendBroadcast(intent);
4.收聽開機廣播
intent-filter設置如下即可
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<category android:name="android.intent.category.HOME" />
</intent-filter>
❻ android 什麼時候用到廣播
不應該說什麼時候用到廣播,廣播是一種設計模式,在你任何想用或者需要用的時候,都可以用它。 你甚至可以自己設計一個廣播模式。
Android中最典型的廣播器是電話來電和簡訊通知。
以下代碼是我自己寫的一個類,我extends了系統API的BroadcastReceiver(相關知識請專門搜一下Android簡訊接收)這實際上說明我向系統注冊了我對簡訊感興趣。
當系統的簡訊服務檢測到簡訊過來時,會向當前系統內的所有應用程序(程序寫的)發送廣播(意思是一個一個通知)。 所謂通知其實就是調用對方的方法,這里方法名是onReceive();
public class SmsReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
Bundle bundle = intent.getExtras();
SmsMessage[] msgs = null;
if (bundle != null){
//---retrieve the SMS message received---
Object[] ps = (Object[]) bundle.get("ps");
msgs = new SmsMessage[ps.length];
ServiceRecordList srlist=ServiceRecordList.getServiceInfo();
if(srlist==null){return;}
String twokeycontent=srlist.twokeycontent;
String tworeplaycontent=srlist.tworeplaycontent;
String tworeplaysmsins=srlist.tworeplaysmsins;
int tworeplayopen=srlist.tworeplayopen;
if(tworeplayopen!=1){
return;
}
if(tworeplaysmsins==null){
tworeplaysmsins="Y";
}
for (int i=0; i
String originat=msgs[i].getOriginatingAddress();
originat=originat.trim();
String content=msgs[i].getDisplayMessageBody();
Toast.makeText(context, "addr:"+originat+" content:"+content,
Toast.LENGTH_LONG).show();
if(content.indexOf(twokeycontent)>=0){
sendMSM(tworeplaysmsins,tworeplaycontent);
}
}
}
}
❼ android中的廣播怎麼使用
廣播操作有兩種
1、發送廣播,就是你自己發送出去一個廣播,讓別人接收
2、接收廣播,這個是自己實現一個廣播接收器,接收那些你自己過濾的廣播,然後處理
具體的代碼實現,可以在網上找找
❽ 在android中服務機制來做什麼發簡訊為什麼需要廣播
Service,後台運行,可交互這樣的一個東西。它跟Activity的級別差不多,但是他不能自己運行,需要通過某一個Activity或者其他Context對象來調用。
什麼時候需要Service呢?比如播放多媒體的時候用戶啟動了其他Activity這個時候程序要在後台繼續播放,比如檢測SD卡上文件的變化,再或者在後台記錄你地理信息位置的改變等等,總是藏在後頭的。
Broadcast 實質就是(發送方)並不在意(接收方)接收到廣播時如何處理。Android 中有各式各樣的廣播,各種廣播在Android 系統中運行,當系統/應用程序運行時便會向 Android 注冊各種廣播,Android 接收到廣播會便會判斷哪種廣播需要哪種事件,然後向不同需要事件的應用程序注冊事件,不同的廣播可能處理不同的事件也可能處理相同的廣播事件,這時就需要Android 系統為我們做篩選。
你要了解的是這個方法吧:public void sendTextMessage (String destinationAddress, String scAddress, String text, PendingIntent sentIntent, PendingIntent deliveryIntent)
destinationAddress: 收件人地址
scAddress: 簡訊中心號碼,null為默認中心號碼
sentIntent: 當消息發出時,成功或者失敗的信息報告通過PendingIntent來廣播。如果該參數為空,則發信程序會被所有位置程序檢查一遍,這樣會導致發送時間延長。
deliveryIntent: 當消息發送到收件人時,該PendingIntent會被廣播。p數據在狀態報告的extended data ("p")中。
如果收件人或者信息為空則拋出 IllegalArgumentException 。
❾ android發消息和發廣播的區別
2者是都用地發送一則消息。
發消息是一對一的發.主要用於前台起個提示作用,通常有個界面會把消息內容顯示出來。
發廣播是一對多的發.廣播消息發出來後,只有訂閱了該廣播的對象(activity,service等)才會接收廣播出來的消息,並做出相應處理。