我要没有网络的情况下, 能使用的android广播机制版手机广播。 我手机的没有广播了。

网络广播电台 3.00.0 For android,网络广播破解版|网络广播注册码,手机应用|影音播放|免费软件下载
<meta name="description" content="网络广播电台 3.00.0 For android,网络广播,网络广播软件,网络广播软件下载,破解版|网络广播注册码,
播送以全国电台音频节目为基石,集情感、评书、
风趣、小说、影视、生活、教育、原创等节目为一体的崭新网络
播送模式。分直播与点播
模式,全天候24小时为全国消费者带来精彩绝伦">
本站中文域名:、 
        
     
 您的位置:
>> 网络广播电台 3.00.0 For android
&网络广播电台 3.00.0 For android
网络广播电台 3.00.0 For android简介:
播送以全国电台音频节目为基石,集情感、评书、
风趣、小说、影视、生活、教育、原创等节目为一体的崭新网络
播送模式&。分直播与点播
模式,全天候24小时为全国消费者带来精彩绝伦的
播送节目,您更
可以在收听节目期间直接与电台王牌主播直接互动,分享收听体验&。让您让您足不出户,听尽天下大事&。
  1, 断点续播程序会智能记忆消费者退出时的播放
工夫点,再一次
接续收听&。
  2, 多屏互动同一帐号下,节目可在、电脑、Pad多个终端
随便切换&。还可在多个终端中间与好友互动&。
  3, 台网互动与多家
播送电台深度合作,推出节目直播实时互动
模式&。不只
参加直播,更可与金牌主播亲热接触&。
软件下载区:
注册码、注册机:
 手机软件下载
 相关软件下载
 热点软件下载
车友晒价详情
<font color="#FF
南京大名路
<font color="#FF万
去南通上海大众4S店,问到价格22.18万元!
暂时没有问,因为当地没有斯柯达4S店,参考网上的报价。
<font color="#FF万
大众江都店
<font color="#FF万
我去了泰州那边要27送脚垫啊什么的小件
<font color="#FF
要求最近两个月出厂的新车
<font color="#FF万
江阴新东亚汽车销售服务有限公司(4S店)。我是电话咨询的,说的优惠6000元现金,其他没有说,要到店详谈。
<font color="#FF万
南京坤龙汽车
地址:江宁区东山街道润麒路19号
现在明锐 2015款 1.6L 自动逸俊版裸车价格:12.99万元
团购车型:
加入微信号,了解汽车///活动
| 站长工具:
加入官方微信号
渠道报价/招聘
任你发任你查
All Rights Reserved.
珠江路在线版权所有
苏ICP备号 中文域名:
 |  | 有没有什么 连网络的安卓系统 广播电台 手机软件?_百度知道
