[转]基础总括篇之五:布罗兹castReceiver应用详解 .

正文转自:http://blog.csdn.net/liuhe688/article/details/6955668

 

問渠那得清如許?為有源頭活水來。孙吴.朱熹《觀書有感》

听大人讲程序员是最爱学习的群落,IT男都精通,这些行当繁荣富强,必须不停地上学新知识,不断地为团结注入新鲜的血流,才能使自身跟上技术的脚步。

后天咱们来讲一下Android中布罗兹castReceiver的连带知识。

布罗兹castReceiver也便是“广播接收者”的情致,顾名思义,它正是用来接收来自系统和选取中的广播。

在Android系统中,广播突显在一切,例如当开机完毕后系统会产生一条广播,接收到那条广播就能达成开机运营服务的遵守;当互联网状态改变时系统会生出一条广播,接收到那条广播就能立时地做出提醒和封存数据等操作;当电池电量改变时,系统会发生一条广播,接收到那条广播就能在电量低时告知用户马上保存进程,等等。

Android中的广播机制设计的非凡优良,很多工作本来需求开发者亲自操作的,未来只需等待广播告知自身就可以了,大大收缩了开发的工作量和开发周期。而作为利用开发者,就须求数练驾驭Android系统提供的三个开支利器,那就是BroadcastReceiver。下边大家就对BroadcastReceiver逐一地分析和排练,精通和摆布它的各样成效和用法。

第②,大家来演示一下开立3个布罗兹castReceiver,并让那个布RhodescastReceiver可以基于大家的内需来运作。

要开创和谐的布RhodescastReceiver对象,大家必要继承android.content.布罗兹castReceiver,并贯彻其onReceive方法。上面咱们就创办三个名为MyReceiver广播接收者:

 

 

[java] view
plain
copyprint?

  1. package com.scott.receiver;  
  2.   
  3. import android.content.BroadcastReceiver;  
  4. import android.content.Context;  
  5. import android.content.Intent;  
  6. import android.util.Log;  
  7.   
  8. public class MyReceiver extends BroadcastReceiver {  
  9.       
  10.     private static final String TAG = “MyReceiver”;  
  11.       
  12.     @Override  
  13.     public void onReceive(Context context, Intent intent) {  
  14.         String msg = intent.getStringExtra(“msg”);  
  15.         Log.i(TAG, msg);  
  16.     }  
  17.   
  18. }  

 

package com.scott.receiver;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

public class MyReceiver extends BroadcastReceiver {

    private static final String TAG = "MyReceiver";

    @Override
    public void onReceive(Context context, Intent intent) {
        String msg = intent.getStringExtra("msg");
        Log.i(TAG, msg);
    }

}

在onReceive方法内,大家得以拿走随广播而来的Intent中的数据,那充足主要,就像有线电一样,包蕴众多卓有效用的音信。

在创立完我们的布罗兹castReceiver之后,还不可见使它进入工作意况,大家必要为它注册一个钦命的播音地址。没有挂号广播地址的布罗兹castReceiver就像二个不够选台按钮的有线电,纵然效果俱备,但也无从吸收广播台的信号。上面我们就来介绍一下如何为布RhodescastReceiver注册广播地址。

静态注册

静态注册是在AndroidManifest.xml文件中配备的,咱们就来为MyReceiver注册1个广播地址:

 

 

[html] view
plain
copyprint?

  1. <receiver android:name=”.MyReceiver”>  
  2.             <intent-filter>  
  3.                 <action android:name=”android.intent.action.MY_BROADCAST”/>  
  4.                 <category android:name=”android.intent.category.DEFAULT” />  
  5.             </intent-filter>  
  6.         </receiver>  

 

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

配置了上述音讯之后,只假使android.intent.action.MY_BROADCAST那个地点的播放,MyReceiver都能够吸收接纳的到。注意,那种艺术的登记是常驻型的,也便是说当使用关闭后,倘诺有广播音信传播,MyReceiver也会被系统调用而自动运营。

