* 添加权限 <uses-permission android:name="android.permission.RECEIVE_SMS"/> * 4.0以后广播接收者安装以后必须手动启动一次,否则不生效 * 4.0以后广播接收者如果被手动关闭,就不会再启动了 ------------------------------------------------------------------------ #监听SD卡状态 * 清单文件中定义广播接收者接收的类型,监听SD卡常见的三种状态,所以广播接收者需要接收三种广播 <receiver android:name="com.itheima.sdlistener.SDStatusReceiver"> <intent-filter > <action android:name="android.intent.action.MEDIA_MOUNTED"/> SD卡就绪广播 <action android:name="android.intent.action.MEDIA_REMOVED"/> SD卡移除广播 <action android:name="android.intent.action.MEDIA_UNMOUNTED"/> SD卡拔出广播 <data android:scheme="file"/> 系统发送广播的时候带了数据 </intent-filter> </receiver> * 广播接收者的定义 public class SDCardReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // 区分接收到的是哪个广播 String action = intent.getAction(); if(action.equals("android.intent.action.MEDIA_MOUNTED")){ System.out.println("sd卡就绪"); } else if(action.equals("android.intent.action.MEDIA_UNMOUNTED")){ System.out.println("sd卡被移除"); } else if(action.equals("android.intent.action.MEDIA_REMOVED")){ System.out.println("sd卡被拔出"); } } } ------------------------------------------------------------------------ #勒索软件 * 接收开机广播,在广播接收者中启动勒索的Activity * 清单文件中配置接收开机广播 <receiver android:name="com.itheima.lesuo.BootReceiver"> <intent-filter > <action android:name="android.intent.action.BOOT_COMPLETED"/> </intent-filter> </receiver> * 权限 <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> 接收开机成功广播的权限 * 定义广播接收者 @Override public void onReceive(Context context, Intent intent) { //开机的时候就启动勒索软件 Intent it = new Intent(context, MainActivity.class); context.startActivity(it); } * 以上代码还不能启动MainActivity,因为广播接收者的启动,并不会创建任务栈,那么没有任务栈,就无法启动activity * 手动设置创建新任务栈的flag it.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); ------------------------------------------------------------------------ #监听应用的安装、卸载、更新 > 原理:应用在安装卸载更新时,系统会发送广播,广播里会携带应用的包名 * 清单文件定义广播接收者接收的类型,因为要监听应用的三个动作,所以需要接收三种广播 <receiver android:name="com.itheima.applistener.APPStatusReceiver"> <intent-filter > <action android:name="android.intent.action.PACKAGE_ADDED"/> 应用安装消息 <action android:name="android.intent.action.PACKAGE_REPLACED"/>应用更新消息 <action android:name="android.intent.action.PACKAGE_REMOVED"/>应用卸载消息 <data android:scheme="package"/>发送广播时携带的data是安装删除软件的包名 </intent-filter> </receiver> * 广播接收者的定义 public void onReceive(Context context, Intent intent) { //区分接收到的是哪种广播 String action = intent.getAction(); //获取广播中包含的data,应用软件的包名 Uri uri = intent.getData(); if(action.equals("android.intent.action.PACKAGE_ADDED")){ System.out.println(uri + "被安装了"); } else if(action.equals("android.intent.action.PACKAGE_REPLACED")){ System.out.println(uri + "被更新了"); } else if(action.equals("android.intent.action.PACKAGE_REMOVED")){ System.out.println(uri + "被卸载了"); } } ----------------------------------------------------------------------- #广播的两种类型(广播可以跨应用进行) * 无序广播:所有跟广播的intent匹配的广播接收者都可以收到该广播,并且是没有先后顺序(同时收到,不能修改广播数据并且不可以截断广播) * 有序广播:所有跟广播的intent匹配的广播接收者都可以收到该广播,但是会按照广播接收者的优先级来决定接收的先后顺序(可以截断广播) * 优先级的定义:-1000~1000 * 最终接收者:所有广播接收者都接收到广播之后,它才接收,并且一定会接收 * abortBroadCast:阻止其他接收者接收这条广播,类似拦截,只有有序广播可以被拦截 package com.itheima.center; import android.os.Bundle; import android.app.Activity; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.view.Menu; import android.view.View; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void click(View v){ Intent intent = new Intent(); intent.setAction("com.itheima.fdm"); //发送有序广播 //new MyReceiver()这个resultReceiver:不需要在清单文件中配置,这个广播接收者只接受该条有序广播,并且是最后一个收到该广播,并且一定可以收到该广播(即使被截断了也能够收到) sendOrderedBroadcast(intent, null, new MyReceiver(), null, 0, "每人发100斤大米", null); } // class MyReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { String text = getResultData(); System.out.println("反贪局收到文件:" + text); } } } /*清单文件: <receiver android:name="com.itheima.local.ShengZF"> <intent-filter android:priority="1000"> <action android:name="com.itheima.fdm"/> </intent-filter> </receiver> <receiver android:name="com.itheima.local.ShiZF"> <intent-filter android:priority="800"> <action android:name="com.itheima.fdm"/> </intent-filter> </receiver> <receiver android:name="com.itheima.local.XianZF"> <intent-filter android:priority="600"> <action android:name="com.itheima.fdm"/> </intent-filter> </receiver>*/ package com.itheima.local; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; public class ShengZF extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub String text = getResultData(); System.out.println("省政府收到文件:" + text); setResultData("每人发80斤大米"); abortBroadcast();//广播不再传递 } }