Android学习_广播-阿里云开发者社区

开发者社区> 张维ACE> 正文

Android学习_广播

简介: 广播接收器也是运行在UI线程,因此,onReceive方法中不能执行太耗时的操作。否则将因此ANR。一般情况下,根据实际业务需求,onReceive方法中都会涉及到与其他组件之间的交互,如发送Notification、启动service等。 当此Activity实例化时,会动态将MyBroadcastReceiver注册到系统中。 当此Activity销毁时,动态注册的MyBroa
+关注继续查看


广播接收器也是运行在UI线程,因此,onReceive方法中不能执行太耗时的操作。
否则将因此ANR。一般情况下,根据实际业务需求,
onReceive方法中都会涉及到与其他组件之间的交互,
如发送Notification、启动service等。


当此Activity实例化时,会动态将MyBroadcastReceiver注册到系统中。
当此Activity销毁时,动态注册的MyBroadcastReceiver将不再接收到相应的广播。


 根据广播的发送方式,可以将其分为以下几种类型:
1.Normal Broadcast:普通广播

2.System Broadcast: 系统广播
涉及到手机的基本操作,基本上都会发出相应的系统广播。如:开启启动,网络状态改变,
拍照,屏幕关闭与开启,点亮不足等等。每个系统广播都具有特定的intent-filter,
其中主要包括具体的action,系统广播发出后,将被相应的BroadcastReceiver接收。
系统广播在系统内部当特定事件发生时,有系统自动发出。
3.Ordered broadcast:有序广播
定义过程与普通广播无异,
只是其的主要发送方式变为:sendOrderedBroadcast(intent, receiverPermission, ...)。
priority属性值从大到小排序,对于具有相同的priority的动态广播和静态广播,动态广播会排在前面。
4.Sticky Broadcast:粘性广播(在 android 5.0/api 21中deprecated,不再推荐使用,
相应的还有粘性有序广播,同样已经deprecated)

5.Local Broadcast:App应用内广播




常见的增加安全性的方案是:


1.对于同一App内部发送和接收广播,将exported属性人为设置成false,使得非本App内部发出的此广播不被接收;


2.在广播发送和接收时,都增加上相应的permission,用于权限验证;


3.发送广播时,指定特定广播接收器所在的包名,具体是通过intent.setPackage(packageName)指定在,
这样此广播将只会发送到此包中的App内与之相匹配的有效广播接收器中。
//registerReceiver(mBroadcastReceiver, intentFilter);
//注册应用内广播接收器
localBroadcastManager = LocalBroadcastManager.getInstance(this);
localBroadcastManager.registerReceiver(mBroadcastReceiver, intentFilter);

//unregisterReceiver(mBroadcastReceiver);
//取消注册应用内广播接收器
localBroadcastManager.unregisterReceiver(mBroadcastReceiver);


Intent intent = new Intent();
intent.setAction(BROADCAST_ACTION);
intent.putExtra("name", "qqyumidi");
//sendBroadcast(intent);
//发送应用内广播
localBroadcastManager.sendBroadcast(intent);


1.//动态广播 注册和发送
/**
* 定义一个BroadcastReceiver广播接收类:
*/
private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals(ACTION_NAME)) {
Toast.makeText(MainActivity.this, "处理action名字相对应的广播", 200);
}
}
};


/**
* 注册广播
*/
public void registerBoradcastReceiver() {
IntentFilter myIntentFilter = new IntentFilter();
myIntentFilter.addAction(ACTION_NAME);
// 注册广播
registerReceiver(mBroadcastReceiver, myIntentFilter);//接收者对象、接受者action
}


1)先调用注册广播
2)发送广播
Intent mIntent = new Intent(ACTION_NAME);
mIntent.putExtra("txt", "发送广播,相当于在这里传送数据");


// 发送广播
sendBroadcast(mIntent);
3)销毁
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
unregisterReceiver(recevier);
}


2.静态注册广播
2.1定义广播类继承 BroadcastReceiver
@Override
public void onReceive(Context context, Intent intent) {


Log.i("TAG", "NormalBroadCastRecevier");
Log.i("TAG", "Action=" + intent.getAction());
}
2.2在manifest中注册 广播action
<receiver android:name="???" >
            <intent-filter>
                <action android:name="com.jingtai" />
            </intent-filter>
        </receiver>


2.3发送广播
Log.i("TAG", "静态注册-正在发送正常广播....");
// 封装要启动的广播接收器的action
Intent intent = new Intent("com.jingtai");
sendBroadcast(intent);


3.有序广播 priority
3.1广播的注册方法:通过设置android:priority的数值,控制广播接收的优先级
<receiver android:name="com.??" >
            <intent-filter android:priority="80">
                <action android:name="com.order" />
            </intent-filter>
        </receiver>
3.2BroadcastReceiver 中onReceive方法中的参数的传递
封装 bundle参数
Bundle bundle = new Bundle();
bundle.putString("txt", "收到广播之后立马结束广播");
setResultExtras(bundle);
接收 bundle参数
Bundle bundle = this.getResultExtras(true);
Log.i("TAG", "---->values=" + bundle.getString("txt"));


