当前位置: 星创客 > 学习资源 > 讲师博文 > Android四大组件之Broadcast
Android四大组件之Broadcast 时间:2017-12-05     来源:星创客

这里我们讲解一下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

}

}

前台专线:010-82525158 企业培训洽谈专线:010-82525379 院校合作洽谈专线:010-82525379 Copyright © 2004-2018 北京华清远见科技发展有限公司 版权所有 ,京ICP备16055225号,京公海网安备11010802025203号
返回

讲师博文

星创客 - 华清远见旗下高端IT培训品牌

当前位置: 星创客 > 学习资源 > 讲师博文 >

Android四大组件之Broadcast
来源: 星创客 作者: 星创客 时间:2017-12-05

这里我们讲解一下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号