动态注册

动态注册须求在代码中动态的钦赐广播地址并注册,日常我们是在Activity或Service注册几个广播,上边大家就来看一下报了名的代码:

 

 

[java] view
plain
copyprint?

  1. MyReceiver receiver = new MyReceiver();  
  2.           
  3. IntentFilter filter = new IntentFilter();  
  4. filter.addAction(“android.intent.action.MY_BROADCAST”);  
  5.           
  6. registerReceiver(receiver, filter);  

 

MyReceiver receiver = new MyReceiver();

IntentFilter filter = new IntentFilter();
filter.addAction("android.intent.action.MY_BROADCAST");

registerReceiver(receiver, filter);

注意,registerReceiver是android.content.ContextWrapper类中的方法,Activity和瑟维斯都一连了ContextWrapper,所以能够直接调用。在骨子里运用中,我们在Activity或Service中注册了叁个布罗兹castReceiver,当那一个Activity或Service被灭绝时假若没有撤废注册,系统会报3个老大,提示我们是否忘记解除注册了。所以,记得在一定的地点实践解除注册操作:

 

 

 

[java] view
plain
copyprint?

  1. @Override  
  2. protected void onDestroy() {  
  3.     super.onDestroy();  
  4.     unregisterReceiver(receiver);  
  5. }  

 

@Override
protected void onDestroy() {
    super.onDestroy();
    unregisterReceiver(receiver);
}

 

履行那样行代码就能够缓解难点了。注意,那种注册方式与静态注册相反,不是常驻型的,相当于说广播会跟随程序的生命周期。

我们能够依照以上任意一种格局成功注册,当注册成功今后,那一个接收者就可以符合规律办事了。咱们得以用以下办法向其发送一条广播:

 

 

[java] view
plain
copyprint?

  1. public void send(View view) {  
  2.     Intent intent = new Intent(“android.intent.action.MY_BROADCAST”);  
  3.     intent.putExtra(“msg”, “hello receiver.”);  
  4.     sendBroadcast(intent);  
  5. }  

 

    public void send(View view) {
        Intent intent = new Intent("android.intent.action.MY_BROADCAST");
        intent.putExtra("msg", "hello receiver.");
        sendBroadcast(intent);
    }

 

留意,send布罗兹cast也是android.content.ContextWrapper类中的方法,它能够将1个点名地址和参数新闻的Intent对象以广播的花样发送出去。

点击发送按钮,执行send方法,控制台打字与印刷如下:

图片 1

旁观如此的打字与印刷音信,评释大家的播放已经发出去了,并且被MyReceiver准确科学的收取到了。

下边包车型大巴事例只是一个接收者来接收播放,若是有八个接收者都注册了同样的播放地址,又会是什么样意况吧,能同时接受到均等条广播吗,互相之间会不会有干扰呢?那就提到到常见广播和逐步广播的概念了。

司空眼惯广播(Normal 布罗兹cast)

一般而言广播对于四个接收者来说是截然异步的,平日各个接收者都不用等待即能够选取到广播,接收者互相之间不会有影响。对于那种广播,接收者无法截止广播,即不可能阻挡其余接收者的接受动作。

为了验证以上论断,我们新建四个布罗兹castReceiver,演示一下以此进程,FirstReceiver、SecondReceiver和ThirdReceiver的代码如下:

 

 

[java] view
plain
copyprint?

  1. package com.scott.receiver;  
  2.   
  3. import android.content.BroadcastReceiver;  
  4. import android.content.Context;  
  5. import android.content.Intent;  
  6. import android.util.Log;  
  7.   
  8. public class FirstReceiver extends BroadcastReceiver {  
  9.       
  10.     private static final String TAG = “NormalBroadcast”;  
  11.       
  12.     @Override  
  13.     public void onReceive(Context context, Intent intent) {  
  14.         String msg = intent.getStringExtra(“msg”);  
  15.         Log.i(TAG, “FirstReceiver: ” + msg);  
  16.     }  
  17.   
  18. }  

 

