当前位置:   article > 正文

七、广播详解_根据广播接收者的优先级高低依次接收广播的消息

根据广播接收者的优先级高低依次接收广播的消息

1. 为什么需要广播接受者

生活中的广播:

电台:发送一定频道的广播消息,50mhz;

收音机:调整到一定频道,接收广播消息;

android应用程序里面的电台:系统内置的一个服务,会把事件(电量不足、电量充满、开机启动完成)作为一个广播消息发送其他的接收者;

android应用程序里面的收音机:自己写的一个广播接收者的一个类。

2. 广播接受者案例1-ip拨号器(重点)

  • 开发广播接收者的步骤:

    (1)买个收音机:

    public class OutCallBroadCastReceiver extends BroadcastReceiver {
        public void onReceive(Context context, Intent intent) {
    
        }
    
    • 1
    • 2
    • 3
    • 4

    }

    (2)插上电池:

    <receiver android:name="com.lile.ipcall.OutCallBroadCastReceiver" />
    
    • 1

    (3)调整到一个频道:

    <intent-filter >
       <action android:name="android.intent.action.NEW_OUTGOING_CALL" />
    </intent-filter>
    
    • 1
    • 2
    • 3

3. 广播接受者案例2-短信监听器(重点)

pdus : protocol data unit s 协议数据单元

特点

(1)即使广播接收者没有运行,当广播消息到达的时候,系统会自动启动广播接收者的进程,调用onReceive方法,接收消息。

(2)4.0版本之后为了安全考虑,要求应用程序必须要有界面,必须被用户运行过一次,广播接受者才会生效

(3)4.0版本的强行停止相当于冻结一个应用,一旦应用程序被用户强行停止了,广播接受者就不会生效了。直到用户手工打开这个应用程序为止。

(4)4.0版本之前没有这样的安全设计

步骤:

(1)买个收音机

(2)插上电池

(3)调整到一个频道

配置文件:

<uses-permission android:name="android.permission.RECEIVE_SMS"/>

    <receiver android:name="com.lile.smslistener.SMSBroadCastReceiver">
        <intent-filter >
            <action android:name="android.provider.Telephony.SMS_RECEIVED" />
        </intent-filter>
    </receiver>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

代码:

package com.itheima.smslistener;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.gsm.SmsMessage;

public class SMSBroadCastReceiver  extends BroadcastReceiver{