1)创建 多了BroadcastReceiver 对象
2)manifest 注册相同的action  不同的 android:priority= "数值"
3)启动调用  有序广播
// 封装ID
Intent intent = new Intent();
intent.setAction("com.example.ch16_broadcast_ABCD");
// 发送有序广播
sendOrderedBroadcast(intent, null);
============================================
数据传递  有序广播接收者中的数据传递方法;
拦截有序广播  abortBroadcast();
priority 数值越大,优先级越高,即,越先接收到广播
<intent-filter android:priority="1000"> 
                 <action android:name="actionName" />
            </category></action></intent-filter>
String strMsg = intent.getStringExtra("msg");
        Log.e("pzf", "第一个:"+strMsg);
        Bundle extras=new Bundle();
        extras.putString("msg", "第一个界面传过来的"+strMsg);
        setResultExtras(extras); //继续向下川

//abortBroadcast();//开启此处,可以截断广播,不让它传到third中
        String strMsg = intent.getStringExtra("msg"); //获取广播的原始数据
        Log.e("pzf", "第二个:"+strMsg);
        Bundle extras=new Bundle();
        extras.putString("msg", "第二个界面传过来的"+strMsg);
        setResultExtras(extras); //继续向下   
        setResultData("第二个:"+strMsg); // "第二个:"+strMsg这是two中新的数据,传递到third中,在third中是用getResultData来获得setResultData("")中的数据
    
String resultData = getResultData();//获取two中setResultData中的数据
        Bundle bundle = getResultExtras(true);//获取two中setResultExtras中的数据
        String bundleData = bundle.getString("msg", "");//获取two中setResultExtras()中的数据 
        String strMsg = intent.getStringExtra("msg");//获取广播的原始数据
        Log.e("pzf", "第三个:"+strMsg); 
        Log.e("pzf", "two中传到third新的数据:"+resultData);
        Log.e("pzf", "two中setResultExtras(extras)传到third新的数据:"+bundleData);
   
==============================================


4.举例演示 Service 和Broadcast 结合刷新UI
4.1主页面注册 广播
private BroadcastReceiver recevier = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
int value = intent.getIntExtra("Key",0);
tv.setText(value + "%");
if (value == 100) {
btnStart.setEnabled(true);
tv.setText("下载完成!");
}
}
};

protected void onDestroy() {
unregisterReceiver(recevier);
};
4.2 注册广播的 IntentFilter 
private void initIntentFilter(){
IntentFilter filter = new IntentFilter();
filter.addAction("MyService_send Inner_Broadcast");
this.registerReceiver(recevier, filter);
}
4.3 启动服务类、模拟下载的线程
Intent intent = new Intent(MainActivity.this, MyService.class);
startService(intent);
btnStart.setEnabled(false);//设置按钮不可以点击
4.4 MyService 的实现类 模拟下载耗时操作 发送广播刷新UI
public class MyService extends Service {
@Override
public IBinder onBind(Intent intent) {return null;}
@Override
public void onCreate() {super.onCreate();}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// 模拟耗时操作
new Thread(new Runnable() {
@Override
public void run() {
int count = 0;
Intent i = new Intent();
i.setAction("MyService_send Inner_Broadcast");
while (count < 100) {
count++;
// 模拟多少时间之后才发送广播
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
i.putExtra("Key", count);
// 开始发送广播
sendBroadcast(i);
}
}
}).start();


return super.onStartCommand(intent, flags, startId);
}
}




系统的广播的Action,在离线api可以搜索
Standard Broadcast Actions


These are the current standard actions that Intent defines for 
receiving broadcasts (usually through registerReceiver(BroadcastReceiver, 
IntentFilter) or a <receiver> tag in a manifest).


ACTION_TIME_TICK
ACTION_TIME_CHANGED
ACTION_TIMEZONE_CHANGED
ACTION_BOOT_COMPLETED
ACTION_PACKAGE_ADDED
ACTION_PACKAGE_CHANGED
ACTION_PACKAGE_REMOVED
ACTION_PACKAGE_RESTARTED
ACTION_PACKAGE_DATA_CLEARED
ACTION_UID_REMOVED
ACTION_BATTERY_CHANGED
ACTION_POWER_CONNECTED
ACTION_POWER_DISCONNECTED
ACTION_SHUTDOWN

具体的demo 下载: http://download.csdn.net/detail/flyingsir_zw/9526557

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
9553 0
Android中BroadcastReceiver广播
BroadCastReceiver 简介 广播接收者( BroadcastReceiver )用于接收广播 Intent ,广播 Intent 的发送是通过调用 Context.sendBroadcast() 、 Context.sendOrderedBroadcast() 来实现的。
690 0
广播的最佳实践——实现强制下线功能(Android_Broadcast)
 关键词:Broadcast, 生命周期,继承 本项目基本思路: 1.先创建一个ActivityCollector类用于管理所有的活动; 2.然后创建一个BaseActivity类作为所有活动的父类: 父类功能有二: 其一,用于辅助统筹管理本项目的所有活动。
593 0
说说Android的广播(1) - 普通广播,有序广播和粘性广播
关于Broadcast,有几点需要了解。首先是广播的类型,然后是广播的发送方法,最后是广播是如何被接收的。这三者相辅相承的,比如普通广播和有序广播只有在详细了解了广播的接收过程了之后,才能真正明白它的含义。
6011 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
13251 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
11561 0
Android利用广播监听设备安装和卸载应用程序
MainActivity如下: package cn.testappaddandremove; import android.os.Bundle; import android.
802 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
6964 0
+关注
张维ACE
北京阿里云ACE会长
170
文章
12
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载