BroadcastReceiver 的详细介绍网上的介绍已经是一抓一大把了,这里我就直接讲一下,BroadcastReceiver的使用方式:
BroadcastReceiver 的注册方式有两种:
1. Manifest.xml 注册
2. 代码动态注册
1. Manifest 清单文件里的注册方式:
<receiver android:name=".MyReicerver">
<intent-filter>
<action android:name="com.broadcast.mybroadcast" />
</intent-filter>
</receiver>
继承BroadcastReicerver
public class MyReicerver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String para = intent.getStringExtra("receiver");
Log.i("INFO",para);
}
}
在Activity中发送广播:
Intent intent = new Intent();
intent.setAction("com.broadcast.mybroadcast");
intent.putExtra("receiver", "myreicerver");
//无序广播
this.sendBroadcast(intent);
2. 代码动态注册:
</pre>继承BroadcastReicerver <pre name="code" class="java">public class MyReceiverLow extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
String para = intent.getStringExtra("receiver2");
Log.i("INFO",para);
}
}
Activity中注册:
IntentFilter filter = new IntentFilter();
filter.addAction("com.broadcast.myreceiverlow");
receiver = new MyReceiverLow();
//注册广播接受者
registerReceiver(receiver, filter);
发送广播:
Intent intent2 = new Intent();
intent2.setAction("com.broadcast.myreceiverlow");
intent2.putExtra("receiver2", "myreceiverlow");
sendBroadcast(intent2);
在Activity的onPause()注销
unregisterReceiver(receiver);
现在来看看BroadcastReicerver的扩展应用:
1. 监听电池低于某个值时的变化:
1)在Manifest清单文件中添加权限:
<uses-permission android:name="android.permission.BATTERY_STATS" />
2) 创建BroadcastReiverver类:
public class BattaryBroadCast extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
if(intent.getAction().equals(Intent.ACTION_BATTERY_CHANGED)){
//得到系统当前电量
int level=intent.getIntExtra("level", 0);
//取得系统总电量
int total=intent.getIntExtra("scale", 100);
Log.e("Test","当前电量:"+(level*100)/total+"%");
//当电量小于15%时触发
if(level>15){
Toast.makeText(context, "当前电量已小于15%",Toast.LENGTH_LONG).show();
}
}
}
}
2.Android中检查、监听电量和充电状态的方法
1)在Manifest清单文件中添加权限:
<uses-permission android:name="android.permission.BATTERY_STATS" />
2) 在Activity中动态注册:
package com.example.test;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.BatteryManager;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;
public class MainActivity extends Activity {
private BatteryChangedReceiver receiver = new BatteryChangedReceiver();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
registerReceiver(receiver, getFilter());
}
private IntentFilter getFilter() {
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_BATTERY_CHANGED);
filter.addAction(Intent.ACTION_BATTERY_LOW);
filter.addAction(Intent.ACTION_BATTERY_OKAY);
return filter;
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
unregisterReceiver(receiver);
super.onDestroy();
}
class BatteryChangedReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
final String action = intent.getAction();
if (action.equalsIgnoreCase(Intent.ACTION_BATTERY_CHANGED)) {
System.out
.println("BatteryChangedReceiver BATTERY_CHANGED_ACTION---");
// 当前电池的电压
int voltage = intent.getIntExtra(BatteryManager.EXTRA_VOLTAGE,
-1);
// 电池的健康状态
int health = intent
.getIntExtra(BatteryManager.EXTRA_HEALTH, -1);
switch (health) {
case BatteryManager.BATTERY_HEALTH_COLD:
Toast.makeText(MainActivity.this, "BATTERY_HEALTH_COLD", 100).show();
break;
case BatteryManager.BATTERY_HEALTH_DEAD:
Toast.makeText(MainActivity.this, "BATTERY_HEALTH_DEAD", 100).show();
break;
case BatteryManager.BATTERY_HEALTH_GOOD:
Toast.makeText(MainActivity.this, "BATTERY_HEALTH_GOOD", 100).show();
break;
case BatteryManager.BATTERY_HEALTH_OVERHEAT:
Toast.makeText(MainActivity.this, "BATTERY_HEALTH_OVERHEAT", 100).show();
break;
case BatteryManager.BATTERY_HEALTH_OVER_VOLTAGE:
Toast.makeText(MainActivity.this, "BATTERY_HEALTH_COLD", 100).show();
break;
case BatteryManager.BATTERY_HEALTH_UNKNOWN:
Toast.makeText(MainActivity.this, "BATTERY_HEALTH_UNKNOWN", 100).show();
break;
case BatteryManager.BATTERY_HEALTH_UNSPECIFIED_FAILURE:
Toast.makeText(MainActivity.this, "BATTERY_HEALTH_UNSPECIFIED_FAILURE", 100).show();
break;
default:
break;
}
// 电池当前的电量, 它介于0和 EXTRA_SCALE之间
int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
// 电池电量的最大值
int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
// 当前手机使用的是哪里的电源
int pluged = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED,
-1);
switch (pluged) {
case BatteryManager.BATTERY_PLUGGED_AC:
// 电源是AC charger.[应该是指充电器]
Toast.makeText(MainActivity.this, "BATTERY_PLUGGED_AC", 100).show();
break;
case BatteryManager.BATTERY_PLUGGED_USB:
// 电源是USB port
Toast.makeText(MainActivity.this, "BATTERY_PLUGGED_USB", 100).show();
break;
default:
break;
}
int status = intent
.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
switch (status) {
case BatteryManager.BATTERY_STATUS_CHARGING:
// 正在充电
Toast.makeText(MainActivity.this, "BATTERY_STATUS_CHARGING", 100).show();
break;
case BatteryManager.BATTERY_STATUS_DISCHARGING:
Toast.makeText(MainActivity.this, "BATTERY_STATUS_DISCHARGING", 100).show();
break;
case BatteryManager.BATTERY_STATUS_FULL:
// 充满
Toast.makeText(MainActivity.this, "BATTERY_STATUS_FULL", 100).show();
break;
case BatteryManager.BATTERY_STATUS_NOT_CHARGING:
// 没有充电
Toast.makeText(MainActivity.this, "BATTERY_STATUS_NOT_CHARGING", 100).show();
break;
case BatteryManager.BATTERY_STATUS_UNKNOWN:
// 未知状态
Toast.makeText(MainActivity.this, "BATTERY_STATUS_UNKNOWN", 100).show();
break;
default:
break;
}
// 电池使用的技术。比如,对于锂电池是Li-ion
String technology = intent
.getStringExtra(BatteryManager.EXTRA_TECHNOLOGY);
// 当前电池的温度
int temperature = intent.getIntExtra(
BatteryManager.EXTRA_TEMPERATURE, -1);
Toast.makeText(MainActivity.this, "voltage = " + voltage + " technology = "
+ technology + " temperature = " + temperature
+ " level = " + level + " scale = " + scale, 100).show();
} else if (action.equalsIgnoreCase(Intent.ACTION_BATTERY_LOW)) {
// 表示当前电池电量低
Toast.makeText(MainActivity.this, "BatteryChangedReceiver ACTION_BATTERY_LOW---", 100).show();
} else if (action.equalsIgnoreCase(Intent.ACTION_BATTERY_OKAY)) {
// 表示当前电池已经从电量低恢复为正常
Toast.makeText(MainActivity.this, "BatteryChangedReceiver ACTION_BATTERY_OKAY---", 100).show();
}
}
}
}
3. 监听手机是否锁屏,关闭和打开响应的app:
1) 添加app进程关闭和打开权限:
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
<uses-permission android:name="android.permission.INSTALL_PACKAGES"/>
2) 定义BroadcastReicerver类:
package com.jky.screen;
import java.util.List;
import com.keyang.model.TaskInfo;
import android.app.Activity;
import android.app.ActivityManager;
import android.app.ActivityManager.RunningAppProcessInfo;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.util.Log;
public class ScreenOffReceiver extends BroadcastReceiver{
private PackageManager manager;
public static Activity activity;
private List<TaskInfo> userTaskInfos;
private int killCount = 0;
private int startCount = 0;
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
if(intent.getAction().equals(Intent.ACTION_SCREEN_OFF)){
//获取所有的应用程序
PackageManager pm = context.getPackageManager();
ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List<RunningAppProcessInfo> runningAppProcessInfos = am.getRunningAppProcesses();
//遍历所有的应用程序
for(RunningAppProcessInfo info:runningAppProcessInfos){
String packageName = info.processName;
am.killBackgroundProcesses(packageName);
killCount++;
}
Log.i("INFO", "screen off: 杀死了 count====="+killCount);
}
if(intent.getAction().equals(Intent.ACTION_SCREEN_ON)){
//启动应用程序
PackageManager manager = context.getPackageManager();
// ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
//查询能过启动的应用
final List<ResolveInfo> apps = manager.queryIntentActivities(
mainIntent, 0);
if(apps.size()>0){
for (int j = 0; j < apps.size(); j++) {
ResolveInfo info = apps.get(j);
String packageName = info.activityInfo.packageName;
try {
PackageInfo packgeInfo = manager.getPackageInfo(packageName, PackageManager.GET_ACTIVITIES);
ActivityInfo[] activites = packgeInfo.activities;
ActivityInfo activityInfo = activites[0];
String name = activityInfo.name;
ComponentName component = new ComponentName(packageName, name);
Intent start_intent = new Intent();
start_intent.setComponent(component);
activity.startActivity(start_intent);
startCount++;
} catch (Exception e) {
e.printStackTrace();
}
}
}
Log.i("INFO", "screen on 启动了:"+startCount+"个程序");
}
}
}
3)在Activity中代码动态注册:
receiver = new ScreenOffReceiver();
filter = new IntentFilter();
filter.addAction(Intent.ACTION_SCREEN_OFF);
filter.addAction(Intent.ACTION_SCREEN_ON);
4) 在onPause()中销毁:
public void onPause(){
super.onPause();
//this.unregisterReceiver(receiver);
}
4. 监听手机关机,开机和重启状态的改变.
1) 定义BroadcastReicever :
package com.example.test;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.widget.Toast;
public class PhoneRootReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
if(intent.getAction().equals(Intent.ACTION_BATTERY_CHANGED)){
Toast.makeText(context, "监听到手机开机", 100).show();
}else if(intent.getAction().equals(Intent.ACTION_SHUTDOWN)){
Toast.makeText(context, "监听到手机关机", 100).show();
}else if(intent.getAction().equals(Intent.ACTION_REBOOT)){
Toast.makeText(context, "监听到手机重新启动", 100).show();
}
}
}
2) 在Activity中动态注册:
package com.example.test;
import android.app.Activity;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
public class MainActivity extends Activity {
private PhoneRootReceiver receiver = new PhoneRootReceiver();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
registerReceiver(receiver, getFilter());
}
private IntentFilter getFilter() {
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_BOOT_COMPLETED);
filter.addAction(Intent.ACTION_SHUTDOWN);
filter.addAction(Intent.ACTION_REBOOT);
return filter;
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
unregisterReceiver(receiver);
super.onDestroy();
}
}
好了,BroadcastReceiver 广播接受者就讲到这里了.