ACCESS[转]基础总结篇的五:BroadcastReceiver应用详解 .

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

 

問渠那得清如許?為有源頭活水來。南宋.朱熹《觀書有谢》

传闻程序员是最轻学习之部落,IT男还知,这个行业日新月异,必须不停地修新知识,不断地为自己注入新鲜的血,才会如自己和达到技术的步履。

今日我们来讲一下Android中BroadcastReceiver的连锁知识。

BroadcastReceiver为即是“广播接收者”的意,顾名思义,它便是用来收取来自系统跟动用中之广播。

以Android系统面临,广播体现在全部,例如当开机就后系统会发出相同长长的广播,接收至就条广播就会落实开机启动服务之意义;当网络状态改变时系统会有相同漫漫广播,接收及马上漫漫广播就会立时地做出提示和封存数据等操作;当电池电量改变时,系统会时有发生同样长达广播,接收到即漫漫广播就会当电量低时告知用户就保存进度,等等。

Android中的广播机制设计之百般优秀,很多政工本来需要开发者亲自操作的,现在只有待等候广播告知自己不怕足以了,大大减少了支付之工作量及开发周期。而作为利用开发者,就得数练掌握Android系统提供的一个付出利器,那便是BroadcastReceiver。下面我们不怕针对BroadcastReceiver逐一地剖析与排,了解与操纵它的各种功能跟用法。

首先,我们来演示一下开立一个BroadcastReceiver,并叫这个BroadcastReceiver能够根据我们的需来运行。

比方开创和谐的BroadcastReceiver对象,我们要继承android.content.BroadcastReceiver,并贯彻该onReceive方法。下面我们就是创办一个叫也MyReceiver广播接收者:

 

 

[java] view
plaincopyprint?

  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中之数据,这很重要,就像无线电一样,包含众多中之信息。

在创立了我们的BroadcastReceiver之后,还非可知如其进入工作状态,我们得也它们注册一个点名的广播地址。没有登记广播地址之BroadcastReceiver就像一个差选台按钮的收音机,虽然功效俱备,但也束手无策接受电台的信号。下面我们不怕来介绍一下什么呢BroadcastReceiver注册广播地址。

静态注册

静态注册是以AndroidManifest.xml文件被布置的,我们就算来呢MyReceiver注册一个播地址:

 

 

[html] view
plaincopyprint?

  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
plaincopyprint?

  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和Service都持续了ContextWrapper,所以可以直接调用。在其实采用中,我们于Activity或Service中登记了一个BroadcastReceiver,当此Activity或Service被销毁时一旦没排除注册,系统会报一个老大,提示我们是否忘解除注册了。所以,记得在特定的地方实践解除注册操作:

 

 

 

[java] view
plaincopyprint?

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

 

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

 

行这样行代码就可化解问题了。注意,这种注册方式以及静态注册相反,不是常驻型的,也就是说广播会跟随程序的生命周期。

咱俩可因上述任意一种植方式成功注册,当注册成功之后,这个接收者就得健康干活了。我们得为此以下措施于其发送一漫长广播:

 

 

[java] view
plaincopyprint?

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

 

在意,sendBroadcast也是android.content.ContextWrapper类中之章程,它好拿一个点名地址与参数信息的Intent对象为广播的款式发送出。

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

ACCESS 1

来看这般的打印信息,表明我们的广播就作出去了,并且给MyReceiver准确科学的接纳到了。

面的事例只是一个接收者来收取播放,如果生差不多个接收者都报了扳平的广播地址,又见面是啊状况吧,能同时收取及同一条广播为,相互之间会无会见生搅和也?这便涉及到平凡广播和稳步广播的概念了。

一般性广播(Normal Broadcast)

普普通通广播于多只接收者来说是一点一滴异步的,通常每个接收者都不要等待即好接收及广播,接收者相互之间不见面发出影响。对于这种广播,接收者无法住广播,即无法阻止其他接收者的收纳动作。

为说明以上论断,我们新建三只BroadcastReceiver,演示一下这个过程,FirstReceiver、SecondReceiver和ThirdReceiver的代码如下:

 

 

[java] view
plaincopyprint?

  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
plaincopyprint?

  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
plaincopyprint?

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

}

然后还点击发送按钮,发送一漫漫广播,控制台打印如下:

 

ACCESS 2

看来这三单接收者都吸收到当时漫漫广播了,我们略微修改一下叔独接收者,在onReceive方法的末段一执行上加以下代码,试图平息广播:

 

 

