Android_07_自定义广播
2015-10-21 14:16
281 查看
前言:
sendBroadcast()可用来发送广播,关于广播的接收,第一种方法是通过registerReceiverr()动态进行注册广播,
第二种方法就是静态地在清单文件中去声明一个广播
Note:
如果你通过registerReceiverr()在Activity.onResume()方法体中注册广播,那么相应地你应该在Activity.onPause()方法中
将这个注册的广播记得销毁掉;
需要知道的是:尽管intent被用来发送和接收广播,但是intent的广播机制和被用来启动一个activity的intent,两者是完全独立的;
安全:
1>
intent是全局的命名空间,确保intent的action和其他字符串都是以你自己的命名空间来命名的,否则的话,可能会造成与其他应用的冲突;
2>
当你使用registerReceiver(BroadcastReceiver, IntentFilter)的时候,任何一个应用都可能会发送广播给这个注册的广播接收者,你可以
通过在下边描述的一些权限来控制谁可以发送广播给这个广播接收者;
3>
当你通过清单文件去声明一个广播接收者且通过intent-filters去指定一个特定类型的广播时,任何一个应用都可以发送广播给这个广播接收者,
无论这个被指定的intent-filters多么的特殊化;为了阻止外部的应用可以发送广播给这个广播接收者,你可以通过android:exported=false来阻止
外部应用的广播对被应用广播接收者的干扰;
4>
当你使用sendBroadcast或相关的方法时,通常任何其他应用程序可以接收这些广播,你可以通过以下权限的描述来实现谁可以接收到这些广播;
当然,你也可以通过Intent.setPackage来严格地限制其只能与某个单独的应用进行广播的发送;
当使用LocalBraodcastManaget的时候,上述所这些问题都将不会存在;因为intent广播不会跑出当前进程之外去;
(关于LocalBraodcastManaget的使用,可参考LocalBroadcastManager的使用总结)
访问权限可以由广播的接收者或广播的发送者来执行;为了在发送时去执行一个权限,你需要提供一个非空的参数给sendBroadcast(Intent, String)
或者 sendOrderedBroadcast(Intent, String, BroadcastReceiver, android.os.Handler, int, String, Bundle). 为了在接收时执行一个权限,要么可以
通过调用 registerReceiver(BroadcastReceiver, IntentFilter, String, android.os.Handler)或者在你自己的AndroidManifest.xml的 <receiver>里边去
提供一个非空的权限;
代码示例如下:
自定义的广播发送端:
广播接收端一:(通过registerReceiver()来实现,这时就无需再在清单文件中进行配置了)
广播接收端二:(通过在清单文件中进行注册<receiver>并配置action来决定其侦听哪类广播)
在接收端二中,主要看以下两部分:
AndroidManifest.xml
运行结果如下:
![](https://img-blog.csdn.net/20160623110403340)
![](https://img-blog.csdn.net/20160623110425041)
![](https://img-blog.csdn.net/20160623110441544)
总结:
广播的发送时通过sendBroadcast()来进行发送,广播的接收有两种方式:
一种是registerReceiver()来动态进行注册,一种是通过在清单文件中进行配置,决定其来侦听什么广播
源码:
1>
自定义广播发送端源码
2>
广播接收端一源码
3>
广播接收端二源码
sendBroadcast()可用来发送广播,关于广播的接收,第一种方法是通过registerReceiverr()动态进行注册广播,
第二种方法就是静态地在清单文件中去声明一个广播
Note:
如果你通过registerReceiverr()在Activity.onResume()方法体中注册广播,那么相应地你应该在Activity.onPause()方法中
将这个注册的广播记得销毁掉;
需要知道的是:尽管intent被用来发送和接收广播,但是intent的广播机制和被用来启动一个activity的intent,两者是完全独立的;
安全:
1>
intent是全局的命名空间,确保intent的action和其他字符串都是以你自己的命名空间来命名的,否则的话,可能会造成与其他应用的冲突;
2>
当你使用registerReceiver(BroadcastReceiver, IntentFilter)的时候,任何一个应用都可能会发送广播给这个注册的广播接收者,你可以
通过在下边描述的一些权限来控制谁可以发送广播给这个广播接收者;
3>
当你通过清单文件去声明一个广播接收者且通过intent-filters去指定一个特定类型的广播时,任何一个应用都可以发送广播给这个广播接收者,
无论这个被指定的intent-filters多么的特殊化;为了阻止外部的应用可以发送广播给这个广播接收者,你可以通过android:exported=false来阻止
外部应用的广播对被应用广播接收者的干扰;
4>
当你使用sendBroadcast或相关的方法时,通常任何其他应用程序可以接收这些广播,你可以通过以下权限的描述来实现谁可以接收到这些广播;
当然,你也可以通过Intent.setPackage来严格地限制其只能与某个单独的应用进行广播的发送;
当使用LocalBraodcastManaget的时候,上述所这些问题都将不会存在;因为intent广播不会跑出当前进程之外去;
(关于LocalBraodcastManaget的使用,可参考LocalBroadcastManager的使用总结)
访问权限可以由广播的接收者或广播的发送者来执行;为了在发送时去执行一个权限,你需要提供一个非空的参数给sendBroadcast(Intent, String)
或者 sendOrderedBroadcast(Intent, String, BroadcastReceiver, android.os.Handler, int, String, Bundle). 为了在接收时执行一个权限,要么可以
通过调用 registerReceiver(BroadcastReceiver, IntentFilter, String, android.os.Handler)或者在你自己的AndroidManifest.xml的 <receiver>里边去
提供一个非空的权限;
代码示例如下:
自定义的广播发送端:
package com.example.administrator.testsendbroadcast; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.Log; public class SendBroadcastActivity extends AppCompatActivity { private final static String TAG = "testBroadcast"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_send_broadcast); Intent intent = new Intent(); intent.setAction(TAG); Log.e("SendBroadcastActivity","sendBroadcast"); sendBroadcast(intent); } }
广播接收端一:(通过registerReceiver()来实现,这时就无需再在清单文件中进行配置了)
package com.example.administrator.receiverbyregister; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; public class ReceiverByRegisterActivity extends AppCompatActivity { private final static String TAG = "testBroadcast"; private BroadcastReceiverByRegister broadcastReceiverByRegister; private IntentFilter intentFilter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_receiver_by_register); /** * 注册并侦听广播 * **/ intentFilter = new IntentFilter(); intentFilter.addAction(TAG); broadcastReceiverByRegister = new BroadcastReceiverByRegister(); registerReceiver(broadcastReceiverByRegister,intentFilter); } private class BroadcastReceiverByRegister extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { Log.e("ReceiverByRegister","onReceive"); } } /** * 注销广播 * **/ @Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(broadcastReceiverByRegister); } }
广播接收端二:(通过在清单文件中进行注册<receiver>并配置action来决定其侦听哪类广播)
package com.example.administrator.receiverbyreceiver; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; /*** * 在本个示例中,这个Activity什么都没做 * **/ public class ReceiverByReceiverActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_receiver_by_receiver); } }
在接收端二中,主要看以下两部分:
package com.example.administrator.receiverbyreceiver; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.util.Log; public class ReceiverByReceiver extends BroadcastReceiver { public ReceiverByReceiver() { } @Override public void onReceive(Context context, Intent intent) { Log.e("ReceiverByReceiver","onReceive"); } }
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.administrator.receiverbyreceiver"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".ReceiverByReceiverActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <receiver android:name=".ReceiverByReceiver" android:enabled="true" android:exported="true"> <intent-filter> <action android:name="testBroadcast"></action> </intent-filter> </receiver> </application> </manifest>
运行结果如下:
总结:
广播的发送时通过sendBroadcast()来进行发送,广播的接收有两种方式:
一种是registerReceiver()来动态进行注册,一种是通过在清单文件中进行配置,决定其来侦听什么广播
源码:
1>
自定义广播发送端源码
2>
广播接收端一源码
3>
广播接收端二源码
相关文章推荐
- Android数据库高手秘籍(一)——SQLite命令
- Android复习随笔之SharedPreferences
- Android_07_监控应用的状态
- android内存优化
- android service 详解
- Android_07_开机自启动
- Service和IntentService的区别
- 安卓在AndroidManifest.xml文件中设置Android程序的启动界面方法
- android下载apk 断点续传
- Android 秒杀倒计时 解决listview上下滑动计时改变问题
- android自定义控件之禁止ListView滚动
- 视频框架 Vitamio 使用教程+部分心得 (二)第一个视频demo
- 如何在onCreate中测量View的实际宽高
- android正则表达式工具类
- android学习路线:如何成长为高级工程师
- Android_07_监控SD卡的状态
- android开发-dialog使用
- 【Android】 TextView设置个别字体样式
- androidStudio引入PullToRefresh
- android 日期选择器