当前位置:   article > 正文

android学习笔记之Intent与BroadcastReceiver_android intent broadcastr

android intent broadcastr

监听安卓本地的Broadcast Intents

比如时区的改变,数据连接状态,短信的接收,来电,底座模式,电池状态等等。

下面的列表介绍的是一些设备状态变化的Actions:

1.ACTION_BOOT_COMPLETED 当你的安卓系统启动完成时触发,App要接收此广播,需要RECEIVE_BOOT_COMPLETED权限。

2.ACTION_CAMERA_BUTTON 当照相机的按钮被点击。

3.ACTION_DATE_CHANGED 和 ACTION_TIME_CHANGED  日期或者时间被手动改变时会发送此广播。

4.ACTION_MEDIA_EJECT 外存储设备被物理得拔出的时候触发,通常指的是SD卡

5.ACTION_MEDIA_MOUNTED和ACTION_MEDIA_UNMOUNTED 前者是外部存储(SD卡或U盘)被成功被加载,后者是成功被移除(注意这个跟物理拔出不一样)。

注意:监听SD卡状态时候,除了ACTION必须以外,你的过滤器还需要data scheme为file.(比如intentFilter.addDataScheme("file"),很重要,不然收不到广播)

6.ACTION_NEW_OUTGOING_CALL  监听电话打出的广播,那么我可以看到号码么?答:可以,首先一定是存在发来的intent中,那么intent只要找到这个存储的键,就可以找到值,这个键是什么呢?答:EXTRA_PHONE_NUMER。 注意:需要权限PROCESS_OUTGOING_CALLS

7.ACTION_SCREEN_ON和ACTION_SCREEN_OFF 分别监听的是屏幕打开和关闭。

8.ACTION_TIMEZONE_CHANGED 当前手机时区发生改变,Intent包含了time-zone键,返回的是Java.util.TimeZone的ID

 

监听电池状态改变

之前我们讨论过这个电池状态的广播Intent是属于Sticky Intent,所以通常不需要去声明一个接受者去接收。

Aciton是什么呢? 答:Intent.ACTION_BATTERY_CHANGED

例子:

  1. IntentFilter batIntentFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
  2. Intent battery = context.registerReceiver(null, batIntentFilter);
  3. int status = battery.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
  4. boolean isCharging =
  5. status == BatteryManager.BATTERY_STATUS_CHARGING ||
  6. status == BatteryManager.BATTERY_STATUS_FULL;

这个intent里面包含了当前电量的电量状态,还有是否是充电状态。

值得注意一点:你不能在mainfest中去注册一个Receiver来监听电池变化这个ACTION。但是呢,你还是可以监视电源的连接情况,低电池水平,和接下来的列出的:

1.ACTION_BATTERY_LOW 电池电量低

2.ACTION_BATTERY_OKAY 电池电量水平OK

3.ACTION_POWER_CONNECTED  与电源连接

4.ACTION_POWER_DISCONNECTED 与电源断开

 

监听连接的改变(比如蓝牙,NFC,网络,wi-fi)

那么这里所指的连接改变具体是什么呢?

答:包括带宽,延迟,可用的网络连接和一些对APP有用的信息发生改变。

应用场景举例:比如当你断开了wifi,你可能需要挂起app正在更新的东西,直到你又连上了。

注册这种广播,动态静态都可以,具体连接的信息,你还需要用到Connectivity Manager。

Aciton: mainfest中:android.net.conn.CONNECTIVITY_CHANGE,程序中:ConnectivityManager.CONNECTIVITY_ACTION

例子:

  1. String svcName = Context.CONNECTIVITY_SERVICE;
  2. ConnectivityManager cm = (ConnectivityManager)context.getSystemService(svcName);
  3. NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
  4. boolean isConnected = activeNetwork.isConnectedOrConnecting();
  5. boolean isMobile = activeNetwork.getType() ==
  6. ConnectivityManager.TYPE_MOBILE;

关于Connectivity Manager更多的信息,还有NFC,WI-FI等下次再讨论。

 

监听底座状态改变

安卓设备可以放在车的底座或者办工桌的手机底座上。

废话不多说了,Action:    Intent.ACTION_DOCK_EVENT(android.intent.action.ACTION_DOCK_EVENT) ,你可以得到底座状态和底座类型。

像电池状态的监听,这个广播intent,也是sticky的。

例子:

  1. IntentFilter dockIntentFilter =
  2. new IntentFilter(Intent.ACTION_DOCK_EVENT);
  3. Intent dock = registerReceiver(null, dockIntentFilter);
  4. int dockState = dock.getIntExtra(Intent.EXTRA_DOCK_STATE,
  5. Intent.EXTRA_DOCK_STATE_UNDOCKED);
  6. boolean isDocked = dockState != Intent.EXTRA_DOCK_STATE_UNDOCKED;

运行时管理Mainfest中声明的Receivers.

通过使用Package Manager, 你可以启用或者禁用接受者,通过方法setComponentEnabledSetting(还包括activity,service)。

这样的话,当你需要监听的时候,就可以禁用这个广播。(爽吧)

下面给出代码片段:

ComponentName myReceiverName = new ComponentName( this , MyReceiver. class );
PackageManager pm = getPackageManager();
 
// Enable a manifest receiver
pm.setComponentEnabledSetting(myReceiverName, 
PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 
PackageManager.DONT_KILL_APP);
 
// Disable a manifest receiver
pm.setComponentEnabledSetting(myReceiverName, 
PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 
PackageManager.DONT_KILL_APP);


转自:http://my.oschina.net/wangjunhe/blog/101913

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/902012
推荐阅读
相关标签
  

闽ICP备14008679号