有没有什么 连网络的安卓系统 广播电台 手机软件?
有的,TuneIn Radio Pro就是一款很好的收音机,我也在用,能听hit FM!
其他类似问题
为您推荐:
其他1条回答
推荐你下载一个安卓市场,里面有你想要下载的所有软件,不全的话再装一个百度应用,基本上所有安卓软件都能有了!望采纳!不懂问我!
您可能关注的推广
安卓系统的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁最新 Android 版 Google Now 在没有网络情况下都会继续为用户显示特定资讯
有用 Android 版
的用户也会知道,当在没有网络连线的情况下,Google Now 便会只显示没有网络的字句,然后本来有的提示卡片都会显示不到出来。不过现在只要用户把其更新至最新版本的话,即使在没有网络的情况下,Google Now 除了会显示原有的没有网络字句之外,其他本来已经载入了的资讯卡片都依然会留在页面中,不受网络情况影响。所以,即使大家暂时跟世界断线的话也不会错失 Now 的重要提醒事项。
引用来源:
来墙内试试 照样跪 同学看了我的Google Now觉得特别愚蠢然后他就去买了个N5然后他的同学去波士顿的时候都觉得Google Now实在是太厉害然后我们班就有了5台N5.... 啊本来是要发独立的楼的 抱歉抱歉。 俗称看缓存 我很奇怪为什么UK也不能用google now 你没改语言吧。。。用简体中文是不行的。。。 原先虽然速度慢点,好歹墙内还能用。现在升了4.4,直接显示中国不能使用!!!解决android3.0版本以上应用接收不到开机广播问题
现在是 下午15:27.
好久没写过东西,突然间灵感喷发想写点东西(其实是刚刚弄好了一个棘手的问题,自豪中。。呵呵呵呵 我牛掰)。废话不多说,进入正题。
不知道你们又没有碰到这问题,本身做的一个应用,能够监听开机广播的。但很奇怪,在android3.0以下的版本 你怎么跑都没问题。但是在android3.0以上的版本就恐怕情况不一样了。你会发现往往很多时候接收不到开机广播。这是为什么呢?嘿 不告诉你! 说笑的 其实这方面百度很多人给出为什么了。我在这就不多废话了,今天我们要说的是解决方法。
好了,既然说到解决方法,网上给出的有两种:
1.添加权限
2.把你写的app升级成为系统app
先说第一种吧,这种呢我试过 在android系统4.0以下的貌&#20284;有用。但如果你用android版本4.0以上的机子你就会发现还是老样子,广播接收不到。
那好吧,看来也就只剩下第二种方法咯,呵呵呵 正好 我今天要说的也是第二种方法。开工!!!!
前提准备:
1.一台已经ROOT成功的机子。什么?不知道怎么root? 别问我 市面上有什么工具。
2.哦 没有2了 你只要准备一台已经root成功的机子就行。硬要说点什么的话,java环境吧 eclipse android环境吧。
基本思路:我本来安装的app是具有接收开机广播的权限的,但是系统却不发送给我们自己写的应用,但是细心的你会发现,每次开机或者关机 我们的android手机都是会发送开机广播的(android.intent.action.BOOT_COMPLETED),只是我们做的app接收不到而已。但是,手机的系统级别的app是一定会接受到的。好了,那么如果我们有方法把我们做的应用提升级别成为系统级的app,是否意味着一样可以接收开机广播了呢?好,我们来尝试一下。如何?
首先,假设我现在写了一个Test02.apk
让我们来看看Test02.apk这项目里面都做了什么 先来看一下它的AndroidManifest.xml文件
<manifest xmlns:android="/apk/res/android"
package="com.example.test02"
android:versionCode="1"
android:versionName="1.0" >
android:minSdkVersion="8"
android:targetSdkVersion="19"
android:sharedUserId="android.uid.system"/>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
android:name="com.example.test02.MainActivity"
android:label="@string/app_name" >
声明了一个Receiver,用于接收开机广播,好 那我们来看看这个BrocatTest又做了什么
public class BrocatTest extends BroadcastReceiver{
public void onReceive(Context arg0, Intent arg1) {
// TODO Auto-generated method stub
Log.i("BrocatTest", "run here.....");
嘿嘿。。只是打印一句话而已。。。。。。。。。。。
接下来我们拿到Test02.apk 我们把它放到电脑D盘目录下
打开cmd 进入adb shell 输入命令 adb push D:\Test02.apk /sdcard/ 把D盘目录下的Test02.apk复制到手机的sdcard卡目录下
看一下你们手机system文件夹是否处于可写入的状态(rw),默认是只读(ro)
如果处于只读的状态(ro) 那么就要把状态改为可写的状态
mount -o remount,rw -t -yaffs2 /dev/block/mtdblock3 /system
再次使用这命令,看状态是否改变了
如果状态已经改变了 执行
cat /sdcard/Test02.apk > /system/app/Test02.apk
执行完后Test02.apk已经成功的写入/system/app文件夹了,这个文件夹就是专门存放系统app的地方,放心。手机会自动帮你安装的,如果你想确认的话
cd /system/app
看有没有Test02.apk这个apk包
最后别忘了执行mount -o -remount,ro -t -yaffs2 /dev/block/mtdblock3 /system 把状态&#20540;改回来
接着重启一下手机看看。。你会得到以外的惊喜。
好了到这里 上面的都是要通过adb shell操作完成的 那么有没有说 我写在代码里的 我直接执行就可以了呢?
呵呵呵呵 有 马上来。
我们在Eclipse新建一个项目Test06 目录如下
首先我们把我们要提升为系统app的apk包放到assets文件夹下
接着我们先来看一下 SDCardUtil这个类,这个类的工作就是把位于assets目录下的Test02.apk文件以流的方式写入手机的sdcard
* 对于SD卡的操作类
* @author YangMo*/
public class SDCardUtil {
private boolean hasCard = //判断是否存在SD卡
private String sdPath
private String filePath =
* 构造函数*/
public SDCardUtil(Context context){
this.context =
= Environment.getExternalStorageState().equals( android.Z"/kf/ware/vc/" target="_blank" class="keylink">vcy5FbnZpcm9ubWVudC5NRURJQV9NT1VOVEVEICk7PGJyPgogIHRyeSB7PGJyPgogICBzZFBhdGggICAgICAgID0gRW52aXJvbm1lbnQuZ2V0RXh0ZXJuYWxTdG9yYWdlRGlyZWN0b3J5KCkuZ2V0Q2Fub25pY2FsUGF0aCgpOzxicj4KICAgZmlsZVBhdGggICA9IHRoaXMuY29udGV4dC5nZXRGaWxlc0RpcigpLmdldFBhdGgoKTs8YnI+CiAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgezxicj4KICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jazxicj4KICAgZS5wcmludFN0YWNrVHJhY2UoKTs8YnI+CiAgfTwvcD4KPHA+ICBTeXN0ZW0ub3V0LnByaW50bG4o"sdPath = "&#43;sdPath);
System.out.println("filePath = "&#43;filePath);
public boolean isOk(){
return hasC
* 将文件写入SD卡内*/
public int readStreamToSDCard(InputStream is, String fileName){
int state = -1;
FileOutputStream fos = new FileOutputStream(sdPath &#43;"/" &#43;fileName);
byte[] buffer = new byte[8192];
int count = 0;
while( (count = is.read(buffer)) != -1 ){
fos.write(buffer, 0, count);
fos.close();
is.close();
state = 0;
}catch(Exception e){
e.printStackTrace();
return -1;
我们再来看看RootCmd这个类,这个类主要的工作就是代替我们的adb shell
public final class RootCmd {
// 执行linux命令并且输出结果
protected static String execRootCmd(String paramString) {
String result = "result : ";
Process localProcess = Runtime.getRuntime().exec("su ");
// 经过Root处理的android系统即有su命令
OutputStream localOutputStream = localProcess.getOutputStream();
DataOutputStream localDataOutputStream = new DataOutputStream(localOutputStream);
InputStream localInputStream = localProcess.getInputStream();
DataInputStream localDataInputStream = new DataInputStream(localInputStream);
String str1 = String.valueOf(paramString);
String str2 = str1 &#43; "\n";
localDataOutputStream.writeBytes(str2);
localDataOutputStream.flush();
String str3 =
while ((str3 = localDataInputStream.readLine()) != null) {
Log.d("result", str3);
localDataOutputStream.writeBytes("exit\n");
localDataOutputStream.flush();
localProcess.waitFor();
} catch (Exception localException) {
localException.printStackTrace();
// 执行linux命令但不关注结果输出
protected static int execRootCmdSilent(String paramString) {
Process localProcess = Runtime.getRuntime().exec("su");
Object localObject = localProcess.getOutputStream();
DataOutputStream localDataOutputStream = new DataOutputStream((OutputStream) localObject);
String str = String.valueOf(paramString);
localObject = str &#43; "\n";
localDataOutputStream.writeBytes((String) localObject);
localDataOutputStream.flush();
localDataOutputStream.writeBytes("exit\n");
localDataOutputStream.flush();
localProcess.waitFor();
int result = localProcess.exitValue();
return (Integer)
} catch (Exception localException) {
localException.printStackTrace();
return -1;
// 判断机器是否已经root,即是否获取root权限
protected static boolean haveRoot() {
int i = execRootCmdSilent("echo test");
// 通过执行测试命令来检测
if (i != -1) {
接着 我们来看看我们的主Activity大人里面做了什么工作
public class MainActivity extends ActionBarActivity{
private static String FILENAME = "Test02.apk";
private int state = -1;
//adb shell命令
String paramString= "adb shell" &#43;"\n"&#43;
"su" &#43;"\n"&#43;
"mount -o remount,rw -t yaffs2 /dev/block/mtdblock3 /system" &#43;"\n"&#43;
"cat /sdcard/Test02.apk > /system/app/Test02.apk" &#43;"\n"&#43;
"mount -o remount,ro -t yaffs2 /dev/block/mtdblock3 /system" &#43;"\n"&#43;
"exit" &#43;"\n"&#43;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SDCardUtil sdUtil = new SDCardUtil(this);
if(sdUtil.isOk()){
InputStream is = getApplicationContext().getAssets().open(FILENAME);
state = sdUtil.readStreamToSDCard(is, FILENAME);
Toast.makeText(this, getApplicationContext().getString(R.string.sd_title), Toast.LENGTH_SHORT).show();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
if(state == 0){//一切准备就绪,进行将应用提升为级别应用的操作
if(RootCmd.haveRoot()){
if(RootCmd.execRootCmdSilent(paramString)==-1){
Toast.makeText(this, getApplicationContext().getString(R.string.initialiseOk), Toast.LENGTH_LONG).show();
Toast.makeText(this, getApplicationContext().getString(R.string.initialiseFail), Toast.LENGTH_LONG).show();
Toast.makeText(this, getApplicationContext().getString(R.string.noRoot), Toast.LENGTH_LONG).show();
if(sdUtil.isOk()){
InputStream is = getApplicationContext().getAssets().open(FILENAME);
state = sdUtil.readStreamToSDCard(is, FILENAME);
Toast.makeText(this, getApplicationContext().getString(R.string.sd_title), Toast.LENGTH_SHORT).show();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
这部分的代码先把apk写到我们的sd卡里面
if(state == 0){//一切准备就绪,进行将应用提升为系统级别应用的操作
if(RootCmd.haveRoot()){
if(RootCmd.execRootCmdSilent(paramString)==-1){
Toast.makeText(this, getApplicationContext().getString(R.string.initialiseOk), Toast.LENGTH_LONG).show();
Toast.makeText(this, getApplicationContext().getString(R.string.initialiseFail), Toast.LENGTH_LONG).show();
Toast.makeText(this, getApplicationContext().getString(R.string.noRoot), Toast.LENGTH_LONG).show();
而这部分就是代替我们手工的adb shell操作了
注意paramString这个属性的声明
//adb shell命令
String paramString= "adb shell" &#43;"\n"&#43;
"su" &#43;"\n"&#43;
"mount -o remount,rw -t yaffs2 /dev/block/mtdblock3 /system" &#43;"\n"&#43;
"cat /sdcard/Test02.apk > /system/app/Test02.apk" &#43;"\n"&#43;
"mount -o remount,ro -t yaffs2 /dev/block/mtdblock3 /system" &#43;"\n"&#43;
"exit" &#43;"\n"&#43;
恩恩,好了,连接上你的手机 run一下Test06这个项目看看。。。。嘿嘿~~Android组件系列----BroadcastReceiver广播接收器
一、广播的功能和特征
广播的生命周期很短,经过调用对象--&实现onReceive--&结束,整个过程就结束了。从实现的复杂度和代码量来看,广播无疑是最迷你的Android 组件,实现往往只需几行代码。广播对象被构造出来后通常只执行BroadcastReceiver.onReceive方法,便结束了其生命周期。所以有的时候我们可以把它当做函数看也未必不可。
和所有组件一样,广播对象也是在应用进程的主线程中被构造,所以广播对象的执行必须是要同步且快速的。也不推荐在里面开子线程,因为往往线程还未结束,广播对象就已经执行完毕被系统销毁。如果需要完成一项比较耗时的工作 , 应该通过发送 Intent 给 Service, 由 Service 来完成。
每次广播到来时 , 会重新创建 BroadcastReceiver 对象 , 并且调用 onReceive() 方法 , 执行完以后 , 该对象即被销毁 . 当 onReceive() 方法在 10 秒内没有执行完毕, Android 会认为该程序无响应。
二、接收系统广播:
广播接收器可以自由地对自己感兴趣的广播进行注册,这样当有相应的广播发出时,广播接收器就能收到该广播,并在内部处理相应的逻辑。注册广播的方式有两种,在代码中注册和在清单文件中注册,前者称为动态注册,后者称为静态注册。
1、动态注册监听网络变化:
新建工程文件,首先在MainActivity中定义一个内部类netWorkChangeReceiver,并重写父类的onReceive()方法,这样每当网络状态发生变化时,onReceive()方法就会得到执行,这里使用Toast提示一段文本信息,代码如下:
class netWorkChangeReceiver extends BroadcastReceiver {
& & & & @Override
& & & & public void onReceive(Context context, Intent intent) {
& & & & & & Toast.makeText(context, &network changes&, Toast.LENGTH_SHORT).show();
& & & & } & & & &
紧接着在onCreate方法中进行动态注册,然后在onDestroy方法中进行取消注册:
&1 & & private IntentFilter intentF
&2 & & private netWorkChangeReceiver netWorkChangeR
&4 & & @Override
&5 & & protected void onCreate(Bundle savedInstanceState) {
&6 & & & & super.onCreate(savedInstanceState);
&7 & & & & setContentView(R.layout.activity_main);
&8 & & & &&
&9 & & & & //动态注册:创建一个IntentFilter的实例,添加网络变化的广播(功能是对组件进行过滤,只获取需要的消息)
10 & & & & intentFilter = new IntentFilter();
11 & & & & intentFilter.addAction(&android.net.conn.CONNECTIVITY_CHANGE&);
12 & & & & //创建NetWorkChangeReceiver的实例,并调用registerReceiver()方法进行注册
13 & & & & netWorkChangeReceiver = new netWorkChangeReceiver();
14 & & & & registerReceiver(netWorkChangeReceiver, intentFilter);
15 & & & &&
18 & & //取消注册,一定要记得,不然系统会报错
19 & & @Override
20 & & protected void onDestroy() {
21 & & & & super.onDestroy();
22 & & & & unregisterReceiver(netWorkChangeReceiver);
上方代码解释如下:
11行:给意图过滤器intentFilter添加一个值为android.net.conn.CONNECTIVITY_CHANGE的action。因为每当网络状态发生变化时,系统就会发出一条值为android.net.conn.CONNECTIVITY_CHANG的广播。
注:最后要记得,动态注册的广播接收器一定要取消注册才行。
运行程序,就可以了。
不过只是提醒网络发生变化还不够人性化,为了能够准确的告诉用户当前是有网络还是没有网络,我们还需要对上述代码进一步优化,修改netWorkChangeReceiver中的代码如下:
&1 & & class netWorkChangeReceiver extends BroadcastReceiver {
&2 & & & &&
&3 & & & & @Override
&4 & & & & public void onReceive(Context context, Intent intent) {
&5 & & & & & & //通过getSystemService()方法得到connectionManager这个系统服务类,专门用于管理网络连接
&6 & & & & & & ConnectivityManager connectionManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
&7 & & & & & & NetworkInfo networkInfo = connectionManager.getActiveNetworkInfo();
&8 & & & & & & if(networkInfo != null && networkInfo.isAvailable()){
&9 & & & & & & & & Toast.makeText(context, &network is available&,Toast.LENGTH_SHORT).show();
10 & & & & & & }else{
11 & & & & & & & & Toast.makeText(context, &network is unavailable&,Toast.LENGTH_SHORT).show();
12 & & & & & & }
13 & & & & & & & &&
14 & & & & }
上方代码解释:
06行:在onReceive()方法中,首先通过通过getSystemService()方法得到connectionManager这个系统服务类,专门用于管理网络连接。
07行:然后调用它的getActiveNetworkInfo()方法可以得到NetworkInfo的实例,接着调用NetworkInfo的isAvailable()方法,就可以判断当前是否有网络了,最后通过Toast提示用户。
另外,查询系统的网络状态是需要申明权限的,打开清单文件,添加如下权限:
&uses-permission android:name=&android.permission.ACCESS_NETWORK_STATE&/&
注:访问/reference/android/Manifest.permission.html可以查看Android系统所有的可声明的权限。
现在运行程序,就可以了。
上方程序完整版代码如下:
&View Code&
2、静态注册实现开机启动:
动态注册的方式比较灵活,但缺点是:必须在程序启动之后才能接收到广播,因为注册的逻辑是写在onCreate()方法中的。为了让程序在未启动的情况下就能接收到广播,这里就需要使用到静态注册。
这里我们准备让程序接收一条开机广播,当收到这条广播时,就可以在onReceive()方法中执行相应的逻辑,从而实现开机启动的功能。
新建一个类:BootCompleteReceiver,让他继承BroadcastReceiver,在onReceive()方法中简单地Toast一下,代码如下:
public class BootCompleteReceiver extends BroadcastReceiver {
& & @Override
& & public void onReceive(Context context, Intent intent) {
& & & & Toast.makeText(context, &Boot Complete&, Toast.LENGTH_SHORT).show();
可以看到,这里不再使用内部类的方式来定义广播接收器,因为稍后我们需要在清单文件AndroidManifest.xml中将这个广播接收器的类名注册进去。
然后修改清单文件AndroidManifest.xml,代码如下:
&1 &uses-sdk
&2 & & & & android:minSdkVersion=&8&
&3 & & & & android:targetSdkVersion=&16& /&
&4 & & &uses-permission android:name=&android.permission.ACCESS_NETWORK_STATE&/&
&5 & & &uses-permission android:name=&android.permission.RECEIVE_BOOT_COMPLETED&/&
&7 & & &application
&8 & & & & android:allowBackup=&true&
&9 & & & & android:icon=&@drawable/ic_launcher&
10 & & & & android:label=&@string/app_name&
11 & & & & android:theme=&@style/AppTheme& &
12 & & & & &activity
13 & & & & & & android:name=&com.example.m05_broadcastreceiver01.MainActivity&
14 & & & & & & android:label=&@string/app_name& &
15 & & & & & & &intent-filter&
16 & & & & & & & & &action android:name=&android.intent.action.MAIN& /&
18 & & & & & & & & &category android:name=&android.intent.category.LAUNCHER& /&
19 & & & & & & &/intent-filter&
20 & & & & &/activity&
21 & & & &&
22 & & & & &receiver android:name=&.BootCompleteReceiver&&
23 & & & & & & &intent-filter &
24 & & & & & & & & &action android:name=&android.intent.action.BOOT_COMPLETED&/&
25 & & & & & & &/intent-filter&
26 & & & & &/receiver&
27 & & &/application&
代码解释如下:
终于,&application&标签内多了个子标签&receiver&,所有的静态注册的广播接收器都是在这里进行注册的。
22行:name中为广播接收器的名字
24行:想要接收的广播。Android系统启动完成后,会发出这条名为android.intent.action.BOOT_COMPLETED的广播。
05行:监听系统开机广播需要声明权限。
运行程序后,将手机关机重启,就能收到这条广播了。
三、发送自定义广播
1、发送标准广播  
新建工程文件。在发广播之前,我们先定义一个广播接收器来接收此广播才行。因此,新建一个类:MyBroadcastReceiver,让他继承BroadcastReceiver,代码如下:
public class MyBroadcastReceiver extends BroadcastReceiver {
& & @Override
& & public void onReceive(Context context, Intent intent) {
& & & & Toast.makeText(context, &received in MyBroadcastReceiver&, Toast.LENGTH_SHORT).show();
这里,当MyBroadcastReceiver 收到自定义的广播时,就会执行onReceive()方法中的逻辑,弹出一个Toast。
紧接着,要在清单文件AndroidManifest.xml中对这个广播接收器进行注册:
&1 & & &application
&2 & & & & android:allowBackup=&true&
&3 & & & & android:icon=&@drawable/ic_launcher&
&4 & & & & android:label=&@string/app_name&
&5 & & & & android:theme=&@style/AppTheme& &
&6 & & & & &activity
&7 & & & & & & android:name=&com.example.m05_broadcastreceiver02.MainActivity&
&8 & & & & & & android:label=&@string/app_name& &
&9 & & & & & & &intent-filter&
10 & & & & & & & & &action android:name=&android.intent.action.MAIN& /&
12 & & & & & & & & &category android:name=&android.intent.category.LAUNCHER& /&
13 & & & & & & &/intent-filter&
14 & & & & &/activity&
15 & & & &&
16 & & & & &receiver android:name=&.MyBroadcastReceiver&&
17 & & & & & & &intent-filter &
18 & & & & & & & & &action android:name=&com.example.m05_broadcastreceiver02.MY_BROADCAST&/&
19 & & & & & & &/intent-filter&
20 & & & & &/receiver&
21 & & &/application&
代码解释:
18行:让MyBroadcastReceiver接收一条值为om.example.m05_broadcastreceiver02.MY_BROADCAST的广播,因此待会儿在发送广播的时候,我们就需要发出这样的一条广播。
紧接着,修改activity.xml中的代码,添加一个按钮Button。
然后,修改MainActivity.java中的代码,添加Button的监听事件:点击按钮时,发送广播
& & & & Button button1=(Button)findViewById(R.id.button1);
& & & & button1.setOnClickListener(new OnClickListener() { & & & & & &
& & & & & & @Override
& & & & & & public void onClick(View v) {
& & & & & & & & Intent intent =new Intent(&com.example.m05_broadcastreceiver02.MY_BROADCAST&);
& & & & & & & & sendBroadcast(intent);
& & & & & & }
& & & & });
总结:可以看到,点击按钮时,发送com.example.m05_broadcastreceiver02.MY_BROADCAST这条广播,这样,所有能够监听com.example.m05_broadcastreceiver02.MY_BROADCAST这条广播的广播接收器就都会同时收到消息,此时发出去的就是一条标准广播,即无序广播。所以接下来就需要讲到有序广播。
2、发送有序广播:
广播是一种可以跨进程的通信方式,其他应用程序是可以收到的。现在我们来发一条有序广播。
有序广播不仅有先后顺序,而且前面的广播还可以将后面的广播截断。
在5.3.1的代码基础之上,将按钮的监听事件修改如下:
1 & & & & Button button1=(Button)findViewById(R.id.button1);
2 & & & & button1.setOnClickListener(new OnClickListener() { & & & & & &
3 & & & & & & @Override
4 & & & & & & public void onClick(View v) {
5 & & & & & & & & Intent intent =new Intent(&com.example.m05_broadcastreceiver02.MY_BROADCAST&);
6 & & & & & & & & sendOrderedBroadcast(intent, null);
7 & & & & & & }
8 & & & & });
即将06行代码修改一下,将sendBroadcast()方法改为sendOrderedBroadcast()方法,sendOrderedBroadcast()方法接收两个参数,第二个参数是一个与权限相关的字符串,这里传入null即可。
紧接着,修改清单文件AndroidManifest.xml中对广播接收器的注册,设置优先级:
1 & & & & &receiver android:name=&.MyBroadcastReceiver&&
2 & & & & & & &intent-filter android:priority=&100&&
3 & & & & & & & & &action android:name=&com.example.m05_broadcastreceiver02.MY_BROADCAST&/&
4 & & & & & & &/intent-filter&
5 & & & & &/receiver&
即添加第02行代码。可以看到,通过android:priority属性给广播接收器设置了优先级。这个属性的范围在-,数值越大,优先级越高。
接下来,如果想要拦截这个广播,防止让后面的广播接收器也接收到了这个广播。可以修改MyBroadcastReceiver中的代码:
1 public class MyBroadcastReceiver extends BroadcastReceiver {
3 & & @Override
4 & & public void onReceive(Context context, Intent intent) {
5 & & & & Toast.makeText(context, &received in MyBroadcastReceiver&, Toast.LENGTH_SHORT).show();
6 & & & & abortBroadcast();//拦截广播,防止后面的接收到
即添加第06行代码。如果在onReceive()方法中调用了abortBroadcast()方法,就表示是将这条广播拦截,后面的广播接收器将无法再接收到。
特别关注:
广播接收器的生命周期:关键在于BroadcastReceiver中的onReceive()方法,从onReceive()里的第一行代码开始,onReceive()里的最后一行代码结束。
一个广播到来的时候,用什么方式提醒用户是最友好的呢?第一种方式是吐司,第二种方式是通知。注:不要使用对话框,以免中断了用户正在进行的操作。
四、使用本地广播:
之前我们发送和接收的广播全部都是属于全局广播,即发出去的广播可以被其他任何应用程序接收到,并且我们也可以接收来自于其他任何应用程序的广播。这样一来,必然会造成安全问题。于是便有了本地广播:即只能在本应用程序中发送和接收广播。这就要使用到了LocalBroadcastManager这个类来对广播进行管理。
我们修改2.1中动态注册广播接收器的代码,即修改MainActivity.java中的代码如下:
package com.example.
import android.app.A
import android.content.BroadcastR
import android.content.C
import android.content.I
import android.content.IntentF
import android.os.B
import android.support.v4.content.LocalBroadcastM
import android.view.V
import android.view.View.OnClickL
import android.widget.B
import android.widget.T
public class MainActivity extends Activity {
& & private IntentFilter intentF
& & private LocalReceiver localR
& & private LocalBroadcastManager localBroadcastM
& & @Override
& & protected void onCreate(Bundle savedInstanceState) {
& & & & super.onCreate(savedInstanceState);
& & & & setContentView(R.layout.activity_main);
& & & & //通过LocalBroadcastManager的getInstance()方法得到它的一个实例
& & & & localBroadcastManager = LocalBroadcastManager.getInstance(this);
& & & & Button button = (Button) findViewById(R.id.button);
& & & & button.setOnClickListener(new OnClickListener() {
& & & & & & @Override
& & & & & & public void onClick(View v) {
& & & & & & & & Intent intent = new Intent(
& & & & & & & & & & & & &com.example.broadcasttest.LOCAL_BROADCAST&);
& & & & & & & & localBroadcastManager.sendBroadcast(intent);//调用sendBroadcast()方法发送广播
& & & & & & }
& & & & });
& & & & //动态注册本地的广播接收器
& & & & intentFilter = new IntentFilter();
& & & & intentFilter.addAction(&com.example.broadcasttest.LOCAL_BROADCAST&);
& & & & localReceiver = new LocalReceiver();
& & & & localBroadcastManager.registerReceiver(localReceiver, intentFilter);
& & @Override
& & protected void onDestroy() {
& & & & super.onDestroy();
& & & & localBroadcastManager.unregisterReceiver(localReceiver);
& & class LocalReceiver extends BroadcastReceiver {
& & & & @Override
& & & & public void onReceive(Context context, Intent intent) {
& & & & & & Toast.makeText(context, &received local broadcast&,
& & & & & & & & & & Toast.LENGTH_SHORT).show();
注:本地广播是无法通过静态注册的方式来接收的。其实也完全可以理解,因为静态注册主要就是为了让程序在未启动的情况下也能收到广播。而发送本地广播时,我们的程序肯定是已经启动了,没有必要使用到静态注册的功能。
五、各种各样的广播:&
在android中有很多系统自带的intent.action,通过监听这些事件我们可以完成很多功能。
String BOOT_COMPLETED_ACTION 广播:在系统启动后。这个动作被广播一次(只有一次)。监听: &android.intent.action.BOOT_COMPLETED&
电话拨入:
String ANSWER_ACTION 动作:处理拨入的电话。监听: &android.intent.action.ANSWER&
电量变化:
String BATTERY_CHANGED_ACTION 广播:充电状态,或者电池的电量发生变化。监听: &android.intent.action.BATTERY_CHANGED&
日期改变:
String DATE_CHANGED_ACTION 广播:日期被改变。 监听:&android.intent.action.DATE_CHANGED&
取消更新:
String FOTA_CANCEL_ACTION 广播:取消所有被挂起的 (pending) 更新下载。 监听:&android.server.checkin.FOTA_CANCEL&
更新开始安装:
String FOTA_READY_ACTION 广播:更新已经被下载 可以开始安装。监听 &android.server.checkin.FOTA_READY&
String HOME_CATEGORY 类别:主屏幕 (activity)。设备启动后显示的第一个 activity。 监听:&android.intent.category.HOME&
String PACKAGE_ADDED_ACTION 广播:设备上新安装了一个应用程序包。监听: &android.intent.action.PACKAGE_ADDED&
删除应用:
String PACKAGE_REMOVED_ACTION 广播:设备上删除了一个应用程序包。监听: &android.intent.action.PACKAGE_REMOVED&
屏幕关闭:
String SCREEN_OFF_ACTION 广播:屏幕被关闭。监听: &android.intent.action.SCREEN_OFF&
屏幕开启:
String SCREEN_ON_ACTION 广播:屏幕已经被打开。 监听:&android.intent.action.SCREEN_ON&
时区改变:
String TIMEZONE_CHANGED_ACTION 广播:时区已经改变。监听: &android.intent.action.TIMEZONE_CHANGED&
时间改变:
String TIME_CHANGED_ACTION 广播:时间已经改变(重新设置)。 &android.intent.action.TIME_SET&
时间流逝:
String TIME_TICK_ACTION 广播:当前时间已经变化(正常的时间流逝)。 &android.intent.action.TIME_TICK&
进入大容量存储模式:
String UMS_CONNECTED_ACTION 广播:设备进入 USB 大容量存储模式。 &android.intent.action.UMS_CONNECTED&
退出大容量存储模式:
String UMS_DISCONNECTED_ACTION 广播:设备从 USB 大容量存储模式退出。 &android.intent.action.UMS_DISCONNECTED&
壁纸改变:
String WALLPAPER_CHANGED_ACTION 广播:的墙纸已经改变。 &android.intent.action.WALLPAPER_CHANGED&
String WEB_SEARCH_ACTION 动作:执行 web 搜索。 &android.intent.action.WEB_SEARCH&
网络变化:
String CONNECTIVITY_CHANGE_ACTION 动作:网络变化。&android.intent.action.CONNECTIVITY_CHANGE_ACTION&
六、实例:使用动态注册,监听手机的电量变化。
完整版代码如下:
&1 &LinearLayout xmlns:android=&/apk/res/android&
&2 & & xmlns:tools=&/tools&
&3 & & android:layout_width=&match_parent&
&4 & & android:layout_height=&match_parent&
&5 & & android:paddingBottom=&@dimen/activity_vertical_margin&
&6 & & android:paddingLeft=&@dimen/activity_horizontal_margin&
&7 & & android:paddingRight=&@dimen/activity_horizontal_margin&
&8 & & android:paddingTop=&@dimen/activity_vertical_margin&
&9 & & tools:context=&.MainActivity& &
11 & & &TextView
12 & & & & android:id=&@+id/textView1&
13 & & & & android:layout_width=&match_parent&
14 & & & & android:layout_height=&wrap_content&
15 & & & & android:textSize=&30dp&
16 & & & & android:gravity=&center&/&
18 &/LinearLayout&&
activity_main.xml代码如下:
&1 package com.example.m05_broadcastreceiver02;
&3 import android.app.A
&4 import android.content.BroadcastR
&5 import android.content.C
&6 import android.content.I
&7 import android.content.IntentF
&8 import android.os.B
&9 import android.widget.TextV
11 public class MainActivity extends Activity {
14 & & private BatteryBroadcastReceiver batteryBroadcastR
15 & & private TextView textV
16 & & @Override
17 & & protected void onCreate(Bundle savedInstanceState) {
18 & & & & super.onCreate(savedInstanceState);
19 & & & & setContentView(R.layout.activity_main);
20 & & & & textView=(TextView)findViewById(R.id.textView1);
21 & & & &&
22 & & & & //动态注册监听电量的广播接收器
23 & & & & IntentFilter intentFilter = new IntentFilter();
24 & & & & intentFilter.addAction(&android.intent.action.BATTERY_CHANGED&);
25 & & & & batteryBroadcastReceiver = new BatteryBroadcastReceiver();
26 & & & & registerReceiver(batteryBroadcastReceiver, intentFilter); & & &&
29 & & //取消注册监听电量的广播接收器
30 & & @Override
31 & & protected void onDestroy() {
32 & & & & super.onDestroy();
33 & & & & unregisterReceiver(batteryBroadcastReceiver);
36 & & //新建一个广播接收器,监听电量的变化
37 & & public class BatteryBroadcastReceiver extends BroadcastReceiver {
38 & & & & @Override
39 & & & & public void onReceive(Context context, Intent intent) {
40 & & & & & & if(intent.getAction().equals(Intent.ACTION_BATTERY_CHANGED)) {
41 & & & & & & & & //获取当前电量
42 & & & & & & & & int level = intent.getIntExtra(&level&, 0);
43 & & & & & & & & //电量的总刻度
44 & & & & & & & & int scale = intent.getIntExtra(&scale&, 100);
45 & & & & & & & & textView.setText(&电池电量为&+((level*100) / scale)+&%&);
46 & & & & & & & &&
47 & & & & & & & & //当电量低时,可以进行一些操作,例如弹出通知等
48 /* & & & & & & & &if(level&15){
49 & & & & & & & & & & do something
50 & & & & & & & & }*/
51 & & & & & & }
52 & & & & }
53 & & & &&
紧接着,在清单文件中进行权限声明:
&uses-permission android:name=&android.permission.BATTERY_STATS&/&
MainActivity.java的代码解释如下:
40至45行:固定代码,用于获取当前电量
48至50行:当电量低时,可以进行一些操作,例如弹出通知等}

我要回帖

更多关于 android广播机制 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信