这里我们讲解一下Broadcast的简单使用方法。
1、注册广播
1、静态注册广播接收器
1、创建一个继承自BroadcastReciver的类,重写其onReciver方法即可
2、在AndroidManifest.xml中注册reciver,多个reciver的action可以相同,互不干扰。
3、通过intent来显式或隐式创建广播实例,然后通过sendBroadcast来发送广播
可以演示静态接收开机广播,由于android系统启动完成后会发出一条值为android.intent.action.BOOT_COMPLETED的广播,
所以我们的action就设置为此。
另外,监听系统广播也是需要权限的,需要添加:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
2、动态注册广播接收器
private IntentFilter intentfilter;
private Button bt;
DynamicReceiver myreceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
intentfilter = new IntentFilter("99hz"); //创建一个intent过滤器实例
myreceiver = new DynamicReceiver(); //创建一个广播实例
registerReceiver(myreceiver, intentfilter); //根据过滤器及广播实例进行动态注册
bt = (Button)findViewById(R.id.bt);
bt.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent("99hz");
sendBroadcast(intent);
}
});
}
@Override
protected void onDestroy() { //注意在此方法内解除注册,否则退出时报错
// TODO Auto-generated method stub
super.onDestroy();
unregisterReceiver(myreceiver);
}
class DynamicReceiver extends BroadcastReceiver{ //所注册的广播实体
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
Log.d("hahaha", "dynamicReceiver......");
}
}
2、广播的生命周期
1、静态注册的广播为常驻型广播,也就是说如果应用程序关闭了,有相应事件触发,程序还是会被系统自动调用运行(静态注册的AndroidManifest.xml文件被写到了内存中)
可以通过以下方式来在相应的Activity中取消静态注册的广播,但是注意,除非手手动对其ENABLED,否则后续注册无效(类似于屏蔽指定名字的广播):
private ComponentName cn;
private PackageManager pm;
cn = new ComponentName(MainActivity.this,"com.example.broadcastrecivertest.MyBroadcastReciver");//第二个参数为要取消广播的name
pm = MainActivity.this.getPackageManager();
pm.setComponentEnabledSetting(cn, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
//此函数为可以对四大组件设置使能或者非使能。
//第一个参数为 组件的名称
//第二个参数为newstate,也就是设置为组件的状态
// 不可用状态:COMPONENT_ENABLED_STATE_DISABLED
// 可用状态:COMPONENT_ENABLED_STATE_ENABLED
// 默认状态:COMPONENT_ENABLED_STATE_DEFAULT
//第三个参数为flags,值可以是DONT_KILL_APP或者0。 0说明杀死包含该组件的app
2、动态注册的广播为非常驻型广播,跟随Activity的生命周期,所以在Activity结束之前需要调用unregisterReceiver方法移除它。
3、注意:
1、onReceiver中不要做超过10秒的耗时操作,不然可能弹出ANR(Acclication Not Response)错误。
2、onReceiver中不允许创建线程
4、发送有序广播
1、将sendBroadcast修改为sendOrderedBroadcast
2、既然是有序,所以通过优先级来指定广播接收器接收的顺序(在AndroidManifest.xml中修改,<intent-filter android:priority="100">)
3、有序广播可以在传播过程中被高优先级截断,在对应的onReceive方法中调用abortBroadcast();方法即可。
5、发送本地广播
1、本地广播(应用程序内发送,无法发送给其他应用程序)无法静态注册,因为静态注册主要是为了让程序在未启动的情况下也能收到广播,
而发送本地广播时,我们的程序肯定是已经启动了,因此也完全不需要使用静态注册的功能。
优势:
1、广播只会在程序内部发送,不用担心数据泄露
2、其他程序无法将程序发送到程序内部,不需要担心有安全漏洞的隐患
3、本地广播比全局广播更加高效
2、使用方法:
//发送
private LocalReceiver localReceiver;
private LocalBroadcastManager localBroadcastManager;
localBroadcastManager = LocalBroadcastManager.getInstance(this); //获取本地广播实例
(可以在onClick方法中):
Intent intent = new Intent("广播的名字");
localBroadcastManager.sendBroadcast(intent); //发送本地广播
//接收,注册本地广播接收器
intentFilter = new IntentFilter();
intentFilter.addAction("广播的名字");
localReceiver = new LocalReceiver();
localBroadcastManager.registerReceiver(localReceiver,intentFilter);
//定义本地广播接收器类
class LocalReceiver extends BroadcastReceiver{
public void onReceiver(Context context,Intent intent){
//do something
}
}
热点新闻
讲师博文
这里我们讲解一下Broadcast的简单使用方法。 1、注册广播 1、静态注册广播接收器 1、创建一个继承自BroadcastReciver的类,重写其onReciver方法即可 2、在AndroidManifest.xml中注册reciver,多个reciver的action可...
这里我们讲解一下Broadcast的简单使用方法。
1、注册广播
1、静态注册广播接收器
1、创建一个继承自BroadcastReciver的类,重写其onReciver方法即可
2、在AndroidManifest.xml中注册reciver,多个reciver的action可以相同,互不干扰。
3、通过intent来显式或隐式创建广播实例,然后通过sendBroadcast来发送广播
可以演示静态接收开机广播,由于android系统启动完成后会发出一条值为android.intent.action.BOOT_COMPLETED的广播,
所以我们的action就设置为此。
另外,监听系统广播也是需要权限的,需要添加:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
2、动态注册广播接收器
private IntentFilter intentfilter;
private Button bt;
DynamicReceiver myreceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
intentfilter = new IntentFilter("99hz"); //创建一个intent过滤器实例
myreceiver = new DynamicReceiver(); //创建一个广播实例
registerReceiver(myreceiver, intentfilter); //根据过滤器及广播实例进行动态注册
bt = (Button)findViewById(R.id.bt);
bt.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent("99hz");
sendBroadcast(intent);
}
});
}
@Override
protected void onDestroy() { //注意在此方法内解除注册,否则退出时报错
// TODO Auto-generated method stub
super.onDestroy();
unregisterReceiver(myreceiver);
}
class DynamicReceiver extends BroadcastReceiver{ //所注册的广播实体
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
Log.d("hahaha", "dynamicReceiver......");
}
}
2、广播的生命周期
1、静态注册的广播为常驻型广播,也就是说如果应用程序关闭了,有相应事件触发,程序还是会被系统自动调用运行(静态注册的AndroidManifest.xml文件被写到了内存中)
可以通过以下方式来在相应的Activity中取消静态注册的广播,但是注意,除非手手动对其ENABLED,否则后续注册无效(类似于屏蔽指定名字的广播):
private ComponentName cn;
private PackageManager pm;
cn = new ComponentName(MainActivity.this,"com.example.broadcastrecivertest.MyBroadcastReciver");//第二个参数为要取消广播的name
pm = MainActivity.this.getPackageManager();
pm.setComponentEnabledSetting(cn, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
//此函数为可以对四大组件设置使能或者非使能。
//第一个参数为 组件的名称
//第二个参数为newstate,也就是设置为组件的状态
// 不可用状态:COMPONENT_ENABLED_STATE_DISABLED
// 可用状态:COMPONENT_ENABLED_STATE_ENABLED
// 默认状态:COMPONENT_ENABLED_STATE_DEFAULT
//第三个参数为flags,值可以是DONT_KILL_APP或者0。 0说明杀死包含该组件的app
2、动态注册的广播为非常驻型广播,跟随Activity的生命周期,所以在Activity结束之前需要调用unregisterReceiver方法移除它。
3、注意:
1、onReceiver中不要做超过10秒的耗时操作,不然可能弹出ANR(Acclication Not Response)错误。
2、onReceiver中不允许创建线程
4、发送有序广播
1、将sendBroadcast修改为sendOrderedBroadcast
2、既然是有序,所以通过优先级来指定广播接收器接收的顺序(在AndroidManifest.xml中修改,<intent-filter android:priority="100">)
3、有序广播可以在传播过程中被高优先级截断,在对应的onReceive方法中调用abortBroadcast();方法即可。
5、发送本地广播
1、本地广播(应用程序内发送,无法发送给其他应用程序)无法静态注册,因为静态注册主要是为了让程序在未启动的情况下也能收到广播,
而发送本地广播时,我们的程序肯定是已经启动了,因此也完全不需要使用静态注册的功能。
优势:
1、广播只会在程序内部发送,不用担心数据泄露
2、其他程序无法将程序发送到程序内部,不需要担心有安全漏洞的隐患
3、本地广播比全局广播更加高效
2、使用方法:
//发送
private LocalReceiver localReceiver;
private LocalBroadcastManager localBroadcastManager;
localBroadcastManager = LocalBroadcastManager.getInstance(this); //获取本地广播实例
(可以在onClick方法中):
Intent intent = new Intent("广播的名字");
localBroadcastManager.sendBroadcast(intent); //发送本地广播
//接收,注册本地广播接收器
intentFilter = new IntentFilter();
intentFilter.addAction("广播的名字");
localReceiver = new LocalReceiver();
localBroadcastManager.registerReceiver(localReceiver,intentFilter);
//定义本地广播接收器类
class LocalReceiver extends BroadcastReceiver{
public void onReceiver(Context context,Intent intent){
//do something
}
}
相关推荐
全国咨询热线:400-611-6270
?2004-2018华清远见教育科技集团 版权所有 京ICP备16055225号 京公海网安备11010802025203号