package com.scott.receiver;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

public class FirstReceiver extends BroadcastReceiver {

    private static final String TAG = "NormalBroadcast";

    @Override
    public void onReceive(Context context, Intent intent) {
        String msg = intent.getStringExtra("msg");
        Log.i(TAG, "FirstReceiver: " + msg);
    }

}

 

[java] view
plain
copyprint?

  1. public class SecondReceiver extends BroadcastReceiver {  
  2.       
  3.     private static final String TAG = “NormalBroadcast”;  
  4.       
  5.     @Override  
  6.     public void onReceive(Context context, Intent intent) {  
  7.         String msg = intent.getStringExtra(“msg”);  
  8.         Log.i(TAG, “SecondReceiver: ” + msg);  
  9.     }  
  10.   
  11. }  

 

public class SecondReceiver extends BroadcastReceiver {

    private static final String TAG = "NormalBroadcast";

    @Override
    public void onReceive(Context context, Intent intent) {
        String msg = intent.getStringExtra("msg");
        Log.i(TAG, "SecondReceiver: " + msg);
    }

}

 

[java] view
plain
copyprint?

  1. public class ThirdReceiver extends BroadcastReceiver {  
  2.       
  3.     private static final String TAG = “NormalBroadcast”;  
  4.       
  5.     @Override  
  6.     public void onReceive(Context context, Intent intent) {  
  7.         String msg = intent.getStringExtra(“msg”);  
  8.         Log.i(TAG, “ThirdReceiver: ” + msg);  
  9.     }  
  10.   
  11. }  

 

public class ThirdReceiver extends BroadcastReceiver {

    private static final String TAG = "NormalBroadcast";

    @Override
    public void onReceive(Context context, Intent intent) {
        String msg = intent.getStringExtra("msg");
        Log.i(TAG, "ThirdReceiver: " + msg);
    }

}

接下来再一次点击发送按钮,发送一条广播,控制台打字与印刷如下:

 

图片 2

看来那七个接收者都接到到那条广播了,我们略微修改一下多个接收者,在onReceive方法的末段一行添加以下代码,试图平息广播:

 

 

[java] view
plain
copyprint?

  1. abortBroadcast();  

 

abortBroadcast();

再也点击发送按钮,大家会发觉,控制奥兰多多少个接收者仍旧都打字与印刷了自个儿的日记,注明接收者并不能终止广播。

 

不变广播(Ordered 布Rhodescast)

有序广播相比特殊,它每一次只发送到优先级较高的收信人那里,然后由事先级高的接受者再扩散到事先级低的收信人那里,优先级高的收信人有能力终止那些广播。

为了演示有序广播的流水生产线,大家修改一下方面四个接收者的代码,如下:

 

 

[java] view
plain
copyprint?

  1. package com.scott.receiver;  
  2.   
  3. import android.content.BroadcastReceiver;  
  4. import android.content.Context;  
  5. import android.content.Intent;  
  6. import android.os.Bundle;  
  7. import android.util.Log;  
  8.   
  9. public class FirstReceiver extends BroadcastReceiver {  
  10.       
  11.     private static final String TAG = “OrderedBroadcast”;  
  12.       
  13.     @Override  
  14.     public void onReceive(Context context, Intent intent) {  
  15.         String msg = intent.getStringExtra(“msg”);  
  16.         Log.i(TAG, “FirstReceiver: ” + msg);  
  17.           
  18.         Bundle bundle = new Bundle();  
  19.         bundle.putString(“msg”, msg + “@FirstReceiver”);  
  20.         setResultExtras(bundle);  
  21.     }  
  22.   
  23. }  

 

package com.scott.receiver;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;

public class FirstReceiver extends BroadcastReceiver {

    private static final String TAG = "OrderedBroadcast";

