第六十讲:四大组件之BroadcastReceiver(三)

如果把生活比喻为创作的意境,那么阅读就像阳光。

本讲内容:举几个常见的例子加深一下对BroadcastReceiver广播的理解和应用:

一、开机启动服务

我们经常会有这样的应用场合,比如消息推送服务,需要实现开机启动的功能。要实现这个功能,我们就可以订阅系统“启动完成”这条广播,接收到这条广播后我们就可以启动自己的服务了。我们来看一下BootCompleteReceiver和MsgPushService的具体实现:

public class BootCompleteReceiver extends BroadcastReceiver {
	private static final String TAG = "MyReceiver";
	@Override
	public void onReceive(Context context, Intent intent) {
		Intent service =new Intent(context,MsgPushService.class);
		context.startService(service);
		Log.i(TAG, "Boot Complete. Starting MsgPushService...");
	}
}
public class MsgPushService extends Service{
	private static final String TAG = "MyReceiver";
	@Override
	public IBinder onBind(Intent arg0) {
		return null;
	}
	@Override
	public void onCreate() {
		super.onCreate();
		Log.i(TAG, "onCreate called.");
	}
	@Override
	public int onStartCommand(Intent intent, int flags, int startId) {
		Log.i(TAG, "onStartCommand called.");
		return super.onStartCommand(intent, flags, startId);
	}
}

下面是MainActivity.java主界面文件:

public class MainActivity extends Activity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}
}

在AndroidManifest.xml中配置

 <!-- 开机广播接受者 -->
        <receiver android:name=".BootCompleteReceiver" >
            <intent-filter>
                <!-- 注册开机广播地址 -->
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </receiver>
        <!-- 消息推送服务 -->
        <service android:name=".MsgPushService" />

我们看到BootCompleteReceiver注册了“android.intent.action.BOOT_COMPLETED”这个开机广播地址,从安全角度考虑,系统要求必须声明接收开机启动广播的权限,于是我们再声明使用下面的权限:

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

应用程序,然后重启模拟器或手机,控制台打印如下:

如果我们查看已运行的服务就会发现,MsgPushService已经运行起来了。

二、网络状态变化

譬如用户浏览网络信息时,网络突然断开,我们要及时地提醒用户网络已断开。要实现这个功能,下面就来实现一下这个功能:

public class NetworkStateReceiver extends BroadcastReceiver {
	private static final String TAG = "MyReceiver";
	@Override
	public void onReceive(Context context, Intent intent) {
		Log.i(TAG, "network state changed.");
		if (!isNetworkAvailable(context)) {
            Toast.makeText(context, "network disconnected!", 0).show();
        }
	}

     /**
      * 网络是否可用
      * @param context
      * @return
      */

    public static boolean isNetworkAvailable(Context context) {
        ConnectivityManager mgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo[] info = mgr.getAllNetworkInfo();
        if (info != null) {
            for (int i = 0; i < info.length; i++) {
                if (info[i].getState() == NetworkInfo.State.CONNECTED) {
                    return true;
                }
            }
        }
        return false;
    }
}

注册

<receiver android:name=".NetworkStateReceiver" >
            <intent-filter>
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </receiver>

因为在isNetworkAvailable方法中我们使用到了网络状态相关的API,所以需要声明相关的权限声明:

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

运行程序,我们打开数据连接,控制台打印如下:

三、电量变化

如果我们阅读软件,可能是全屏阅读,这个时候用户就看不到剩余的电量,我们就可以为他们提供电量的信息。要想做到这一点,我们需要接收一条电量变化的广播,然后获取百分比信息,我们就来实现以下:

public class BatteryChangedReceiver extends BroadcastReceiver {
	private static final String TAG = "MyReceiver";
	@Override
	public void onReceive(Context context, Intent intent) {
		int currLevel = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0); // 当前电量
		int total = intent.getIntExtra(BatteryManager.EXTRA_SCALE, 1); // 总电量
		int percent = currLevel * 100 / total;
		Log.i(TAG, "battery: " + percent + "%");
	}
}

注册

 <receiver android:name=".BatteryChangedReceiver" >
            <intent-filter>
                <action android:name="android.intent.action.BATTERY_CHANGED" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
  </receiver>

当然,有些时候我们是要立即获取电量的,而不是等电量变化的广播,比如当阅读软件打开时立即显示出电池电量。我们可以按以下方式获取:

public class BatteryChangedReceiver extends BroadcastReceiver {
	private static final String TAG = "MyReceiver";
	@Override
	public void onReceive(Context context, Intent intent) {
		Intent batteryIntent = getApplicationContext().registerReceiver(null,
		        new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
		int currLevel = batteryIntent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);
		int total = batteryIntent.getIntExtra(BatteryManager.EXTRA_SCALE, 1);
		int percent = currLevel * 100 / total;
		Log.i("battery", "battery: " + percent + "%");
	}
	private Context getApplicationContext() {
		// TODO Auto-generated method stub
		return null;
	}
}

本讲就到这里,Take your time and enjoy it

时间: 2024-07-29 19:13:26

第六十讲:四大组件之BroadcastReceiver(三)的相关文章

Android实训案例(六)——四大组件之一BroadcastReceiver的基本使用,拨号,短信,SD卡,开机,应用安装卸载监听

