安卓中广播和通知的简单使用

本博文为个人笔记所用,如果有新的想法,我还会随时更新。同时欢迎大家斧正。

@http://blog.csdn.net/tt_man



广播有三个要素
1、广播,由系统自动生成并发送
2、Intent意图(频道),用于保存广播相关的媒介
3、广播接收器(BoradcastReceiver),用于接收广播。
广播的作用:
接收系统广播,解析意图对象做相应处理:短信、开机、拨打电话、电量变化、网络变化等
相关操作后,可以发送自定义意图的广播。
广播的生命周期
广播仅在它执行这个方法时处于活跃状态。在onReceive返回后,它即处于失活状态。
拥有一个活跃状态的广播接收器的进程被保护起来而不被杀死,但仅拥有失活状态组建的进程则会在其他进程需要他所占有的内存的时候被杀死。
注册BroadcastReceiver的方法
静态和动态注册


应用:
短信拦截,电话拦截


创建广播接收器的步骤:
1、自定义类继承BroadcastReceiver类
2、覆写onReceive方法,接收方便并做相应的操作
3、注册广播:静态注册、动态注册
静态注册:
AndroidManifest.xml文件中使用receiver标签注册
需要制定nama属性,需要使用的是哪一个广播接收器

需要制定action,制定需要接收的哪一类广播

动态注册方式是在activity里面调用当前上下文对象的registerReceiver() 方法来注册,和静态的内容差不多。一个形参是receiver对象,另一个是IntentFilter对象。而IntentFilter构造方法的参数是要接收的action。
动态注册方式特点:在代码中进行注册后,当应用程序关闭后,就不再进行监听。
动态注册广播接收器的特点,就是当用来注册的 Activity 关掉后,广播也就失效了。同时反映了静态注册的一个优势,就是无需担忧广播接收器是否被关闭,只要设备是开启状态,广播接收器就是打开着的。

动态注册的示例代码

screenReceiver = new ScreenReceiver();
filter = new IntentFilter();
//监听锁屏
filter.addAction(Intent.ACTION_SCREEN_OFF);
//解锁屏幕
filter.addAction(Intent.ACTION_SCREEN_ON);
//注册广播,一般放在onStart方法中
registerReceiver(screenReceiver, filter);


静态注册的好处是:程序在安装的时候,系统会遍历Manifest文件,把广播使用的组件添加到框架层。所以即便程序没有打开,也会接收到所注册的广播信息(3.2版本之后,App必须运行过一次才行)

自己发送广播:
1、自定义antion
2、调用sendBroadcast(Intent)
发送有序广播:sendOrderedBroadcast(Intent,···)
设置intent-filter的priority属性,设置有序广播接收器的接收顺序。

对于有序广播,即便被拦截,如果设置有ResultReceiver,仍然会最后收到广播



发送一条广播很简单,示例如下:


Intent intent = new Intent();

intent.setAction("MyBroad_wnn");

intent.putExtra("pdus", "各部门注意了: 明天加班");

sendBroadcast(intent);


好了第一个广播发出去了,这是一个无序广播,他告诉我们,广播的频道是:MyBroad_wnn,广播带有一条信息:“各部门注意了:明天加班”,如果要取出这个信息的话,你还得知道key:pdus哦。


下面再来一条有序广播,哦,这个稍微麻烦些,信息量略大啊:

Intent intent = new Intent();

intent.setAction("MyOrderedBroadcast_wnn");

intent.putExtra("data", "客户已打款100W,需要在3个月之内完成");

/**
* 第一个参数:发送广播的意图对象
* 第二个参数:发送广播的权限
* 第三个参数:最终广播接收器,不管广播是否终止,都会接收到此广播消息
 * 后面四个参数是你可以添加的一些数据(接收方可以取出来),你可是设为null或者0
*/
sendOrderedBroadcast(intent, "permission.wnn", new BroadcastReceiver() {

@Override
public void onReceive(Context context, Intent intent) {
android.util.Log.e("danny", "最后的小兵接收到消息");
}
}, null, 0, "信息务必准确", null);