    @Override
    public void onReceive(Context context, Intent intent) {
        String msg = intent.getStringExtra("msg");
        Log.i(TAG, "FirstReceiver: " + msg);

        Bundle bundle = new Bundle();
        bundle.putString("msg", msg + "@FirstReceiver");
        setResultExtras(bundle);
    }

}

 

[java] view
plain
copyprint?

  1. public class SecondReceiver extends BroadcastReceiver {  
  2.       
  3.     private static final String TAG = “OrderedBroadcast”;  
  4.       
  5.     @Override  
  6.     public void onReceive(Context context, Intent intent) {  
  7.         String msg = getResultExtras(true).getString(“msg”);  
  8.         Log.i(TAG, “SecondReceiver: ” + msg);  
  9.           
  10.         Bundle bundle = new Bundle();  
  11.         bundle.putString(“msg”, msg + “@SecondReceiver”);  
  12.         setResultExtras(bundle);  
  13.     }  
  14.   
  15. }  

 

public class SecondReceiver extends BroadcastReceiver {

    private static final String TAG = "OrderedBroadcast";

    @Override
    public void onReceive(Context context, Intent intent) {
        String msg = getResultExtras(true).getString("msg");
        Log.i(TAG, "SecondReceiver: " + msg);

        Bundle bundle = new Bundle();
        bundle.putString("msg", msg + "@SecondReceiver");
        setResultExtras(bundle);
    }

}

 

[java] view
plain
copyprint?

  1. public class ThirdReceiver extends BroadcastReceiver {  
  2.       
  3.     private static final String TAG = “OrderedBroadcast”;  
  4.       
  5.     @Override  
  6.     public void onReceive(Context context, Intent intent) {  
  7.         String msg = getResultExtras(true).getString(“msg”);  
  8.         Log.i(TAG, “ThirdReceiver: ” + msg);  
  9.     }  
  10.   
  11. }  

 

public class ThirdReceiver extends BroadcastReceiver {

    private static final String TAG = "OrderedBroadcast";

    @Override
    public void onReceive(Context context, Intent intent) {
        String msg = getResultExtras(true).getString("msg");
        Log.i(TAG, "ThirdReceiver: " + msg);
    }

}

咱俩注意到,在FirstReceiver和SecondReceiver中最终都利用了setResultExtras方法将2个Bundle对象设置为结果集对象,传递到下二个接收者那里,那样来说,优先级低的接收者能够用getResultExtras获取到最新的通过处理的音信集合。

 

代码改完未来,大家供给为七个接收者注册广播地址,大家修改一下AndroidMainfest.xml文本:

 

 

[html] view
plain
copyprint?

  1. <receiver android:name=”.FirstReceiver”>  
  2.     <intent-filter android:priority=”1000″>  
  3.         <action android:name=”android.intent.action.MY_BROADCAST”/>  
  4.         <category android:name=”android.intent.category.DEFAULT” />  
  5.     </intent-filter>  
  6. </receiver>  
  7. <receiver android:name=”.SecondReceiver”>  
  8.     <intent-filter android:priority=”999″>  
  9.         <action android:name=”android.intent.action.MY_BROADCAST”/>  
  10.         <category android:name=”android.intent.category.DEFAULT” />  
  11.     </intent-filter>  
  12. </receiver>  
  13. <receiver android:name=”.ThirdReceiver”>  
  14.     <intent-filter android:priority=”998″>  
  15.         <action android:name=”android.intent.action.MY_BROADCAST”/>  
  16.         <category android:name=”android.intent.category.DEFAULT” />  
  17.     </intent-filter>  
  18. </receiver>  

 

        <receiver android:name=".FirstReceiver">
            <intent-filter android:priority="1000">
                <action android:name="android.intent.action.MY_BROADCAST"/>
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </receiver>
        <receiver android:name=".SecondReceiver">
            <intent-filter android:priority="999">
                <action android:name="android.intent.action.MY_BROADCAST"/>
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </receiver>
        <receiver android:name=".ThirdReceiver">
            <intent-filter android:priority="998">
                <action android:name="android.intent.action.MY_BROADCAST"/>
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </receiver>

