`

BroadCastReceiver android 广播接收器

阅读更多

4, 在onCreate方法中Bundle savedInstanceState 这个参数有什么作用?

在onCreate方法中有saveInstanceState这个参数,其实这个参数对应两个方法。

void onSaveInstanceState(Bundle outState);void onRestoreInstanceState(Bundle savedInstanceState)。当某个activity变得“容易”被系统销毁时,说白了就是系统在内存不足或者其他异常情况下把你的Activity销毁时,将调用这个方法。需要注意的是它是系统调用的,并且你的Activity是被动得被销毁。你可以在销毁的时候保存一下数据。然后在onCreate方法中拿出来。那什么情况下能触发这两个方法呢?

1)、当用户按下HOME键时。

这是显而易见的,系统不知道你按下HOME后要运行多少其他的程序,自然也不知道activity A是否会被销毁,故系统会调用onSaveInstanceState,让用户有机会保存某些非永久性的数据。以下几种情况的分析都遵循该原则

2)、长按HOME键,选择运行其他的程序时。

3)、按下电源按键(关闭屏幕显示)时。

4)、从activity A中启动一个新的activity时。

5)、屏幕方向切换时,例如从竖屏切换到横屏时。

在屏幕切换之前,系统会销毁activity A,在屏幕切换之后系统又会自动地创建activity A,所以onSaveInstanceState一定会被执行

 

总而言之,onSaveInstanceState的调用遵循一个重要原则,即当系统“未经你许可”时销毁了你的activity,则onSaveInstanceState会被系统调用,这是系统的责任,因为它必须要提供一个机会让你保存你的数据(当然你不保存那就随便你了)。

 

至于onRestoreInstanceState方法,需要注意的是,onSaveInstanceState方法和onRestoreInstanceState方法“不一定”是成对的被调用的,onRestoreInstanceState被调用的前提是,activity A“确实”被系统销毁了,而如果仅仅是停留在有这种可能性的情况下,则该方法不会被调用,例如,当正在显示activity A的时候,用户按下HOME键回到主界面,然后用户紧接着又返回到activity A,这种情况下activity A一般不会因为内存的原因被系统销毁,故activity A的onRestoreInstanceState方法不会被执行

 

另外,onRestoreInstanceState的bundle参数也会传递到onCreate方法中,你也可以选择在onCreate方法中做数据还原。

 


 

5, 谈谈你对BroadCastRceiver的理解?

广播接收者,android四大组件之一,也是唯一一个能动态注册的组件。

1)广播接收者是一个专注于接收广播通知信息,并做出对应处理的组件。很多广播是源自于系统──比如,通知时区改变、电池电量低、拍摄了一张照片或者用户改变了语言选项。应用程序也可以进行广播──比如说,通知其它应用程序一些数据下载完成并处于可用状态。

2)应用程序可以拥有任意数量的广播接收者以对所有它感兴趣的通知信息予以响应。所有的接收器均继承自BroadcastReceiver基类。

3)广播接收者没有用户界面。然而,它们可以启动一个activity来响应它们收到的信息,或者用NotificationManager来通知用户。通知可以用很多种方式来吸引用户的注意力──闪动背灯、震动、播放声音等等。一般来说是在状态栏上放一个持久的图标,用户可以打开它并获取消息。

6, 广播分几种?他们有什么区别?

广播被分为两种不同的类型:“普通广播(Normal broadcasts)”和“有序广播(Ordered broadcasts)”。普通广播是完全异步的,可以在同一时刻(逻辑上)被所有接收者接收到,消息传递的效率比较高,但缺点是:接收者不能将处理结果传递给下一个接收者,并且无法终止广播Intent的传播。

    然而有序广播是按照接收者声明的优先级别,被接收者依次接收广播。如:A的级别高于B,B的级别高于C,那么,广播先传给A,再传给B,最后传给C 。优先级别声明在 intent-filter 元素的 android:priority 属性中,数越大优先级别越高,取值范围:-1000到1000,优先级别也可以调用IntentFilter对象的setPriority()进行设置 。有序广播的接收者可以终止广播Intent的传播,广播Intent的传播一旦终止,后面的接收者就无法接收到广播。

 

   另外,有序广播的接收者可以将数据传递给下一个接收者,如:A得到广播后,可以往它的结果对象中存入数据,当广播传给B时,B可以从A的结果对象中得到A存入的数据。

 

   Context.sendBroadcast()

 

发送的是普通广播,所有订阅者都有机会获得并进行处理。

 

   Context.sendOrderedBroadcast()

 

发送的是有序广播,系统会根据接收者声明的优先级别按顺序逐个执行接收者,

 前面的接收者有权终止广播(BroadcastReceiver.abortBroadcast()),如果广播被前面的接收者终止,后面的接收者就再也无法获取到广播。对于有序广播,前面的接收者可以将数据通过setResultExtras(Bundle)方法存放进结果对象,然后传给下一个接收者,下一个接收者通过代码:Bundle bundle = getResultExtras(true))可以获取上一个接收者存入在结果对象中的数据。

 

7, 广播的生命周期?

广播的生命周期是非常短的,当发送之后intent会到AndroidManifest.xml文件中找是不是有匹配的action,如果有就会调用Receiver ,然后获得Receiver 对象,再执行onReceive方法,这时候Receiver对象就没有用了,当我们再次点击按钮的时候就会重新获得对象,这就是BroadcastReceiver的生命周期.

在BroadcastReceiver里不能做一些比较耗时的操作,否侧会弹出ANR(Application No

Response)的对话框.

如果需要完成一项比较耗时的工作,应该通过发送Intent给Service,由Service来完成.这里不能使用子线程来解决,因为BroadcastReceiver的生命周期很短,子线程可能还没有结束,BroadcastReceiver就先结束了.BroadcastReceiver一旦结束,此时BroadcastReceiver的所在进程很容易在系统需要内存时被优先杀死,因为它属于空进程(没有任何活动组件的进程).如果它的宿主进程被杀死,那么正在工作的子线程也会被杀死.所以采用子线程来解决是不可靠的.

8, 两种注册BroadcastReceiver的方法?

使用在manifest中注册的方法注册BroadcastReceiver,即使你的应用程序没有启动,或者已经被关闭,这个BroadcastReceiver依然会继续运行,这样的运行机制可能会给软件的用户造成困扰。所以作为程序的开发者,我们希望能够有一种灵活的机制完成BroadcastReceiver的绑定和解除绑定操作。Android当然也考虑到了这些问题,所以在Context这个类当中提供了如下两个函数可以在代码中注册:

 

i. registerReceiver(receiver,filter);

    这个函数的作用就是将一个BroadcastReceiver注册到应用程序当中,这个函数接收两个参数,第一个参数是需要注册的BroadcastReceiver对象,第二个是一个IntentFilter。第一个参数是非常容易理解的,第二个参数的作用是定义了哪些Intent才能触发这个注册的BroadcastReceiver对象。

 

ii. unregisterReceiver(receiver);

    这个方法就非常的简单了,用于解除BroadcastReceiver的绑定状态。一旦解除完成,响应的BroadcastReceiver就不会再接收系统所广播的Intent了。

 

两种注册BroadcastReceiver的方法

 

  1.在应用程序的代码中进行注册

   注册BroadcastReceiver

    registerReceiver(receiver,filter);

   取消注册BroadcastReceiver

    unregisterReceiver(receiver);

  2.在AndroidManifest.xml当中进行注册

 

   <receiver android:name="SMSReceiver">

    <intent-filter>

     <action android:name="android.provider.Telephony.SMS_RECEIVED" />

    </intent-filter>

   </receiver>

 

两种注册BroadcastReceiver方法的比较:

现在我们了解了两种注册BroadcastReceiver的方法之后,需要考虑一下这两种方法适用的场合:

 

i. 第一种注册的方法可以保证在应用程序安装之后,BroadcastReceiver始终处于活动状态,通常用于监听系统状态的改变,比如说手机的电量,wifi网卡的状态(当然,监视这些东西也是取决于软件的需求)。对于这样的BroadcastReceiver,通常是在产生某个特定的系统事件之后,进行相应的操作,比如说wifi网卡打开时,给用户一个提示;

 

ii. 第二种注册方法相对第一种要灵活的多,这样注册的BroadcastReceiver通常用于更新UI的状态。一般来说,都是在一个Activity启动的时候使用这样的方法注册BroadcastReceiver,一旦接收到广播的事件,就可以在onReceive方法当中更新当前的这个Activity当中的控件。但是需要注意的是如果这个Activity不可见了,就应该调用unregisterReceiver方法来解除注册

9, 粘性广播有什么作用?怎么使用?

粘性广播主要为了解决,在发送完广播之后,动态注册的接收者,也能够收到广播。举个例子首先发送一广播,我的接收者是通过程序中的某个按钮动态注册的。如果不是粘性广播,我注册完接收者肯定无法收到广播了。这是通过发送粘性广播就能够在我动态注册接收者后也能收到广播。

用法:

//发送粘性广播

Public void sendStickyBroadCast(){

        Intent intent=new Intent();

intent.setAction(“com.iteye.myreceiver.action”);

intent.putExtra(“name”,”tom”);

this.sendStickyBroadCast(intent);

 

}

发送粘性广播还需要发送粘性广播的权限:<uses-permission android:name="android.permission.BROADCAST_STICKY" />

//动态注册广播接收者

MyReceiver mr = new MyReceiver ();

IntentFilter filter = new IntentFilter();

filter.addAction("com.iteye.myreceiver.action ");

filter.addCategory(Intent.CATEGORY_DEFAULT);

Intent ii = this.registerReceiver(mr, filter);

String n = ii.getStringExtra("name");

Toast.makeText(this, "动态注册接收者完成,收到粘性广播,name=" + n, 1).show();

10,如何控制接收者或者发送方得权限?

       1)如果广播发送方要求接收方必须有某个权限才能收到广播怎么做呢?

       /**

        * 发送广播,指定接收者权限

        * sendBroadcast(i, "com.iteye.permission.receiver");//指定接收者权限

        */

       public void sendBroadcast() {

              //隐式意图,发送广播

              Intent i = new Intent();

              i.setAction("com.iteye.receiver.action");

              i.putExtra("name", "tom");

              this.sendBroadcast(i, " com.iteye.permission.receiver ");

              Log.i("Other",".send ok!");

       }

       在清单文件里receiver必须有这个权限才能收到广播。

       首先,需要定义权限:<permission android:name=" com.iteye.permission.receiver " />

       然后,声明权限:<uses-permission android:name=" com.iteye.permission.receiver " />

       这时接收者就能收到发送的广播。

       2)反过来,如果接收者要求发送方必须拥有某个权限,我才接收你的广播怎么办呢?

       <!-- 注册广播接收者

               android:permission:控制发送方需要具备指定权限,才接收其广播.

    -->

     <receiver android:name=".MyReceiver" android:permission="com.permission.sender">

               <intent-filter android:priority="100">

                      <action android:name="com.iteye.receiver.action" />

                      <category android:name="android.intent.category.DEFAULT" />

               </intent-filter>

      </receiver>

       即使过滤器匹配,如果发送方没有相应权限,接收者也不会接收其广播。

分享到:
评论

相关推荐

    BroadcastReceiver广播接收器演示demo

    BroadcastReceiver,中文名为广播接收器,是Android系统中四大组件之一,用于接收系统或应用程序发布的广播事件。在Android系统中,任何组件或者服务都可以发送广播,而BroadcastReceiver则可以监听并响应这些广播,...

    Android广播onReceiver回调更新ui

    在Android系统中,广播接收器(BroadcastReceiver)是一种非常重要的组件,它允许应用程序接收并响应系统或应用广播的意图(Intent)。"Android广播onReceiver回调更新ui"这个主题主要涉及如何在广播接收器中处理...

    基于Android的广播接收器的设计与应用.pdf

    广播接收器(BroadcastReceiver)是一种用来过滤、接收并响应广播的组件,通过广播接收器可以监听系统中的广播消息,在不同组件之间进行通信。例如,在Android系统中内置了很多系统级别的广播,如手机开机完成后会...

    android 广播接收完整源码

    在提供的源码中,可能包含了广播接收器的创建、注册、IntentFilter的设置以及onReceive()方法的实现等内容,通过分析这些代码,你可以深入理解Android广播接收器的工作原理和用法。如果源码包含了一些特殊功能或优化...

    Android 广播接收器案例

    在Android系统中,广播接收器(BroadcastReceiver)是一种非常重要的组件,它允许应用程序在接收到系统或应用广播消息时执行相应的操作。这个案例主要探讨如何创建、注册和使用BroadcastReceiver来处理Android系统的...

    Android 广播接收者--BroadcastReceiver

    在Android系统中,广播接收者(BroadcastReceiver)是四大组件之一,它负责监听并响应系统或应用程序发布的广播意图(Intent)。BroadcastReceiver可以帮助我们实现后台运行的任务,即使应用没有在前台运行,也能...

    Android 广播接收 发送 demo

    在Android系统中,广播接收器(BroadcastReceiver)是一种重要的组件,它允许应用程序在不直接交互的情况下接收和响应系统或应用程序发出的广播 Intent。本篇将深入讲解如何在Android中实现广播接收与发送的Demo。 ...

    广播接收器-BroadcastReceiver 电池电量显示

    在Android系统中,BroadcastReceiver(广播接收器)是Android四大组件之一,用于监听系统或应用广播事件,并在接收到特定广播时执行相应的处理逻辑。广播接收器可以接收各种类型的广播,例如系统电量变化、网络状态...

    Android自学笔记-17-广播接收者(BroadcastReceiver)

    在Android开发中,广播接收者(BroadcastReceiver)是Android四大组件之一,它是系统用来传递全局消息的一种机制。当你创建一个BroadcastReceiver,你可以监听系统或应用发送的广播,并在接收到广播时执行相应的处理...

    探索广播接收器的使用

    首先,广播接收器(BroadcastReceiver)是Android中一个响应系统广播事件的组件。系统在发生特定事件时,如设备开机、网络状态改变、接收到SMS等,会发出广播Intent,广播接收器可以监听并响应这些事件,执行相应的...

    Android四大组件——BroadcastReceiver普通广播、有序广播、拦截广播、本地广播、Sticky广播、系统广播

    在Android应用开发中,BroadcastReceiver(广播接收器)是四大组件之一,它是系统用来传递消息和事件的重要机制。BroadcastReceiver可以监听系统或应用程序发送的广播Intent,并在接收到广播时执行相应的操作。以下...

    Android之Broadcast, BroadcastReceiver(广播)

    BroadcastReceiver(广播接收器)是Android四大组件之一,用于监听并接收系统或应用发布的广播事件。下面将详细阐述Android广播机制以及如何注册BroadcastReceiver。 1. Android广播机制: - 广播分为有序广播和...

    20.1 广播接收器案例

    在Android系统中,广播接收器(Broadcast Receiver)是一种重要的组件,它允许应用程序监听并响应系统或自定义广播事件。在“20.1 广播接收器案例”中,我们将深入探讨如何创建、注册和使用广播接收器,以及在实际...

    广播BroadcastReceiver静态动态有序广播

    **静态注册广播**则是在AndroidManifest.xml文件中进行的,这样广播接收器即使在应用未运行时也能接收到广播。这种方式适用于需要始终监听特定事件的情况,但缺点是会增加应用的内存占用。在manifest文件中的配置...

    【Android】动态注册广播接收器

    在Android系统中,广播接收器(Broadcast Receiver)是一种重要的组件,它允许应用程序监听并响应系统或自定义广播事件。在Android应用开发中,广播接收器分为静态注册和动态注册两种方式。本文主要聚焦于动态注册...

    Android应用程序注册广播接收器(registerReceiver)的过程分析

    Android 应用程序注册广播接收器(registerReceiver)是 Android 系统中一种重要的消息订阅/发布机制,用于实现应用程序之间的通信。在本文中,我们将探讨 Android 应用程序是如何注册广播接收器的,以及把广播接收器...

    广播接收器.zip

    广播接收器在Android系统中扮演着重要的角色,它是Android四大组件之一,用于监听并响应系统或应用程序发布的广播事件。在Android应用开发中,广播接收器可以让我们的应用在后台运行时仍然能够接收到某些特定事件的...

    BroadcastReceiver:广播接收器的基本操作

    广播接收器(BroadcastReceiver)是Android系统中的一个重要组件,它用于监听系统或应用程序发送的广播意图(Intent)。在Android中,任何对全局事件的响应,如设备启动、网络状态变化或者应用安装卸载等,都可以...

    Android Studio—接受多个广播、广播传递数据.zip

    在Android应用开发中,BroadcastReceiver(广播接收器)是一个关键组件,它允许应用程序接收和响应系统或自定义广播事件。Android Studio是Google官方推出的集成开发环境,专门用于Android应用开发。本教程将深入...

    android 跨应用程序广播发送接受

    本篇文章将深入探讨如何在Android中实现跨应用程序广播的发送与接收,并展示如何在广播接收器中弹出对话框。 首先,我们来看如何发送广播。在Android中,你可以使用`sendBroadcast()`方法来发送一个广播意图...

Global site tag (gtag.js) - Google Analytics