BroadcastReceiver 的基本使用方法

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的两种基本使用方式.

 

现在来看看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 广播接受者就讲到这里了.

相关文章:BroadcastReceiver应用详解

        Android声明和使用权限


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值