大家看到,未来那多个接收者的<intent-filter>多了三个android:priority属性,并且逐一减小。那一个性子的限量在-一千到1000,数值越大,优先级越高。

 

今昔,大家要求修改一下发送广播的代码,如下:

 

 

[java] view
plain
copyprint?

  1. public void send(View view) {  
  2.     Intent intent = new Intent(“android.intent.action.MY_BROADCAST”);  
  3.     intent.putExtra(“msg”, “hello receiver.”);  
  4.     sendOrderedBroadcast(intent, “scott.permission.MY_BROADCAST_PERMISSION”);  
  5. }  

 

    public void send(View view) {
        Intent intent = new Intent("android.intent.action.MY_BROADCAST");
        intent.putExtra("msg", "hello receiver.");
        sendOrderedBroadcast(intent, "scott.permission.MY_BROADCAST_PERMISSION");
    }

留意,使用sendOrdered布罗兹cast方法发送有序广播时,要求二个权力参数,假如为null则代表不需要接收者注明钦点的权力,假使不为null,则意味着接收者若要接收此广播,需评释钦点权限。那样做是从安全角度考虑的,例如系统的短信就是严守原地广播的花样,二个选用大概是拥有拦截垃圾短信的作用,当短信过来时它能够先接受到短信广播,须求时停下广播传递,那样的软件就必须表明接受短信的权柄。

 

故而大家在AndroidMainfest.xml中定义二个权力:

 

 

[html] view
plain
copyprint?

  1. <permission android:protectionLevel=”normal”  
  2.             android:name=”scott.permission.MY_BROADCAST_PERMISSION” />  

 

    <permission android:protectionLevel="normal"
                android:name="scott.permission.MY_BROADCAST_PERMISSION" />

接下来注脚使用了此权限:

 

 

 

[html] view
plain
copyprint?

  1. <uses-permission android:name=”scott.permission.MY_BROADCAST_PERMISSION” />  

 

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

有关那部分比方有不明了的地点能够参考作者在此以前写过的一篇文章:Android评释和使用权力

下一场大家点击发送按钮发送一条广播,控制台打字与印刷如下:

图片 3

我们看出接收是比照顺序的,第二个和第②个都在结果集中投入了和谐的号子,并且向优先级低的收信人传递下去。

既然如此是逐一传递,试着终止那种传递,看一看效果怎么着,大家修改FirstReceiver的代码,在onReceive的最后一行添加以下代码:

 

 

[java] view
plain
copyprint?

  1. abortBroadcast();  

 

abortBroadcast();

下一场再一次运维程序,控制台打字与印刷如下:

 

图片 4

本次,唯有首先个接收者执行了,此外七个都没能执行,因为广播被第③个接收者终止了。

下面正是布罗兹castReceiver的牵线,下边笔者将会举多少个常见的例子加深一下大家对广播的知晓和采纳:

1.开机运转服务

大家平日会有如此的应用场地,比如音讯推送服务,需求实现开机运营的成效。要促成这一个职能,大家就能够订阅系统“运营完结”那条广播,接收到那条广播后大家就能够运营本人的服务了。我们来看一下BootCompleteReceiver和MsgPushService的有血有肉落实:

 

 

[java] view
plain
copyprint?

  1. package com.scott.receiver;  
  2.   
  3. import android.content.BroadcastReceiver;  
  4. import android.content.Context;  
  5. import android.content.Intent;  
  6. import android.util.Log;  
  7.   
  8. public class BootCompleteReceiver extends BroadcastReceiver {  
  9.       
  10.     private static final String TAG = “BootCompleteReceiver”;  
  11.       
  12.     @Override  
  13.     public void onReceive(Context context, Intent intent) {  
  14.         Intent service = new Intent(context, MsgPushService.class);  
  15.         context.startService(service);  
  16.         Log.i(TAG, “Boot Complete. Starting MsgPushService…”);  
  17.     }  
  18.   
  19. }  

 

