12、注册广播有几种方式,这些方式有何优缺点?请谈谈Android引入广播机制的用意。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了12、注册广播有几种方式,这些方式有何优缺点?请谈谈Android引入广播机制的用意。相关的知识,希望对你有一定的参考价值。

    注册广播的分类:静态注册和动态注册。

    静态注册:在清单文件里直接注册,从app开启到app销毁,一直在接收广播,接收广播时间长,但是接收广播的优先级低于动态注册广播。

    动态注册:动态注册,动态销毁,从onCreate到取消注册,期间接收广播,接收广播时间是短且可控,接收广播的优先级高。例如:

    发送广播:
    Intent i = new Intent();
    i.setAction("ACTION_CLOSE");
    sendBroadcast(i);

    接受广播:
    onCreate()

    //注册广播的接受者
    IntentFilter filter = new IntentFilter();
    filter.addAction("ACTION_CLOSE_ACTIVITY");
    receiver = new InnerReceiver();
    registerReceiver(receiver, filter);


    private class InnerReceiver extends BroadcastReceiver
       @Override
       public void onReceive(Context context, Intent intent)
          //TODO 当前Activity接收到广播 需要做的事情
           
       


    //注销广播

    @Override
    protected void onDestroy()
       super.onDestroy();
       unregisterReceiver(receiver);


2.引入广播的原因:

a) 不同的app之间传信通用

b)发出一条指定,需要多个Activity都需要有反应


注意:以上仅供参考,如有疑问,请追问,谢谢。

参考技术A

注册方式----分为以下两种

常驻型广播</strong>:通过在配置文件里面注册广播属于常驻型广播,意思就是即便你应用程序结束,一旦有了对应的广播过来,其还是会被激活;---静态注册

非常驻型广播</strong>:而在代码里注册的广播则是非常驻型广播,比如在oncreate方法里面注册一个广播,那么在ondestroy里就可以BroadcastReceiver.abortBroadcast(),比如注册一个监听SD卡的广播。---动态注册。

1、在androidManifest.xml文件中注册

好处:一旦应用程序被安装到手机里,BroadCast Receiver就开始生效。无论应用程序进程是否运行,运用程序是否在开启状态下都可以接受到广播事件。 

2、直接在Manifest.xml文件的<application>节点中配置广播接收者。

<receiver android:name=".MyBroadCastReceiver">   
    <!-- android:priority属性是设置此接收者的优先级(从-1000到1000) -->       <intent-filter android:priority="20"> 
        <actionandroid:name="android.provider.Telephony.SMS_RECEIVED"/>         </intent-filter>  
</receiver>

2、通过代码的方式注册广播

好处:一旦运用程序停止,广播也跟着停止。

   实例化自定义的广播接收者、

   实例化意图过滤器,并设置要过滤的广播类型(如,我们接收收到短信系统发出的广播)

   使用Context的registerReceiver(BroadcastReceiver, IntentFilter, String, Handler)方法注册广播。

new出上边定义好的BroadcastReceiver 

MyBroadCastReceivery BroadCastReceiver = new MyBroadCastReceiver();
//实例化过滤器并设置要过滤的广播  
IntentFilter intentFilter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
//注册广播   
myContext.registerReceiver(smsBroadCastReceiver,intentFilter, 
             "android.permission.RECEIVE_SMS", null);

发送广播---有序和无序广播 

无序广播:所有的接收者都会接收事件,不可以被拦截,不可以被修改。

有序广播:按照优先级,一级一级的向下传递,接收者可以修改广播数据,也可以终止广播事件。 具体的就不罗列了,置于你说Android 引入广播的意图,我觉得你应该说他为什么要用广播这个组件----android的四大组件之一。应用范围很广泛,举个例子:短信的接收和屏蔽机制---360短信拦截(流氓软件,你干不过他),电池电量改变可以使用广播来监控、应用的开机自启也会用到广播和service结合使用等!它虽然不可见,但是很有用!

android 注册广播有多少种方式

有两种注册广播方式:
1.常驻型广播
常驻型广播,当应用程序关闭了,如果有广播信息来,写的广播接收器同样的能接收到,它的注册方式就是在应用程序的AndroidManifast.xml 中进行注册,这种注册方式通常又被称作静态注册。这种方式可以理解为通过清单文件注册的广播是交给操作系统去处理的。示例代码如下:
AndroidManifest.xml中配置广播

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="spl.broadCastReceiver"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".BroadCastReceiverActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

<!--广播注册、name里面填写广播类的路径-->
<receiver android:name=".SmsBroadCastReceiver">
<intent-filter android:priority="20">
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>

</application>

<uses-sdk android:minSdkVersion="7" />

<!-- 权限申请 -->
<uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>

</manifest>

2.非常驻型广播
非常驻型广播,当应用程序结束了,广播自然就没有了,比如在 Activity 中的 onCreate 或者 onResume 中注册广播接收者,在 onDestory 中注销广播接收者。这样广播接收者就一个非常驻型的了,这种注册方式也叫动态注册。这种方式可以理解为通过代码注册的广播是和注册者关联在一起的。比如写一个监听 SDcard 状态的广播接收者:
package cn.sunzn.mosecurity.activity;

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.os.Environment;

public class SDcard extends Activity
SdcardStateChanageReceiver sdcardStateReceiver;

protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
sdcardStateReceiver = new SdcardStateChanageReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_MEDIA_REMOVED);
filter.addAction(Intent.ACTION_MEDIA_EJECT);
filter.addAction(Intent.ACTION_MEDIA_MOUNTED);
filter.addDataScheme("file");
registerReceiver(sdcardStateReceiver, filter);


protected void onDestroy()
unregisterReceiver(sdcardStateReceiver);


class SdcardStateChanageReceiver extends BroadcastReceiver
public void onReceive(Context context, Intent intent)
checkSDCard();


public void checkSDCard()
String state = Environment.getExternalStorageState();
System.out.println(state);
if (state.equals(Environment.MEDIA_REMOVED) || state.equals(Environment.MEDIA_UNMOUNTED))
System.out.println("SDCard 已卸载!");



参考技术A 有两种方式,一种是静态注册,就是在manifest文件里配置一下,这种方式注册的广播属于系统级广播。你的应用没打开也能收到广播。比如你要做一个收到某广播就启动你的应用的功能可以这样搞。另一种是动态注册,在代码里执行一个rigisterBroadcastReciver(可能拼写有误)的方法。这种你要自己作好反注册。这种广播可以做成你的应用启动后才监听,关闭后就不监听的效果。本回答被提问者和网友采纳 参考技术B 两种!

以上是关于12、注册广播有几种方式,这些方式有何优缺点?请谈谈Android引入广播机制的用意。的主要内容,如果未能解决你的问题,请参考以下文章

android 注册广播有多少种方式

Multithread 什么时候处理多线程,有几种方式,优缺点?

面试题③

XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式?

进程间的通讯方式有几种?有啥优缺点

redis 持久化有几种方式?