1. 安卓broadcastreceiver怎么接收的广播
1.广播接收者(BroadcastReceiver)
广播接收者(BroadcastReceiver)继承BroadcastReceiver类接收广播意图的Java类,重写:
public void onReceive(Context context,Intent intent),其中intent可以获得传递的数据;
广播意图就是通过Context.sendBroadcast(Intent intent)或Context.sendOrderedBroadcast(Intentintent)发送的意图,通过这个语句,能够广播给所有满足条件的组件,比如intent设置了action="Receiver",则所有在androidManifest.xml中设置过<actionandroid:name="Receiver"/>的广播接收者都能够接收到广播;
2.广播发送者sendBroadcast()
通常广播发送方就是调用Context.sendBroadcast()的程序,通常广播发送方都是通过隐式意图发送出去;
广播发送方分为普通广播和有序广播;
同步广播:发送方发出后,几乎同时到达多个广播接收者处,某个接收者不能接收到广播后进行一番处理后传给下一个接收者,并且无法终止广播继续传播;Context.sendBroadcast(intent);
有序广播:广播接收者需要提前设置优先级,优先级高的先接收到广播,优先级数值为-1000~1000,在AndroidManifest.xml的<intent-filterandroid:priority="1">设置;比如存在3个广播接收者A、B、C、D,优先级A>B>C>D,因此A最先收到广播,当A收到广播后,可以向广播中添加一些数据给下一个接收者(intent.putExtra()),或者终止广播 abortBroadcast();Context.sendOrderedBroadcast(intent);
一、同步广播发送方核心代码
Intent intent = new Intent();
intent.setAction("Receiver");
Context.sendBroadcast(intent);
有序广播发送方核心代码:
Intent intent = new Intent();
intent.setAction("Receiver");
Context.sendOrderedBroadcast(intent,null);
二、广播接收者核心代码:
public class MyReceiver extends BroadcastReceiver{
public void onReceive(Context context, Intent intent)
{
Bundle bundle = intent.getExtras();...
}
}
三 注册该广播
AndroidManifest.xml 注册方式
<receiver android:name=".MyReceiver">
<intent-filter android:priority="1000">
<action android:name="Receiver"/>
</intent-filter>
</receiver>
Java类注册方式
publicvoid registerBoradcastReceiver()
{
IntentFilter myIntentFilter = new IntentFilter();
myIntentFilter.addAction("Receiver");
registerReceiver(广播类对象, myIntentFilter);
}
简单例子
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.Toast;
public class Test extends Activity{
private final String ACTION_NAME = "Receiver";
private Button mBtnEvent = null;
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
//注册广播
registerBoradcastReceiver();
LinearLayout mLinearLayout = new LinearLayout(this);
mBtnEvent= new Button(this);
mBtnEvent.setText("发送广播");
mLinearLayout.addView(mBtnMsgEvent);
setContentView(mLinearLayout);
mBtnEvent.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
sendTestBroadcast();
}
});
}
//发送广播
private void sendTestBroadcast()
{
Intent mIntent = new Intent(ACTION_NAME);
mIntent.putExtra("strData", "发送广播,在这里传送数据");
sendBroadcast(mIntent);
}
private BroadcastReceiver myReceiver = new BroadcastReceiver(){
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if(action.equals(ACTION_NAME)){
Toast.makeText(Test.this, "接收测试", 200);
}
}
};
//注册广播
public void registerBoradcastReceiver(){
IntentFilter myIntentFilter = new IntentFilter();
myIntentFilter.addAction(ACTION_NAME);
registerReceiver(myReceiver, myIntentFilter);
}
}
2. 怎么接收android 静态广播
在AndroidManifest.xml注册的方式,Android不能自动销毁广播接收器,也就是说当应用程序关闭后,广播接收器还是会接收广播,而在代码中注册广播接收器,可以让程序员手动定义销毁接收器的代码。应该根据应用程序的需求来选择实现广播机制的方法。
3. android广播有多个接收器
_<intent-filter>就可以了,
例:以下的MyBroadcastReceiver可以同时监听farsight.inf1和farsight.inf2类型的广播
<application Android:icon="@drawable/icon" android:label="@string/app_name">
<receiver android:name="com.fs.receiver.broadcast.MyBroadcastReceiver">
<intent-filter>
<action android:name="farsight.inf1" />
</intent-filter>
<intent-filter>
<action android:name="farsight.inf2" />
</intent-filter>
</receiver>
</application>
当广播监听到广播后监听器类中函数public void onReceive(Context context, Intent intent) 会被调用,
为了区别到底监听到的是farsight.inf1类型的广播还是farsight.inf2类型的广播,可以使用函数中参数intent调
用
getAction()函数,该函数的返回值会返回farsight.inf1或farsight.inf2.用返回的表达类型的字符串则可以
知道是监听到哪一个广播被监听到后调用的onReceive函数
3. 多个广播接收器可以接收同一广播比较简单,只要创建多个广播接收器类,然后在MyBroadcastReceiver.xml
中将这些广播接收器都配置好!并且配置相同的<intent-filter>就可以了
例:
广播接收器一的代码
public class OneBroadcastReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
System.out.printfln("One....");
}
}
广播接收器二的代码
public class TwoBroadcastReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
System.out.printfln("Two....");
}
}
如果以上两监听器类在同一个项目中,则在AndroidManifest.xml的<application>标签中嵌套配置
两个<receiver>标签
<receiver android:name="OneBroadcastReceiver类的包名.OneBroadcastReceiver">
<intent-filter>
<action android:name="farsight.inf" />
</intent-filter>
</receiver>
<receiver android:name="TwoBroadcastReceiver类的包名.TwoBroadcastReceiver">
<intent-filter>
<action android:name="farsight.inf" />
</intent-filter>
</receiver>
如果以两个接收器不是在同一个项目中,则分别把上面的两组<receiver>标签配置在分自所在的
项目的 AndroidManifest.xml文件的<application>标签中配置即可,
以上做完后,只要发送广播的类型为farsight.inf,则OneBroadcastReceiver和TwoBroadcastReceiver类中的onReceive函数都会被自动调用,
当多个广播接收器监听同一个广播,还要控制其中接收器接收顺序,那就会用到另一个知识点——有序广播
4. Android中怎么打开Wifi的组播功能
打开Android中Wifi的组播功能。主要有以下几个步骤:
在Manifest文件中加入:android.permission.CHANGE_WIFI_MULTICAST_STATE,这个权限
获取到MulticastLock对象,这个对象不能直接实例化,要通过WifiManager间接得到,工厂模式
调用MulticastLock对象的acquire方法,获取到组播锁
相应的,用完组播,为了不浪费电力,要调用MulticastLock的release方法释放锁
下面写了个简单示例,通过组播发现服务器。
Activity写的比较简单
public class MulticastDemoActivity extends Activity {
MulticastLock multicastLock;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
allowMulticast();
try {
NetUtil.findServerIpAddress();
} catch (IOException e) {
throw new RuntimeException(e);
}
Log.d("multicast.demo", "find ip ok.");
multicastLock.release();
}
private void allowMulticast(){
WifiManager wifiManager=(WifiManager)getSystemService(Context.WIFI_SERVICE);
multicastLock=wifiManager.createMulticastLock("multicast.test");
multicastLock.acquire();
}
}
在Activity中打开和释放组播锁。使用组播发送报文和接收ip地址信息的工具类代码:
public class NetUtil {
private static final String TAG="Net.Utils";
private static final int MULTICAST_PORT=5111;
private static final String GROUP_IP="224.5.0.7";
private static byte[] sendData;
static{
sendData=new byte[4];
// 0xEE78F1FB
sendData[3] = (byte) 0xEE;
sendData[2] = (byte) 0×78;
sendData[1] = (byte) 0xF1;
sendData[0] = (byte) 0xFB;
}
public static String findServerIpAddress() throws IOException{
String ip=null;
MulticastSocket multicastSocket=new MulticastSocket(MULTICAST_PORT);
multicastSocket.setLoopbackMode(true);
InetAddress group = InetAddress.getByName(GROUP_IP);
multicastSocket.joinGroup(group);
DatagramPacket packet=new DatagramPacket(sendData, sendData.length,group,MULTICAST_PORT);
for(;;){
multicastSocket.send(packet);
Log.d(TAG,">>>send packet ok");
byte[] receiveData=new byte[256];
packet=new DatagramPacket(receiveData, receiveData.length);
multicastSocket.receive(packet);
String packetIpAddress=packet.getAddress().toString();
packetIpAddress=packetIpAddress.substring(1, packetIpAddress.length());
Log.d(TAG,"packet ip address: "+packetIpAddress);
StringBuilder packetContent=new StringBuilder();
for(int i=0;i<receiveData.length;i++){
if(receiveData[i]==0){
break;
}
packetContent.append((char)receiveData[i]);
}
ip=packetContent.toString();
Log.d(TAG,"packet content ip is: "+ip);
if(ip.equals(packetIpAddress)){
Log.d(TAG,"find server ip address: "+ip);
break;
}else{
Log.d(TAG,"not find server ip address, continue …");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
}
}
return ip;
}
}
5. 如何用android实现广播,硬件接收到广播可以连接上路由器
你好!这可不是一两句能说明白的!首先你要会安卓系统的编程;再有,就是要会单片机的编程;最后,要有相应的硬件支持,才能完成调试
6. android广播接收的onReceive方法不执行,即接收不到广播的消息
最大的可能是广播没有注册
1)第一种不是常驻型广播,也就是说广播跟随activity的生命周期。注意: 在activity结束前,移除广播接收器。(代码里注册)
2)第二种是常驻型,也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行。(androidmanifest.xml注册)
7. 安卓广播接收器怎么判断是哪个应用发送的想要只接收自身应用广播,怎么实现
安卓广播接收器Intent,它有提供过滤器功能,也就是开发者定义过滤条件,只有是这个条件的广播才接收,这样就可以接收指定广播。这也是安卓广播的基础知识功能,具体自己查阅相关资料,很简单的。
8. android-Android udp接收不到组播,请问如何解决
这是因为在AP模式下,没有添加组播路由。你可以在AP模式下的时候,去查看一下wifi的信息,你会发现除了默认的ip之外,wifi上没有相应的组播路由
9. android wifi 组播
224.0.0.0~224.0.0.255为预留的组播地址(永久组地址),地址224.0.0.0保留不做分配,其它地址供路由协议使用;
224.0.1.0~224.0.1.255是公用组播地址,可以用于Internet;
224.0.2.0~238.255.255.255为用户可用的组播地址(临时组地址),全网范围内有效
239.0.0.0~239.255.255.255为本地管理组播地址,仅在特定的本地范围内有效。
把地址改到239.0.0.0~239.255.255.255之间。看看