package com.scott.receiver;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

public class BootCompleteReceiver extends BroadcastReceiver {

    private static final String TAG = "BootCompleteReceiver";

    @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...");
    }

}

 

[java] view
plain
copyprint?

  1. package com.scott.receiver;  
  2.   
  3. import android.app.Service;  
  4. import android.content.Intent;  
  5. import android.os.IBinder;  
  6. import android.util.Log;  
  7.   
  8. public class MsgPushService extends Service {  
  9.   
  10.     private static final String TAG = “MsgPushService”;  
  11.       
  12.     @Override  
  13.     public void onCreate() {  
  14.         super.onCreate();  
  15.         Log.i(TAG, “onCreate called.”);  
  16.     }  
  17.       
  18.     @Override  
  19.     public int onStartCommand(Intent intent, int flags, int startId) {  
  20.         Log.i(TAG, “onStartCommand called.”);  
  21.         return super.onStartCommand(intent, flags, startId);  
  22.     }  
  23.   
  24.     @Override  
  25.     public IBinder onBind(Intent arg0) {  
  26.         return null;  
  27.     }  
  28. }  

 

package com.scott.receiver;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;

public class MsgPushService extends Service {

    private static final String TAG = "MsgPushService";

    @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);
    }

    @Override
    public IBinder onBind(Intent arg0) {
        return null;
    }
}

下一场大家必要在AndroidManifest.xml中配置相关音信:

 

 

 

[html] view
plain
copyprint?

  1. <!– 开机广播接受者 –>  
  2. <receiver android:name=”.BootCompleteReceiver”>  
  3.     <intent-filter>  
  4.         <!– 注册开机广播地址–>  
  5.         <action android:name=”android.intent.action.BOOT_COMPLETED”/>  
  6.         <category android:name=”android.intent.category.DEFAULT” />  
  7.     </intent-filter>  
  8. </receiver>  
  9. <!– 音信推送服务 –>  
  10. <service android:name=”.MsgPushService”/>  

 

        <!-- 开机广播接受者 -->
        <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”这么些开机广播地址,从安全角度考虑,系统须要必须申明接受开机运转广播的权杖,于是大家再声称使用下边包车型客车权力:

 

 

 

[html] view
plain
copyprint?

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

 

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

经过地点的多少个步骤之后,我们就形成了开机运维的机能,将应用运维在模拟器上,然后重启模拟器,控制台打字与印刷如下:

 

图片 5

图片 6

若果大家查阅已运维的服务就会发现,MsgPushService已经运维起来了。

2.网络状态变化

在有些场面,比如用户浏览网络音讯时,互连网突然断开,大家要登时地提示用户互联网已断开。要兑现那些职能,大家能够接过互联网状态改变这么一条广播,当由接二连三情形变成断开状态时,系统就会发送一条广播,咱们收起到今后,再经过网络的状态做出相应的操作。下边就来贯彻一下以此效率:

 

 

[java] view
plain
copyprint?

  1. package com.scott.receiver;  
  2.   
  3. import android.content.BroadcastReceiver;  
  4. import android.content.Context;  
  5. import android.content.Intent;  
  6. import android.net.ConnectivityManager;  
  7. import android.net.NetworkInfo;  
  8. import android.util.Log;  
  9. import android.widget.Toast;  
  10.   
  11. public class NetworkStateReceiver extends BroadcastReceiver {  
  12.       
  13.     private static final String TAG = “NetworkStateReceiver”;  
  14.       
  15.     @Override  
  16.     public void onReceive(Context context, Intent intent) {  
  17.         Log.i(TAG, “network state changed.”);  
  18.         if (!isNetworkAvailable(context)) {  
  19.             Toast.makeText(context, “network disconnected!”, 0).show();  
  20.         }  
  21.     }  
  22.       
  23.     /** 
  24.      * 网络是不是可用 
  25.      *  
  26.      * @param context 
  27.      * @return 
  28.      */  
  29.     public static boolean isNetworkAvailable(Context context) {  
  30.         ConnectivityManager mgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);  
  31.         NetworkInfo[] info = mgr.getAllNetworkInfo();  
  32.         if (info != null) {  
  33.             for (int i = 0; i < info.length; i++) {  
  34.                 if (info[i].getState() == NetworkInfo.State.CONNECTED) {  
  35.                     return true;  
  36.                 }  
  37.             }  
  38.         }  
  39.         return false;  
  40.     }  
  41.   
  42. }  

 