Android实训案例(六)--四大组件之一BroadcastReceiver的基本使用,拨号,短信,SD卡,开机,应用安装卸载监听 Android中四大组件的使用时重中之重,我这个阶段也不奢望能把他所有的原理搞懂,但是最起码的,我要把他的各种使用方法了如指掌才行 BroadcastReceiver 接收系统的广播,比如电话,短信之类的 1.IP拨号器 我们在拨打电话的时候,我们系统也会事先发送一个广播,所以我们可以用广播接收者来接收到这个广播拨打电话的时候在电话号码前面加上一些优惠的长途短号,

【Android的从零单排开发日记】之入门篇(六)——Android四大组件之Broadcast Receiver

广播接受者是作为系统的监听者存在着的,它可以监听系统或系统中其他应用发生的事件来做出响应.如设备开机时,应用要检查数据的变化状况,此时就可以通过广播来把消息通知给用户.又如网络状态改变时,电量变化时都可以通过广播来通知用户.要做比喻的话,广播就像是我们的感官,能够有效且快速的从外界获取信息来反馈给自身. 一.广播的功能和特征 广播的生命周期很短,经过 调用对象—实现onReceive—结束 整个过程就结束了.从实现的复杂度和代码量来看,广播无疑是最迷你的Android 组件,实现往往只需几行代码

Android四大组件之BroadcastReceiver详细解析

什么是BroadcastReceiver? BroadcastReceiver作为Android四大组件之一,在实际开发中也发挥着重要的作用,广播机制在Android程序通信中至关重要,广播其实与我们现实生活中的电台很相似,电台在某个频道上发送它的内容,那么只要有在收听这个频道的人都会收到这些内容.在Android中,广播也同样分为两个角色:广播发送者.广播接收者. BroadcastReceiver的应用场景 1.在一个应用中,我们的Activity与Service的通信就需要用到广播来作为中

Android四大组件之~~BroadcastReceiver

声明:转载请注明出处:http://blog.csdn.net/Hello_Chillax/article/details/45672601 开题:对android稍微有些了解的朋友都知道,android中有四大组件,分别是:Activity,Service,ContentProvider,BroadcastReceiver.今天来介绍其一:BroadcastReceiver. BroadcastReceiver:顾名思义,广播接收者,可以接收系统,其他应用等等发送的广播进而做出相应的反应.比如

四大组件之BroadcastReceiver(一)-自定义“收音机”与发送“广播”

第1节 Broadcast Receiver概述 很多时候,我们希望一个应用程序在它没有运行起来的时候,也能感知系统状态的某些变化,如果条件合适,就让这个应用就运行起来. 比如,一个拦截骚扰电话的应用,平时它可能并不需要运行起来,它只关心有电话来的时候,看看这个号码是不是骚扰电话的号码,如果是就给用户发出一个提示,如果不是,那就和它没有关系,啥也不做. 为了实现这类功能,安卓系统引入了四大组件之一的BroadcastReceiver,设计了一套广播与接收的机制, 任何应用或者安卓系统的自身组件可

第六章:四大组件之Activity

tivityActivity作为Android四大组件之一,也是其中最重要的一个组件.作为一个与用户交互的组件,我们可以把Activity比较成为windows系统上的一个文件夹窗口,是一个与用户交互的界面.再进一步说,当我们拿起Android打开拨号功能,显示出拨号盘的界面其实就是一个Activity:当然,可以更大范围的说,手机屏幕上显示的任何界面都是一个个Activity. 运行状态:当Activity处于屏幕最前端,此时Actiivity完全显示在用户的界面中,并能获取焦点时,可以响应用

第五十九讲:四大组件之BroadcastReceiver(二)

没有任何动物比蚂蚁更勤奋,然而它却最沉默寡言. 本讲内容: Broadcast Receiver 广播接收者的使用 上一讲我们讲解了一个接收者来接收广播,如果有多个接收者都注册了相同的广播地址,又会是什么情况呢,这就涉及到普通广播和有序广播的概念了. 一.普通广播(Normal Broadcast) 普通广播对于多个接收者来说是完全异步的,通常每个接收者都无需等待即可以接收到广播,接收者相互之间不会有影响.对于这种广播,接收者无法终止广播,即无法阻止其他接收者的接收动作. 我们新建二个Broad

Android笔记(五十六) Android四大组件之一——ContentProvider,实现自己的ContentProvider

有时候我们自己的程序也需要向外接提供数据,那么就需要我们自己实现ContentProvider. 自己实现ContentProvider的话需要新建一个类去继承ContentProvider,然后重写类中的的6个抽象方法. onCreate():初始化内容提供器时候会调用,通常会在这里完成对数据库的创建和升级等操作,返回true表示内容提供器初始化成功,返回false则表示失败,注意,只有当存在ContentResolver尝试访问我们程序中的数据时,内容提供其才会被初始化 query():从内

[02] 四大组件之BroadcastReceiver

一.BroadcastReceiver的基本概念 广播接收者,无界面,用来接收系统事件或自定义广播(intent形式).可以用它对外部事件进行过滤并只对感兴趣的事件作出响应,比如网络变化,电量变化等,也可以是启动一个activity或Service或弹出一个Notification等. 广播分类: 随机广播:通过Context.sendBroadcast()发送.所有接收者接收顺序随机,不能结束或终止广播. 有序广播:通过Context.sendOrderedBroadcast()发送,根据优先