精华内容
下载资源
问答
  • 同时,广播接收器中不允许开启子线程: 对于静态注册的广播接收器来说,广播接收器对象的生命周期较短,执行完onReceive()方法就会变为垃圾对象而被回收,在子线程执行完之前,若对应的Activity退出,他们所在进程就...


    不要在onReceive()方法中添加过多的逻辑或执行耗时操作,因为onReceive()方法运行在主线程中,耗时操作会导致ANR。

    同时,广播接收器中不允许开启子线程:
    对于静态注册的广播接收器来说,广播接收器对象的生命周期较短,执行完onReceive()方法就会变为垃圾对象而被回收,在子线程执行完之前,若对应的Activity退出,他们所在进程就变成了空进程(没有任何活动组件的进程),系统需要内存时可能会优先终止该进程,进程被终止,其内的子线程也会被终止,导致子线程无法执行完。

    对于动态注册的广播接收器来说,Activity退出时会调用unregisteReceiver()方法执行解注册,此时广播接收器对象也会变成垃圾对象而被回收。在子线程执行完之前,对应的Activity退出,同样它们所在进程就变成了空进程,其内的子线程也无法执行完。

    如果必须执行耗时任务可以考虑,在onReceive中开启服务来执行。系统就会认为这个进程里还有其他活动组件在运行,就不会任意时刻回收此进程。

    ps:

    1.adb验证广播:adb shell am broadcast -a  xxx.intent.action.xxx

    2.记得在IntentFilter中添加广播的action

     

     

    展开全文
  • 广播

    千次阅读 2019-08-15 15:37:04
    广播的基本使用,Android提供的广播事件

    1.使用标准广播:

    广播类声明:

    public class Broadcast extends BroadcastReceiver{
          @Override
          public void onReceive(Context context, Intent intent) {
              //do Something
          }
    }
    

    动态注册: 只有应用启动的时候才能收到广播通知

    	//注册
    	Broadcast broadcast = new Broadcast();
     	IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
        registerReceiver(broadcast, intentFilter);				
    
    	//Activity销毁时解注册
    	unregisterReceiver(broadcast);
    

    静态注册: 应用不启动就能收到广播通知

    <application>
    	 <receiver android:name=".Broadcast"
                android:enabled="true"
                android:exported="true" />
                 <intent-filter>
                    <action android:name="android.intent.action.SCREEN_ON" />
                            
                </intent-filter>
         </receiver>
    <application>  
    

    注意: 由于广播接收器中不允许开启线程,所以onReceive方法不能执行耗时操作,否则会报错

    2.发送自定义广播:

    首先在manifest文件中注册一个带有自定义 IntnetFilter 的 receiver

    <application>
    	 <receiver android:name=".Broadcast"
                android:enabled="true"
                android:exported="true">
    	 		<intent-filter>
                    <action android:name="xxx" />
                </intent-filter>
    	</receiver>
    <application>  
    

    然后在需要时发送:

    	Intent intent = new Intent("xxx");
    	sendBroadcast(intent);
    

    3.发送有序广播:

    <application>
    	 <receiver android:name=".Broadcast"
                android:enabled="true"
                android:exported="true">
    	 		<intent-filter android:priority="100">					//这里优先级数值越大越先收到广播
                    <action android:name="xxx" />
                </intent-filter>
    	</receiver>
    <application>  
    

    然后在需要时发送:

    	Intent intent = new Intent("xxx");
    	sendOrderedBroadcast(intent, null);
    

    截断有序广播只需在onReceive中执行:

    	public void onReceive(Context context, Intent intent) {
             abortBroadcast();
        }
    

    4.本地广播:

    使用localBroadcastManager来注册和发送广播即可:

    	//以下代码均在Activity中执行;
    	LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this);		
    	
    	//注册
    	Broadcast broadcast = new Broadcast()
     	IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
        localBroadcastManager.registerReceiver(broadcast, intentFilter);	
    
    	//取消注册
    	localBroadcastManager.unregisterReceiver(broadcast);	
        
        //发送广播:
        Intent intent = new Intent("xxx");
        localBroadcastManager.sendBroadcast(intent);
    

    5.显式广播和隐式广播:

    隐式广播是一种不专门针对某App,可能被所有App监听的广播;
    显示广播是针对某App的广播;

    6.常用广播:

    在这里插入图片描述

    展开全文
  • linux环境代码能发送UDP广播

    千次阅读 2019-05-24 13:57:53
    执行该命令:route add -net 255.255.255.255 netmask 255.255.255.255 dev eth0 metric 1 eth0是网络设备名称

    执行该命令:route add -net 255.255.255.255 netmask 255.255.255.255 dev eth0 metric 1

    eth0是网络设备名称

    展开全文
  • Android 本地广播与全局广播

    千次阅读 2018-08-06 16:23:47
    1. 全局广播和本地广播的区别 全局广播:发出去的广播可以被任何应用程序接收到 本地广播:发出去的广播只能被本应用程序接收到,一般使用LocalBroadcastManager对广播进行管理。 2.注册广播 注册广播的方式...

    1. 全局广播和本地广播的区别

    • 全局广播:发出去的广播可以被任何应用程序接收到

    • 本地广播:发出去的广播只能被本应用程序接收到,一般使用LocalBroadcastManager对广播进行管理。


    2.注册广播

    注册广播的方式一般有两种:

    • 在代码注册(动态注册)
    • 在AndroidManifest.xml中注册(静态注册)

    动态注册广播监听

    新建一个类,让它继承自BroadcastReceiver并重写父类的onReceive()方法就行了。当广播到来时,onReceive()方法会得到执行,开发者就可以在这个方法中进行处理相应的逻辑。

    //动态注册广播
     IntentFilter myIntentFilter = new IntentFilter();
     myIntentFilter.addAction(Constant.ACTION_NAME);
     registerReceiver(new MyReceiver(), myIntentFilter);
    public class MyReceiver extends BroadcastReceiver {
            @Override
            public void onReceive(Context context, Intent intent) {
                //相应逻辑处理
            }
        }

    静态注册广播监听

    动态注册广播缺点:动态注册的广播接收器可以自由的控制注册于注销,在灵活性方面有很大的优势,但是它也存在一个缺点,即必须要在程序启动之后才能接收广播。

    静态注册就可以很好的弥补这个缺点,想要使用静态注册必须满足两点:

    • 静态注册同样是要新建一个类继承BroadcastReceiver并重写onReceive()方法
    • 还需要在AndroidManifest.xml中将这个广播接收器的类名注册进去
    public class MyReceiver extends BroadcastReceiver {
    
            @Override
            public void onReceive(Context context, Intent intent) {
                //相应逻辑处理
            }
        }
    AndroidManifest.xml
    
    <receiver android:name=".MyReceiver"/>

    2.广播接收器

    Android中广播接收器主要可分两种类型:

    • 标准广播

      标准广播是一种完全异步执行的广播,在广播发出去之后,所有的广播接收
      器几乎都会在同一时刻接收到这条消息,因此它们之间无任何先后顺序可言。这种广播的效率会比较高,但同时也意味着它是无法被截断的。

    • 有序广播

      有序广播则是一种同步执行的广播,在广播发出去之后,同一时刻只会有一个广播接收器能够收到这条消息,当这个广播接收器中的逻辑执行完毕后,广播才会继续传递。所以此时的广播接收器是有先后顺序的,优先级高的广播接收器就可以先接收到广播消息,并且前面的广播接收器还可以截断正在传递的关公,这样的广播接收器就无法接收到消息了。


    发送标准广播

    1.先定义一个广播接收器来准备接受此广播
    
    public static class MyBroadcast extends BroadcastReceiver {
    
        @Override
        public void onReceive(Context context, Intent intent) {
             Toast.makeText(context, "接收到了自定义广播", Toast.LENGTH_SHORT).show();
        }
    }
    2.在AndroidManifest.xml中注册这个广播接收器
    
    <receiver android:name=".MyBroadcast">
         <intent-filter>
              <action android:name="com.example.mybroadcast" />
         </intent-filter>
    </receiver>
    3.发送一个广播
    
    button.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View v) {
             Intent intent = new Intent("com.example.mybroadcast");
             sendBroadcast(intent);
          }
    });

    发送有序广播

    为了直观的研究有序广播,我又新建了一个项目。这个项目的内容和之前的一样
    (广播接收器名为 MyBroadcast_B)

    发送有序广播只需要改动一行代码,即将sendBroadcast()方法改成sendOrderedBroadcast()方法。sendOrderedBroadcast()方法接收两个参数,第一个仍是Intent,第二个参数是与权限相关的字符串,这里传入null就行了

    button.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View v) {
            Intent intent = new Intent("com.example.mybroadcast");
            sendOrderedBroadcast(intent, null);
         }
    });

    通过android:priority属性给广播接收器设置优先级,从而设定广播接收器的先后顺序,优先级比较高的接收器就可以先收到广播。

    <receiver android:name=".MyBroadcast_B">
        <intent-filter android:priority="100">
           <action android:name="com.example.mybroadcast" />
        </intent-filter>
    </receiver>

    既然已经获得了优先权,那么我就可以让MyBroadcastReceive选择是否允许广播继续传递了,可以在onReceive()方法中添加abortBroadcast()方法,用来截断广播。

    public static class MyBroadcast_B extends BroadcastReceiver {
    
       @Override
       public void onReceive(Context context, Intent intent) {
          Toast.makeText(context, "接收到了自定义广播", Toast.LENGTH_SHORT).show();
    
          /*当MyBroadcast_B 接收到消息后 并截断。
           *此时MyBroadcast将不会再接收到广播 
           */
          abortBroadcast();
       }
    }

    全局广播安全性

    为了提高全局广播的安全性,一般会增加权限等控制

    <permission android:name="com.example.mybroadcast"/>
    
    <receiver  android:name=".MyBroadcast_B"
               android:exported="true"
               android:permission="com.example.mybroadcast">
         <intent-filter>
            <action android:name="com.example.mybroadcast" />
         </intent-filter>
    </receiver>

    3.本地广播

    之前所讲的发送和接收广播都是属于系统全局广播,也就是说发出的广播可以被其他任何应用程序接收到,这样大大降低了安全性。因此Android中引入了一套本地广播机制,使用这个机制发出的广播只能够在应用程序的内部进行传递,并且广播接收器也只接收来自本地应该程序发出的广播,大大的解决了广播的安全性问题。用法并不复杂,主要就是使用了一个LocalBroadcastManager来对广播进行管理,并提供了发送广播和注册广播接收器的方法

    public class LocalBroadcastMngActivity extends AppCompatActivity {
    
        private IntentFilter intentFilter;
        private LocalReceiver localReceiver;
        private LocalBroadcastManager localBroadcastManager;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_local_broadcast_mng);
    
            localBroadcastManager = localBroadcastManager.getInstance(this);//获取实例
    
            Button button = (Button) findViewById(R.id.button);
            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent("com.example.mybroadcast");
                    localBroadcastManager.sendBroadcast(intent);//发送本地广播
                }
            });
            intentFilter = new IntentFilter();
            intentFilter.addAction("com.example.mybroadcast");
            localReceiver = new LocalReceiver();
            //注册本地广播监听器
            localBroadcastManager.registerReceiver(localReceiver, intentFilter);
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            unregisterReceiver(localReceiver);//取消注册
        }
    }
    class LocalReceiver extends BroadcastReceiver {
     @Override
     public void onReceive(Context context, Intent intent) {
        Toast.makeText(LocalBroadcastMngActivity.this, "接收到本地广播", Toast.LENGTH_SHORT).show();
     }
    }

    地广播的用法和之前动态注册广播的用法大致相同,只不过现在首先是通过LocalBroadcastManagergetInstance()方法得到了它的一个实例;然后再注册广播接收器的时候调用的是LocalBraodcastManagersendBroadcast()方法,仅此而已。
    另外一点还需要说明,本地广播是无法通过静态注册的方式来接收的。

    本地广播的优点

    1. 可以明确的知道正在发送的广播不会离开我们的程序,因此不需要担心机密数据泄露问题

    2. 其他的程序无法将广播发送到我们程序的内部,因此不需要担心会有安全漏洞的隐患。

    3. 发送本地广播比起发送系统全局广播将会更加高效。

    展开全文
  • Linux网络编程——广播

    万次阅读 2015-05-08 18:58:16
    概述在生活中广播无处不在,像平时在大街上卖物品的商人,在进行推广产品的时候往往都是使用一个喇叭来进行吆喝:“十块钱买了吃亏,十块钱买了上当,走过路过千万不要错过”,这就是广播。那么在网络中的广播又...
  • 关于Android P的广播知道的事儿

    千次阅读 2018-04-26 21:05:37
    最近在做Android P的手机适配,发现app在Android P的系统中出现了严重bug,这一bug就与广播有关,通过翻译官网资料如下,并按照官网提示解决问题。广播概述Android应用可以发送或接收来自Android系统和其他Android...
  • 后台执行限制 Android 8.0 为提高电池续航时间而引入的变更之一是,当您的应用进入已缓存状态时,如果没有活动的组件,系统将解除应用具有的所有唤醒锁。 此外,为提高设备性能,系统会限制未在前台运行的应用的...
  • android 开机广播接收到的原因

    万次阅读 2017-10-18 10:01:21
    并且应用处于stoped状态,那么开机广播等系统广播正常情况下是可以收到的,但是有些厂商自己修改了系统,默认是禁止应用收到开机广播的,需要用户去应用管理里面找到自己的应用,然后手动允许开机自启,这样才能...
  • 关于android收到开机广播

    千次阅读 2012-12-24 11:12:09
    Android3.1后Boot_COMPLETED广播不响应的问题  最近在做一个应用,要求开机自启动服务,网上找的开机自启动应用基本上都是能过接收开机广播来实现的,但有时候会收广播,在网上查了下,解释如下:  ...
  • spark 广播变量 之广播表(dataframe)

    千次阅读 2019-09-14 22:28:33
    Broadcast variables(广播变量)允许程序员将一个read-only(只读的)变量缓存到每台机器上,而不是给任务传递一个副本。它们是如何来使用呢,例如,广播变量可以用一种高效的方式给每个节点传递一份比较大的input ...
  • Android开发之接收系统广播消息

    千次阅读 多人点赞 2014-08-08 15:01:50
    BroadcastReceiver除了接收用户所发送的广播消息之外,还有一个重要的用途:接收系统广播。如果应用需要在系统特定时刻执行某些操作,就可以通过监听系统广播来实现。Android的大量系统事件都会对外发送标准广播
  • 是一种异步执行广播,在广播发出之后,所有的广播接收器几乎在同一时刻接收到这条广播消息,因此它们之间没有任何先后顺序可言。这种广播效率会比较高,同时也是无法被截断或修改数据的。这种广播是全...
  • Android广播机制详解

    万次阅读 2016-06-07 23:16:13
    1 广播类型 从广播的注册方式来分,分为以下2种: (1)静态广播:通过的形式在AndroidManifest.xml中注册的广播; (2)动态广播:通过context. registerReceiver在程序中显示注册的广播; 上面静态广播和动态广播...
  • Android:BroadcastReceiver注册的...在AndroidManifest.xml里通过标签声明 属性说明: android:enabled=["true" | "false"] //此broadcastReceiver能否接收其他App的发出的广播 //默认值是由receiver中有无intent-fi
  • Android广播中弹窗 BroadcastReceiver Dialog

    千次阅读 2017-09-18 10:05:16
    于是断点调试,接收推送的广播onReceive()代码执行了,弹窗的代码也执行了,但是就是没有弹窗。纠结~~问度娘吧。原因出于安全原因的考虑,Android是不允许Activity或Dialog凭空出现的,一个Activity的启动必须要建立...
  • Android BroadcastReceive广播详解

    万次阅读 2018-12-20 20:16:56
    定义 是一个全局的监听器 ...1.广播接收器接收到相应广播后,会自动回调 onReceive() 方法 2.一般情况下,onReceive方法会涉及 与 其他组件之间的交互,如发送Notification、启动Service等 3.默认情况...
  • 广播——broadcast

    千次阅读 2016-05-27 17:52:13
    广播机制简介 广播分类 标准广播 有序广播 接收系统广播 动态注册监听网络变化 静态注册实现开机启动 注意耗时操作 发送自定义广播 发送有序广播 发送有序广播步骤 优先级 使用本地广播 出现原因 本地广播使用 优点 ...
  • 前言:最近在学习MarsChen老师的Android视频中的广播机制一节,BroadcastReceiver。学到监听系统短信通知,自己用Android Studio按照老师步骤写下来,然后用Android Studio默认自带的模拟器运行(Android Emulator -...
  • Android广播之发送广播的源码分析

    千次阅读 2016-07-25 14:22:03
    前面文章介绍了Android注册广播的过程,这篇介绍下广播的...2.AMS接收到这个广播后,首先找到与这个广播对应的广播接收者,然后将它们添加到一个广播调度队列中,再将这个调度队列传递给BroadcastQueue,最后向Broadc
  • 广播和组播

    万次阅读 2018-08-11 19:11:32
     网络信息传输主要有4种方式:单播(unicast)、任播(anycast)、组播(multicast)和广播(broadcast)。广播和组播为应用程序提供了两种服务:数据分组交付至多个目的地,通过客户端请求/发现服务器。  ·交付...
  • spark广播变量和累加器

    千次阅读 2017-01-13 10:14:23
    spark广播变量和累加器 广播变量 Spark中分布式执行的代码需要传递到各个...广播变量允许将变量只广播(提前广播)给各个Executor。该Executor上的各个Task再从所在节点的BlockManager获取变量,而不是从Driver获
  • TCP/IP之广播

    千次阅读 2014-12-19 09:36:47
    IPv6支持广播,使用广播的任何IPv4应用程序一旦移植到IPv6就必须改用多播重新编写。 TCP/IP中的广播分为4个类型: 1. 受限的广播  受限的广播地址是255.255.255.255。该地址用于主机配置过程中IP数据
  • 有序广播的使用方法

    千次阅读 2016-04-19 10:58:21
    标准广播(Normal broadcasts)是一种完全异步执行广播,在广播发出之后,所有的 广播接收器几乎都会在同一时刻接收到这条广播消息,因此它们之间没有任何先后顺序可 言。这种广播的效率会比较高,但同时也意味着...
  • Android开发——广播机制

    千次阅读 2018-05-14 14:34:42
    Android提供一套完整的API,允许应用程序自由地发送和接收广播。发送广播即Intent,接收广播的方法则需引入——广播接收器(Broadcast Receiver)广播类型标准广播(Normal broadcasts)是一种完全异步...
  • spark2.x-广播变量

    千次阅读 2018-06-18 13:17:32
    广播变量允许程序员保持只读变量,在每个机器上缓存,而不是用任务来发送它的副本。它们可以有效的方式给每个节点提供一个大的输入数据集的副本。spark尝试使用高效广播算法来分发广播变量以减少通信成本。注意,...
  • 1,概念1.1 广播变量:广播变量允许程序员将一个只读的变量缓存在每台机器上,而不用在任务之间传递变量。广播变量可被用于有效地给每个节点一个大输入数据集的副本。Spark还尝试使用高效地广播算法来分发变量,进而...
  • 静态广播接收者、动态广播接收者对比 知识点提取出的demo: 用两种方式实现如下需求(使用动态和静态注册广播):编写一个程序,要求在activity中点击一个button,发送一个广播(该广播的intent中携带一个字符串...
  • 图解 Android 广播机制

    千次阅读 2014-10-09 11:34:19
    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://terryblog.blog.51cto.com/1764499/376621 从现实生活中理解广播机制 一听到广播我们第...
  • 广播的类型 标准广播 ...Ordered broadcasts,一种同步执行广播, 在广播发出之后, 同一时刻只会有一个广播接收器能够收到这条广播消息,当这个广播接收器中的逻辑执行完毕后, 广播才会继续传递

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 89,404
精华内容 35,761
关键字:

不允许广播执行