0%

Android广播

广播

就是用来通知APP信息的,分为静态和动态注册广播接受

静态注册

就是通过配置AndroidManifest.xml来进行广播接收的,首先我们要先写一个类,这个类也就是我们广播接收者类,要继承BroadcastReceiver这个类,并且重写onReceive方法,实例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package com.example.android_study17;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

public class MyBroad extends BroadcastReceiver
{

@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "reciver"+intent.getStringExtra("key"), Toast.LENGTH_SHORT).show();
//String str = getResultData();
//setResultData("179521"+str);
}

}

(注意这个类要用public修饰,内部的话呢还要用static修饰)(静态注册的时候)
传进来的intent是用来传输对象的,context就是上下文,我们可以通过获取结果数据getResultData,然后添加需要的东西setResultData进行数据改变。
我们写好这个类之后,我们就要进行配置,我们要监听手机拨号这个广播:
首先我们要先获取相对应的权限:

1
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>

有了权限之后,我们就需要配置接受者了:

1
2
3
4
5
<receiver android:name="com.example.android_study17.MyBroad">
<intent-filter >
<action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
</intent-filter>
</receiver>

receiver的名称是我们的类名,
有了包名就不需要写全了:

1
2
3
4
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.android_study17"
android:versionCode="1"
android:versionName="1.0" >

有了package其实就不需要写全名了。下面的intent-filter里面写的那个是你要收听广播的名称。
之后我们一要打电话了就可以进行数据的获取了。
静态注册的优点就是即使你关闭了程序,我们的类还是能够收听广播,而缺点就是因为一直收听所以只有卸载了才不会收听了。

动态注册

动态注册是根据需要在什么时候开始和结束监听:
注册:

1
2
3
4
IntentFilter filter = new IntentFilter();
filter.addAction("android.intent.action.NEW_OUTGOING_CALL");
br = new MyBroad();
registerReceiver(br,filter );

注册好之后,我们也是可以注销的:

1
unregisterReceiver(br);

动态注册的那个类没必要是public的,动态注册的优点就是灵活性高一些,但是程序关闭之后就算你没有注销广播,他一样还是会自动注销的,也就是说你收听不到了。

发送广播

就是我们给广播接收者发送广播:

1
2
3
4
5
Intent intent = new Intent();
intent.setAction("wker666.github.io");
intent.putExtra("key", "wker");
//sendBroadcast(intent);
sendBroadcast(intent,"com.wker.permission.xxx");

首先是这个intent可以带数据,我们要先进行设置域名,重载的方法有第二个参数,这个就是要求我们拥有的权限,所以我们要进行权限的分配,因为是我们自定义的权限,所以我们需要线进行全线的声明,然后再授权:

1
2
<permission android:name="com.wker.permission.xxx"/>
<uses-permission android:name="com.wker.permission.xxx"/>

这个样子就可以了,我们要接受这个广播的话呢,我们就要在动态或者静态注册中设置设个intent的URI:

1
filter.addAction("wker666.github.io");

发送广播的时候分为两种,一种是有序的,还有一种是无序的。

  1. 无序的就是用sendBroadcast方法,他是异步执行,不能够使用哪个get,set方法还有abortBroadcast方法。
  2. 有序的就是有执行先后顺序的执行,可以使用上面的方法,会根据广播接收者的优先级进行收听。
  • 动态设置优先级:
    1
    filter.setPriority(1);
  • 静态设置优先级
    1
    2
    3
    <intent-filter android:priority="1">
    <action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
    </intent-filter>
    优先级相同时,在AndroidManifest.xml先注册的先运行。
    优先级从-1000到+1000,数值越大优先级越大。

在有序中,我们使用get,set方法设置的参数,是因为我们调用的重载的这个API方法:

1
sendOrderedBroadcast(intent, receiverPermission, resultReceiver, scheduler, initialCode, initialData, initialExtras);

第三个参数是最后一个执行的广播接收者。

实例

一个监视短信接收的实例,首先我们需要配置我们的权限:

1
<uses-permission android:name="android.permission.RECEIVE_SMS"/>

我们有了权限之后我们就要编写我们的类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package com.example.android_study18;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.util.Log;

public class SMSReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
Log.d("wker", "receiver SMS");
Bundle bundle = intent.getExtras();
//短信数组
Object[] object = (Object[]) bundle.get("pdus");
for(Object obj:object)
{
SmsMessage pdu = SmsMessage.createFromPdu((byte[])obj);
Log.d("wker", pdu.getOriginatingAddress());
Log.d("wker", pdu.getMessageBody());
}
}

}

这个就是说,我们接受到短信之后我们就可以连同着获得intent携带者的bundle对象,通过这个对象获取键为“pdus”的值,然后强转为object数组,这个数组里面有我们需要的信息,然后用增强for循环来遍历这个数组,通过SmsMessage.createFromPdu这个静态方法获取短信信息的对象,然后调用方法获得相对应的信息。
配置广播接收者:

1
2
3
4
5
6
<receiver android:name="com.example.android_study18.SMSReceiver">
<intent-filter >
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>

</receiver>

有一点就是eclipse不会提示我们这个短信的名称,不知道为什么,测试的时候通过安卓模拟器自带的那个发短信功能就可以测试:
监听短信
可以发现广播接收者的优先级是高于之前的内容监听者的。