[java] view
plaincopyprint?

  1. abortBroadcast();  

 

abortBroadcast();

复点击发送按钮,我们见面发觉,控制台中三个接收者仍然还打印了和睦的日志,表明接收者并无能够住广播。

 

不变广播(Ordered Broadcast)

以不变应万变广播于突出,它每次就发送至先行级较高的收信人那里,然后由预先级赛之接受者再扩散到先行级低的收信人那里,优先级赛之接收者有能力已这个广播。

为了演示有序广播的流水线,我们修改一下上面三只接收者的代码,如下:

 

 

[java] view
plaincopyprint?

  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
plaincopyprint?

  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
plaincopyprint?

  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方法以一个Bundle对象设置也结果集对象,传递至下一个接收者那里,这样的话,优先级低之接收者可以据此getResultExtras获取到新型的通过处理的音讯集合。

 

代码改了之后,我们要呢老三只接收者注册广播地址,我们修改一下AndroidMainfest.xml文本:

 

 

[html] view
plaincopyprint?

  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顶1000,数值越怪,优先级更强。

 

兹,我们得改一下发送广播的代码,如下:

 

 

[java] view
plaincopyprint?

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

注意,使用sendOrderedBroadcast方法发送有序广播时,需要一个权力参数,如果为null则表示未求接收者声明指定的权,如果不为null,则代表接收者若一旦接纳这广播,需声明指定权限。这样做是于平安角度考虑的,例如系统的差信就是是稳步广播的花样,一个下或是独具拦截垃圾短信的效果,当短信至时它们可预先接受到短信广播,必要经常止广播传递,这样的软件就不能不声明接受短信的权限。

 

因而我们以AndroidMainfest.xml中定义一个权力:

 

 

[html] view
plaincopyprint?

  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
plaincopyprint?

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

 

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

关于这有些要是发无明了的地方可以参考我事先写了之一律篇稿子:Android声明和用权力

然后我们点击发送按钮发送一长达广播,控制台打印如下:

ACCESS 3

咱俩看来接收是据顺序的,第一单同次单还在结果集中在了友好之符号,并且为优先级低的收信人传递下去。

既然是各个传递,试着已这种传递,看一样押效果怎么样,我们修改FirstReceiver的代码,在onReceive的末段一实施上加以下代码:

 

 

[java] view
plaincopyprint?

  1. abortBroadcast();  

 

abortBroadcast();

接下来又运行程序,控制台打印如下:

 

ACCESS 4

此次,只有首先单接收者执行了,其它少单都不曾会行,因为广播于第一独接收者终止了。

方就是BroadcastReceiver的介绍,下面我用会举几只普遍的事例加深一下大家对广播的明以及运:

1.开机启动服务

咱俩经常会生出这般的用场合,比如音推送服务,需要贯彻开机启动之功用。要兑现此职能,我们就是得订阅系统“启动成功”这长达广播,接收及当时长长的广播后我们不怕可以启动自己之劳动了。我们来拘禁一下BootCompleteReceiver和MsgPushService的有血有肉落实:

 

 

[java] view
plaincopyprint?

  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
plaincopyprint?

  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
plaincopyprint?

  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
plaincopyprint?

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

 

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

经过地方的几乎独步骤之后,我们便成功了开机启动之功效,将下运行在模拟器上,然后重新开模拟器,控制台打印如下:

 

ACCESS 5

ACCESS 6

比方我们查阅已运行的服务就是会意识,MsgPushService已经运行起来了。

2.网状态变化

以一些场合,比如用户浏览网络消息经常,网络突然断开,我们设马上地提示用户网络已经断开。要兑现这力量,我们得收起网络状态改变这样同样长广播,当由连续状态变成断开状态时,系统就是会发送一漫漫广播,我们接到后来,再通过网的状态做出相应的操作。下面就来落实转之力量:

 

 

[java] view
plaincopyprint?

  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
plaincopyprint?

  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
plaincopyprint?

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

 

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

咱们得测试一下,比如关闭WiFi,看看有什么意义。

 

3.电量变化

设我们看软件,可能是全屏阅读,这个时用户就看不到剩余的电量,我们不怕可以吗他们提供电量的音。要想做到即一点,我们用收取一长长的电量变化之播报,然后抱百分比信息,这听上去特别简单的,我们就算来兑现以下:

 

 

[java] view
plaincopyprint?

  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
plaincopyprint?

  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
plaincopyprint?

  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 + “%”);   

相关文章