这就发送了一条有序广播,同无序广播一样,我们都指定了Intent,在intent中指定了频道(注意没有频道的广播,就像没有联网的直播,瞎表演),我们指定了接收权限permission.wnn,我们制订了最终接收器,这里采用匿名内部了的写法,然后,就可以发送了。



有了广播发送端,我们还得有接收端啊,下面是一个简单的接收器

public class EngineerReceiver extends BroadcastReceiver{


@Override
public void onReceive(Context context, Intent intent) {
String content = intent.getStringExtra("data");
android.util.Log.e("danny", "工程师接收到总部发送内容:" + content);
//通过getResultData可以获取此有序广播中的DATA数据
String data = getResultData();
android.util.Log.e("danny", "工程师收到经理发送的通知内容 " + data);
}
}

可以看到我们写了一个类,继承自BroadcastReceiver类,我们复写onReceive方法,从而在此对收到的广播进行解析(取出广播里的内容,当然你还可以自己给用户一些你想展示的内容),然后就是在manifest里面注册了

 <receiver android:name=".EngineerReceiver">
            <intent-filter android:priority="1">
                <action android:name="MyOrderedBroadcast_wnn"/>
            </intent-filter>
        </receiver>

使用receiver标签,注明关联的类,注明action,表示接收的频道,你甚至在filter中注明了优先级,这个数字用于有序广播,数字大的等级高哦


下面聊聊通知的使用,废话少说,直接上代码

其中关键步骤:

<span style="font-size:18px;">NotificationCompat.Builder builder = new NotificationCompat.Builder(this);</span>
<span style="font-size:18px;">builder.setSmallIcon(R.drawable.a0x);</span>
<span style="font-size:18px;">builder.setContentTitle("歌曲");
builder.setContentText("我的滑板鞋");</span>
<pre name="code" class="java"><span style="font-size:18px;">(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE)<span style="font-family: Arial, Helvetica, sans-serif;">.notify(1, builder.builde());</span></span>
<span style="font-family:Arial, Helvetica, sans-serif;font-size:18px;">吼吼吼,是不是很简单,这就可以了,当然你可以继续让它华丽起来。
</span><span style="font-size:18px;"></span><pre name="code" class="java"><span style="white-space:pre"><span style="font-size:18px;">				</span></span>

 
<pre name="code" class="java"><span style="font-size:18px;">
</span>

 
 
 

<span style="font-size:18px;">NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
		//设置当点击通知之后,自动删除
		builder.setAutoCancel(true);
		//设置通知的小图标
		builder.setSmallIcon(R.drawable.a0x);
		//设置通知的大图标
		builder.setLargeIcon(BitmapFactory.decodeResource(
				getResources(), R.drawable.ic_launcher));
		//设置通知的标题
		builder.setContentTitle("歌曲");
		//设置通知的正文
		builder.setContentText("我的滑板鞋");
		//设置通知的闪烁文本信息
		builder.setTicker("别人笑我太疯癫,我笑他人看不穿");
		
		/*
		 * 通过设置PendingIntent可以设置点击通知时,所触发的组件
		 * 通过PendingIntent.getActivity说明启动的是Activity组件
		 * 通过PendingIntent.getService说明启动的是Service组件
		 * 以上两个方法都必须传入意图Intent对象
		 */
		Intent intent = new Intent(this, BAcitvity.class);
		PendingIntent pendingIntent = PendingIntent.getActivity(
				this, 1, intent, PendingIntent.FLAG_ONE_SHOT);
		builder.setContentIntent(pendingIntent);
		
		//通过构建类获取Notification对象
		Notification notification = builder.build();
		
		//获取通知管理器
		NotificationManager manager = (NotificationManager) getSystemService(
				Context.NOTIFICATION_SERVICE);
		//调用通知管理器的notify方法,发送通知
		manager.notify(1, notification);</span>

最后发送的1是个标志Id,如果有其他通知也采用1,则新通知到来的时候会抹除旧的通知(才不会告诉你,这样做了个下载进度条,显示在通知里哦,谷歌大大很贴心,这个甚至不用你去搞什么配置文件哦,直接set到底)。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值