package com.scott.receiver;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.util.Log;
import android.widget.Toast;

public class NetworkStateReceiver extends BroadcastReceiver {

    private static final String TAG = "NetworkStateReceiver";

    @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;
    }

}

再登记一下那么些接收者的音信:

 

 

 

[html] view
plain
copyprint?

  1. <receiver android:name=”.NetworkStateReceiver”>  
  2.     <intent-filter>  
  3.         <action android:name=”android.net.conn.CONNECTIVITY_CHANGE”/>  
  4.         <category android:name=”android.intent.category.DEFAULT” />  
  5.     </intent-filter>  
  6. </receiver>  

 

        <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,所以须求评释相关的权力才行,上边正是对应的权柄注明:

 

 

 

[html] view
plain
copyprint?

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

 

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

笔者们能够测试一下,比如关闭WiFi,看看有哪些意义。

 

3.电量变化

假设我们涉猎软件,恐怕是全屏阅读,那一个时候用户就看不到剩余的电量,大家就足以为她们提供电量的音讯。要想做到那点,大家须要收取一条电量变化的播音,然后拿走百分比音信,那听上去挺简单的,大家就来实现以下:

 

 

[java] view
plain
copyprint?

  1. package com.scott.receiver;  
  2.   
  3. import android.content.BroadcastReceiver;  
  4. import android.content.Context;  
  5. import android.content.Intent;  
  6. import android.os.BatteryManager;  
  7. import android.util.Log;  
  8.   
  9. public class BatteryChangedReceiver extends BroadcastReceiver {  
  10.   
  11.     private static final String TAG = “BatteryChangedReceiver”;  
  12.       
  13.     @Override  
  14.     public void onReceive(Context context, Intent intent) {  
  15.         int currLevel = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);  //当前电量
      
  16.         int total = intent.getIntExtra(BatteryManager.EXTRA_SCALE, 1);      //总电量
      
  17.         int percent = currLevel * 100 / total;  
  18.         Log.i(TAG, “battery: ” + percent + “%”);  
  19.     }  
  20.   
  21. }  

 

package com.scott.receiver;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.BatteryManager;
import android.util.Log;

public class BatteryChangedReceiver extends BroadcastReceiver {

    private static final String TAG = "BatteryChangedReceiver";

    @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 + "%");
    }

}

然后再登记一下广播接地址新闻就能够了:

 

 

 

[html] view
plain
copyprint?

  1. <receiver android:name=”.BatteryChangedReceiver”>  
  2.     <intent-filter>  
  3.         <action android:name=”android.intent.action.BATTERY_CHANGED”/>  
  4.         <category android:name=”android.intent.category.DEFAULT” />  
  5.     </intent-filter>  
  6. </receiver>  

 

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

自然,有些时候我们是要立刻赢得电量的,而不是等电量变化的播报,比如当阅读软件打开时马上显示出电池电量。我们得以按以下办法获取:

 

 

[java] view
plain
copyprint?

  1. Intent batteryIntent = getApplicationContext().registerReceiver(null,  
  2.         new IntentFilter(Intent.ACTION_BATTERY_CHANGED));  
  3. int currLevel = batteryIntent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);  
  4. int total = batteryIntent.getIntExtra(BatteryManager.EXTRA_SCALE, 1);  
  5. int percent = currLevel * 100 / total;  
  6. Log.i(“battery”, “battery: ” + percent + “%”);   

相关文章