❶ 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等)才会接收广播出来的消息,并做出相应处理。