广播的概念:
Android中,系统会产生某一个事件时发送广播,应用程序使用广播接受者接收这个广播,就知道系统产生了什么事件。Android系统在运行的过程中,会产生很多事件,比如:开机、电量改变、收发短信、拨打电话、屏幕解锁等。
IP拨号器:接收拨打电话的广播
布局文件:
![](https://i-blog.csdnimg.cn/blog_migrate/cb229652b0497e379bc028680819adea.gif)
![复制代码](https://i-blog.csdnimg.cn/blog_migrate/efaf920154f0967032b6578564f3a93e.gif)
1 <?xml version="1.0" encoding="utf-8"?>
2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 xmlns:tools="http://schemas.android.com/tools"
4 android:id="@+id/activity_main"
5 android:layout_width="match_parent"
6 android:layout_height="match_parent"
7 android:paddingBottom="@dimen/activity_vertical_margin"
8 android:paddingLeft="@dimen/activity_horizontal_margin"
9 android:paddingRight="@dimen/activity_horizontal_margin"
10 android:paddingTop="@dimen/activity_vertical_margin"
11 tools:context="com.ahu.lichang.ipcaller.MainActivity"
12 android:orientation="vertical"
13 >
14
15 <EditText
16 android:id="@+id/et"
17 android:hint="请输入IP线路"
18 android:layout_width="match_parent"
19 android:layout_height="wrap_content" />
20
21 <Button
22 android:text="保存"
23 android:onClick="click"
24 android:layout_width="wrap_content"
25 android:layout_height="wrap_content" />
26 </LinearLayout>
![复制代码](https://i-blog.csdnimg.cn/blog_migrate/efaf920154f0967032b6578564f3a93e.gif)
MainActivity:
![](https://i-blog.csdnimg.cn/blog_migrate/cb229652b0497e379bc028680819adea.gif)
![复制代码](https://i-blog.csdnimg.cn/blog_migrate/efaf920154f0967032b6578564f3a93e.gif)
1 package com.ahu.lichang.ipcaller;
2
3 import android.content.SharedPreferences;
4 import android.support.v7.app.AppCompatActivity;
5 import android.os.Bundle;
6 import android.view.View;
7 import android.widget.EditText;
8
9 public class MainActivity extends AppCompatActivity {
10
11 @Override
12 protected void onCreate(Bundle savedInstanceState) {
13 super.onCreate(savedInstanceState);
14 setContentView(R.layout.activity_main);
15 }
16 public void click(View view){
17 EditText et = (EditText) findViewById(R.id.et);
18 SharedPreferences sp = getSharedPreferences("ip",MODE_PRIVATE);
19 sp.edit().putString("ipNumber",et.getText().toString()).commit();
20 }
21 }
![复制代码](https://i-blog.csdnimg.cn/blog_migrate/efaf920154f0967032b6578564f3a93e.gif)
CallerReceiver:
![](https://i-blog.csdnimg.cn/blog_migrate/cb229652b0497e379bc028680819adea.gif)
![复制代码](https://i-blog.csdnimg.cn/blog_migrate/efaf920154f0967032b6578564f3a93e.gif)
1 package com.ahu.lichang.ipcaller;
2
3 import android.content.BroadcastReceiver;
4 import android.content.Context;
5 import android.content.Intent;
6 import android.content.SharedPreferences;
7
8 /**
9 * Created by ahu_lichang on 2017/3/22.
10 */
11
12 public class CallerReceiver extends BroadcastReceiver {
13
14 @Override
15 public void onReceive(Context context, Intent intent) {
16 String number = getResultData();
17 if(number.startsWith("0")){
18 SharedPreferences sp = context.getSharedPreferences("ip",Context.MODE_PRIVATE);
19 String ipNumber = sp.getString("ipNumber","");
20 number = ipNumber + number;//在拨打电话前面加上ipNumber
21 setResultData(number);
22 abortBroadcast();//关闭广播
23 }
24 }
25 }
![复制代码](https://i-blog.csdnimg.cn/blog_migrate/efaf920154f0967032b6578564f3a93e.gif)
清单文件:
![](https://i-blog.csdnimg.cn/blog_migrate/cb229652b0497e379bc028680819adea.gif)
![复制代码](https://i-blog.csdnimg.cn/blog_migrate/efaf920154f0967032b6578564f3a93e.gif)
1 <?xml version="1.0" encoding="utf-8"?>
2 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
3 package="com.ahu.lichang.ipcaller">
4 <!--接收打电话广播需要的权限-->
5 <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>
6 <application
7 android:allowBackup="true"
8 android:icon="@mipmap/ic_launcher"
9 android:label="@string/app_name"
10 android:supportsRtl="true"
11 android:theme="@style/AppTheme">
12 <activity android:name=".MainActivity">
13 <intent-filter>
14 <action android:name="android.intent.action.MAIN" />
15
16 <category android:name="android.intent.category.LAUNCHER" />
17 </intent-filter>
18 </activity>
19 <!--配置接收广播的类型-->
20 <receiver android:name=".CallerReceiver">
21 <intent-filter>
22 <action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
23 </intent-filter>
24 </receiver>
25 </application>
26
27 </manifest>
![复制代码](https://i-blog.csdnimg.cn/blog_migrate/efaf920154f0967032b6578564f3a93e.gif)
监听应用的安装、卸载、更新
![](https://i-blog.csdnimg.cn/blog_migrate/cb229652b0497e379bc028680819adea.gif)
![复制代码](https://i-blog.csdnimg.cn/blog_migrate/efaf920154f0967032b6578564f3a93e.gif)
1 public class APPStatusReceiver extends BroadcastReceiver {
2
3 @Override
4 public void onReceive(Context context, Intent intent) {
5 // TODO Auto-generated method stub
6 String action = intent.getAction();
7 Uri uri = intent.getData();
8 if("android.intent.action.PACKAGE_ADDED".equals(action)){
9 Toast.makeText(context, uri.toString() + "被安装了", 0).show();
10 }
11 if("android.intent.action.PACKAGE_REPLACED".equals(action)){
12 Toast.makeText(context, uri.toString() + "被升级了", 0).show();
13 }
14 if("android.intent.action.PACKAGE_REMOVED".equals(action)){
15 Toast.makeText(context, uri.toString() + "被卸载了", 0).show();
16 }
17 }
18
19 }
![复制代码](https://i-blog.csdnimg.cn/blog_migrate/efaf920154f0967032b6578564f3a93e.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/cb229652b0497e379bc028680819adea.gif)
![复制代码](https://i-blog.csdnimg.cn/blog_migrate/efaf920154f0967032b6578564f3a93e.gif)
1 <receiver android:name="com.itheima.applistener.APPStatusReceiver">
2
3 <intent-filter >
4
5 <action android:name="android.intent.action.PACKAGE_ADDED"/>
6
7 <action android:name="android.intent.action.PACKAGE_REPLACED"/>
8
9 <action android:name="android.intent.action.PACKAGE_REMOVED"/>
10
11 <data android:scheme="package"/>
12
13 </intent-filter>
14
15 </receiver>
![复制代码](https://i-blog.csdnimg.cn/blog_migrate/efaf920154f0967032b6578564f3a93e.gif)
发送自定义广播
创建广播电台的步骤:
//创建一个传递消息的意图对象
Intent intent = new Intent();
//设置要广播的事件类型
intent.setAction("com.itheima.broadcast.HMSSDT");
//设置广播的消息数据
intent.putExtra("news", "新闻内容");
//发送一个广播消息
sendBroadcast(intent);
广播的两种类型
1、无序广播
所有跟广播的intent匹配的广播接收者都可以收到该广播,并且是没有先后顺序(同时收到)。
2、有序广播
所有跟广播的intent匹配的广播接收者都可以收到该广播,但是会按照广播接收者的优先级来决定接收的先后顺序。(有序广播可以被拦截,也可以被修改)
优先级:-1000~1000
最终接收者:所有广播接收者都接受到广播之后,他才接收,并且一定会接收(即便拦截也会收到)
abortBroadCast:阻止其他接收者接收这条广播,类似拦截,只有有序广播可以被拦截
发送有序广播:
Intent intent = new Intent();
intent.setAction("com.itheima.orderedbroadcast.ZYFFNTBT");
//发送一个有序的广播
//intent 意图
//permission 指定接收者需要添加了权限
//resultReceiver 指定哪个广播接收者最后接到消息
//scheduler 消息处理器
//initialCode 给消息指定初始代码
//initialData 指定消息的数据
//initialExtras 指定额外的参数
sendOrderedBroadcast(intent, null, null, null, 1, "900元", null);
广播接收者的配置文件:
<receiver android:name="com.itheima.zf.ProvinceBroadCastReceiver">
<intent-filter android:priority="1000" >
<action android:name="com.itheima.orderedbroadcast.ZYFFNTBT"/>
</intent-filter>
</receiver>
广播接收者的代码:
String info = getResultData();
System.out.println("--------消息:"+info);
setResultData("400元");//修改