android 注册广播有多少种方式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 两种!

Android 广播接收者

安卓实现广播有两种方式

方式1:动态注册

方式2:配置文件注册

 

下面我们来实现方式1,动态注册

首先我们来定义一个接收者,继承BroadcastReceiver ,并且重写onReceive方法,当指定的广播发出,系统自动调用onReceive方法。

public class MyReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent)
    {
        //得到广播中传递的数据
        String data = intent.getStringExtra("data");
        Log.i("shxtapp","接收到数据:"+data);
    }
}

接下来我们注册这个广播接收者,这里我们指定了广播的action是"setAction",只有系统发出这个广播,才能被我们接收。

MyReceiver receiveBroadCast = new MyReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction("setAction"); //只有持有相同的action的接受者才能接收此广播
registerReceiver(receiveBroadCast, filter);
Log.i("shxtapp","注册接收者完毕");

 

接下来我们模拟发出广播

Intent intent = new Intent();  //Itent就是我们要发送的内容
intent.putExtra("data", "传递的数据");
intent.setAction("setAction");
//设置你这个广播的action,只有和这个action一样的接受者才能接受者才能接收广播
sendBroadcast(intent);   //发送广播
 Log.i("shxtapp","发送完毕");

当我们发出广播,我们定义的广播接收者就接到我们的广播,并且能够获取到我们传递的数据。


 

方式2:配置文件注册

接下来我们试一试,如何同通过配置文件来注册一个广播接收者

同样的,还是先定义一个广播接收者,这一次我们接收系统打电话的广播信息。

public class MyReceiver2 extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String phoneNumber = getResultData();//获取电话号码
        Log.i("shxtapp", "call OUT:" + phoneNumber);

    }
}

 

然后再AndroidManifest.xml文件中做如下配置,在application标签中,和activity同级即可。

<receiver android:name="com.ccshxt.shxt.MyReceiver2">
            <intent-filter>
                <action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
            </intent-filter>
</receiver>

该配置指定这个广播接收者接收向外呼叫的电话的广播,即打电话的时候系统发出广播,我们就能接收到了。

同时我们要配置权限<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>,没有权限就不能进行电话相关的操作了。

 

这两种方法定义的广播接收者都能接受指定的广播,但有些不同。

方法1动态注册的广播接收者只能在应用激活的时候生效,如果应用被关闭则不起作用。

方法2配置的广播接收者在任何时候都生效,即使应用被关闭。

是不是很简单,小伙伴们来试一试。

以上是关于android 注册广播有多少种方式的主要内容,如果未能解决你的问题,请参考以下文章

Android本地广播的使用

Android中BroadcastReceiver的两种注册方式(静态和动态)详解

Android 广播接收者

Android--静态广播和动态广播的区别

Android广播(BroacastReceiver)与服务(Service)

Android面试四大组件之广播BroadCast