    @Override
    public void onReceive(Context context, Intent intent) {

        Object[] objs = (Object[]) intent.getExtras().get("pdus");
        for(Object obj : objs){
            SmsMessage sms = SmsMessage.createFromPdu((byte[]) obj);
            String content = sms.getMessageBody();

            String srcPhone = sms.getOriginatingAddress();

            System.out.println("content========"+content);
            System.out.println("srcPhone========"+srcPhone);
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

4. 广播接受者案例3_sd卡状态监听(重点)

测试的时使用2.3的模拟器,4.0之后版本没有卸载、挂载、移除SD卡的功能。

步骤:

(1)买个收音机

(2)插上电池

(3)调整到一个频道

配置文件:

<receiver android:name="com.lile.sdlistener.SDBroadCastReceiver">
    <intent-filter >
        <action android:name="android.intent.action.MEDIA_MOUNTED" />
        <action android:name="android.intent.action.MEDIA_UNMOUNTED" />
        <action android:name="android.intent.action.MEDIA_REMOVED" />
        <!-- 必须加上data这个属性 -->
        <data android:scheme="file"/>
    </intent-filter>
</receiver>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

代码:

package com.itheima.sdlistener;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

public class SDBroadCastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

        String action = intent.getAction();

        if("android.intent.action.MEDIA_MOUNTED".equals(action)){
            Toast.makeText(context, "已经插上了SD卡.................", 0).show();
        }
        if("android.intent.action.MEDIA_UNMOUNTED".equals(action)){
            Toast.makeText(context, "拔掉了SD卡.................", 0).show();
        }

        if("android.intent.action.MEDIA_REMOVED".equals(action)){
            Toast.makeText(context, " 移除了SD卡.................", 0).show();
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

5. 广播接受者案例_开机启动(重点)

步骤:

(1)买个收音机

(2)插上电池

(3)调整到一个频道

要做的事情:让软件开启后关闭不了,禁用返回键和最小化键(小房子键);

配置文件:

<receiver android:name="com.lile.lesuo.BootCompletedBroadCastReceiver">
    <intent-filter >
        <action android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
</receiver>
  • 1
  • 2
  • 3
  • 4
  • 5

代码:

package com.itheima.lesuo;

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

public class BootCompletedBroadCastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

        // 开启mainactivity
        Intent i = new Intent(context, MainActivity.class);
        // 告诉activity自己来维护任务栈,如果任务栈没有当前任务,就会重新创建一个任务放入任务栈
        i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

        context.startActivity(i);
        System.out.println("***********88888888888启动完成*********************************");
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

6. 广播接受者案例_卸载安装(重点)

配置文件:

<receiver android:name="com.lile.azxz.AZXZBroadCastReceiver">
    <intent-filter >
        <action android:name="android.intent.action.PACKAGE_INSTALL" />
        <action android:name="android.intent.action.PACKAGE_REMOVED" />
        <action android:name="android.intent.action.PACKAGE_ADDED" />
        <!--   必须添加这个属性 -->
        <data android:scheme="package"/>
    </intent-filter>
</receiver>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

代码:

package com.itheima.azxz;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

public class AZXZBroadCastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

        String action = intent.getAction();

        if("android.intent.action.PACKAGE_INSTALL".equals(action)){
            Toast.makeText(context, "安装了一个新软件...................", 0).show();
        }

        if("android.intent.action.PACKAGE_REMOVED".equals(action)){
            Toast.makeText(context, "卸载了一个软件...................", 0).show();
        }

        if("android.intent.action.PACKAGE_REPLACED".equals(action)){
            Toast.makeText(context, "重新安装了一个软件...................", 0).show();
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

7. 发送自定义广播

创建广播电台的步骤:

// 创建一个传递消息的意图对象
Intent intent = new Intent();

// 设置要广播的事件类型
intent.setAction("com.lile.broadcast.HMSSDT");

// 设置广播的消息数据
intent.putExtra("news", "阿乐广播,晚上12点半准时开播.........");

// 发送一个广播消息
sendBroadcast(intent);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

8. 有序广播和无序广播(重点)

  • 无序广播:

    广播接收者只要注册接收相应的事件类型,就能接收到的广播;

// 发送一个广播消息(无序广播)
sendBroadcast(intent);
  • 1
  • 2
  • 有序广播:

    当广播把消息发送出去后,消息会根据广播接收者的优先级从高到低一级一级地下发消息。
    可以拦截消息,也可以修改消息。

发送有序广播:

Intent intent = new Intent();

intent.setAction("com.lile.orderedbroadcast.ZYFFNTBT");
// 发送一个有序的广播
// intent 意图
// permission 指定接收者需要添加了权限
// resultReceiver 指定哪个广播接收者最后接到消息
// scheduler 消息处理器
// initialCode 给消息指定初始代码
// initialData 指定消息的数据
// initialExtras 指定额外的参数
sendOrderedBroadcast(intent, null, null, null, 1, "国务院开始发放2017年农田补贴:900元", null);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

广播接收者的配置文件:

<receiver android:name="com.lile.zf.ProvinceBroadCastReceiver">
    <intent-filter android:priority="1000" >
        <action  android:name="com.lile.orderedbroadcast.ZYFFNTBT"/>
    </intent-filter>
</receiver>
  • 1
  • 2
  • 3
  • 4
  • 5

广播接收者的代码:

String info = getResultData();
System.out.println("我是省级人民政府,已经接收到了中央发的消息:"+info);

// Toast.makeText(context, "我是省级人民政府,已经接收到了中央发的消息:"+info, 0).show();
setResultData("国务院开始发放2014年农田补贴:400元");
  • 1
  • 2
  • 3
  • 4
  • 5

9. 补间动画

/**
 * 透明度变化的动画
 * @param view
 */
public void alpha(View view) {
    AlphaAnimation aa = new AlphaAnimation(0, 1.0f);
    // 动画播放的时间
    aa.setDuration(2000);
    // 重复次数
    aa.setRepeatCount(2);
    //设置重复的模式
    aa.setRepeatMode(Animation.REVERSE);
    iv.startAnimation(aa);
}

/**
 * 旋转变化的动画
 * @param view
 */
public void rotate(View view) {
    RotateAnimation ra = new RotateAnimation(0, 360, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
    // 动画播放的时间
    ra.setDuration(2000);
    // 重复次数
    ra.setRepeatCount(2);
    ra.setRepeatMode(Animation.REVERSE);
    iv.startAnimation(ra);
}

/**
 * 位移变化的动画
 * @param view
 */
public void trans(View view) {
    TranslateAnimation ta = new TranslateAnimation(Animation.RELATIVE_TO_PARENT, -0.5f, Animation.RELATIVE_TO_PARENT, 0.5f, Animation.RELATIVE_TO_PARENT, -0.5f, Animation.RELATIVE_TO_PARENT, 0.5f);
    ta.setDuration(2000);
    // 重复次数
    ta.setRepeatCount(2);
    ta.setRepeatMode(Animation.REVERSE);
    iv.startAnimation(ta);
}

/**
 * 缩放变化的动画
 * @param view
 */
public void scale(View view) {
    ScaleAnimation sa = new ScaleAnimation(0.1f, 2.0f, 0.1f, 2.0f, Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF, 0f);
    sa.setDuration(2000);
    // 重复次数
    sa.setRepeatCount(2);
    sa.setRepeatMode(Animation.REVERSE);
    sa.setFillAfter(true); // 设置填充after的效果
    iv.startAnimation(sa);
}

/**
 * 动画集合
 * @param view
 */
public void set(View view){
    // 动画插入器
    AnimationSet set = new AnimationSet(false);
    RotateAnimation ra = new RotateAnimation(0, 360, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
    // 动画播放的时间
    ra.setDuration(2000);
    // 重复次数
    ra.setRepeatCount(2);
    ra.setRepeatMode(Animation.REVERSE);
    TranslateAnimation ta = new TranslateAnimation(Animation.RELATIVE_TO_PARENT, -0.3f, Animation.RELATIVE_TO_PARENT, 0.3f, Animation.RELATIVE_TO_PARENT, -0.3f, Animation.RELATIVE_TO_PARENT, 0.3f);
    ta.setDuration(2000);
    // 重复次数
    ta.setRepeatCount(2);
    ta.setRepeatMode(Animation.REVERSE);
    ScaleAnimation sa = new ScaleAnimation(0.1f, 2.0f, 0.1f, 2.0f, Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF, 0f);
    sa.setDuration(2000);
    // 重复次数
    sa.setRepeatCount(2);
    sa.setRepeatMode(Animation.REVERSE);
    set.addAnimation(ra);
    set.addAnimation(sa);
    set.addAnimation(ta);
    iv.startAnimation(set);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/煮酒与君饮/article/detail/902104
推荐阅读
相关标签
  

闽ICP备14008679号