四大组件之BroadCastReceiver(无序广播和有序广播)

实际开发中,有时会用到广播。广播分两种:无序广播和有序广播。注册的时候也同样分为静态注册和动态注册,具体什么情况下该选择哪种方式,我只能说:根据需求。
下面是代码,不赘述,注释说明也比较详细,我相信你们能看懂的。

MainActivity:

package com.example.lenovo.demo;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    }

    public void unorder(View view){
        Intent intent = new Intent("abc");
        intent.putExtra("content", "自定义的广播内容");//自定义广播内容
        sendBroadcast(intent);//发送无序广播
    }

    public void order(View view){
        Intent intent = new Intent("abc");
        intent.putExtra("content", "自定义的广播内容");//自定义广播内容
        sendOrderedBroadcast(intent,null);//发送有序广播
    }
}

1号广播接收者代码:

package com.example.lenovo.demo;

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

/** * Created by shan on 2016/7/22. * */
public class MyBroadCast extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d("MyBroadCast", intent.getStringExtra("content"));
        //这里的显示可能是Toast,也有可能是Notification,不能是Dialog,这里以通知为例
        NotificationManager mManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
        Notification.Builder notify = new Notification.Builder(context);
        //当打开通知时,进入一个Activity
        notify.setContentIntent(PendingIntent.getActivity(context, 0, new Intent(context, OtherActivity.class), 0));
        notify.setTicker("有新的通知,请查收");//闪现顶部状态栏的文本
        notify.setSmallIcon(R.mipmap.ic_launcher);//通知图标
        notify.setContentTitle("通知的标题");//通知标题
        notify.setContentText(intent.getStringExtra("content"));//通知显示广播发送的内容
        notify.setAutoCancel(true);//当打开通知后,通知自动消失
        notify.setDefaults(Notification.DEFAULT_VIBRATE);//设置默认的振动
        mManager.notify(0, notify.build());

        abortBroadcast();//拦截广播,优先级低的广播接受者就收不到了(前提是发送的有序广播,不能用于无序广播)
    }
}

2号广播接收者代码:

package com.example.lenovo.demo;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

/** * Created by shan on 2016/7/22. * */
public class MyBroadCast2 extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d("MyBroadCast2", intent.getStringExtra("content"));
    }
}

最后是清单文件广播的静态注册:

<?xml version="1.0" encoding="utf-8"?>
<manifest package="com.example.lenovo.demo" xmlns:android="http://schemas.android.com/apk/res/android">
    <uses-permission android:name="android.permission.VIBRATE"></uses-permission>
    <application  android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
        <activity android:name=".OtherActivity"></activity>
        <receiver android:name=".MyBroadCast">
            <intent-filter  android:priority="110">
                <action android:name="abc"/>
            </intent-filter>
        </receiver>
        <receiver android:name=".MyBroadCast2">
            <intent-filter  android:priority="100">
                <action android:name="abc"/>
            </intent-filter>
        </receiver>
    </application>

</manifest>

说明:发送有序广播的时候,是按广播接收者的优先级来接收的,即通过配置intent-filter节点的android:priority=”“这个属性值来区分优先级高低,取值范围为-1000~1000.值越大,优先级越高,也就越能先收到广播的内容。先收到内容的广播接收者就有权决定是否调用abortBroadcast()这个方法来让优先级低的广播接收者也收到广播内容。如果调用,优先级低的广播接收者就不会收到广播内容了,反之,就能收到。

OK!具体的log日志输出结果就不展示了!亲测效果都可以实现

PS:在安卓4.1以后的版本,通知的使用有一定的变化,使用的核心代码如下:

NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this)
                .setSmallIcon(R.mipmap.ic_launcher)
                .setContentTitle("通知")//通知标题
                .setContentText("即日起,工资上调20%")//通知显示广播发送的内容
                .setDefaults(Notification.DEFAULT_VIBRATE)//设置振动
                .setAutoCancel(true);//设置点击通知后,通知图标消失
        TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
        stackBuilder.addParentStack(OtherActivity.class);
        stackBuilder.addNextIntent(new Intent(this, OtherActivity.class));
        mBuilder.setContentIntent(stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT));
        mNotificationManager.notify(1, mBuilder.build());

你可能感兴趣的:(四大组件之BroadCastReceiver(无序广播和有序广播))