关于广播接受者的问题

01_为什么需要广播接受者

广播:
电台:发送一定频道的广播消息,50mhz,;
收音机:调整到一定频道,接收广播消息;


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

02_广播接受者案例_ip拨号器
开发广播接收者的步骤:

1、买个收音机:

    public class OutCallBroadCastReceiver extends BroadcastReceiver {
        public void onReceive(Context context, Intent intent) {
    }

2、插上电池:

    <receiver android:name="com.itheima.ipcall.OutCallBroadCastReceiver" />

3、调整到一个频道:

    <intent-filter >
       <action android:name="android.intent.action.NEW_OUTGOING_CALL" />
    </intent-filter>

03_广播接受者案例_短信监听器
pdus : protocol data unit s 协议数据单元

特点:
即使广播接收者没有运行,当广播消息到达的时候,系统会自动启动广播接收者的进程,调用onReceive方法,接收消息。
4.0版本之后为了安全考虑,要求应用程序必须要有界面,必须被用户运行过一次,广播接受者才会生效
4.0版本的强行停止相当于冻结一个应用,一旦应用程序被用户强行停止了,广播接受者就不会生效了。直到用户手工打开这个应用程序为止。
4.0版本之前没有这样的安全设计

步骤:

 1、买个收音机
 2、插上电池       
 3、调整到一个频道  

配置文件:

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

 <receiver android:name="com.itheima.smslistener.SMSBroadCastReceiver">
        <intent-filter >
            <action android:name="android.provider.Telephony.SMS_RECEIVED" />
        </intent-filter>
    </receiver> 

代码:

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);

    }
}

}

04_广播接受者案例_sd卡状态监听

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

步骤:

 1、买个收音机
 2、插上电池
 3、调整到一个频道  

配置文件:

     <receiver android:name="com.itheima.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>

代码:

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();
    }



}

}

05_广播接受者案例_开机启动
步骤:

 1、买个收音机
 2、插上电池
 3、调整到一个频道  

要做的事情:让软件开启后关闭不了:

禁用返回键和最小化键(小房子键);
  • 示例代码

    配置文件:

        <intent-filter >
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
    </receiver>
    

    代码:

    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启动完成*********************************");
    }
    

    }

06_广播接受者案例_卸载安装
示例代码:

配置文件:


    <receiver android:name="com.itheima.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>

代码:

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();
    }

}
}

07_发送自定义广播
创建广播电台的步骤:

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

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

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

    //发送一个广播消息
    sendBroadcast(intent);

08_有序广播和无序广播
* 无序广播:

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

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

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

    发送有序广播:

    Intent intent = new Intent();

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

    广播接收者的配置文件:





    广播接收者的代码:

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

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

补间动画

/**
 * 透明度变化的动画
 * @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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您提供一个简单的示例代码来创建一个使用静态注册广播接收器的 Android 应用程序: 1. 在 AndroidManifest.xml 文件中添加以下代码,以声明广播接收器: ``` <receiver android:name=".MyBroadcastReceiver" android:exported="true"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> <action android:name="android.intent.action.ACTION_POWER_CONNECTED" /> <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" /> </intent-filter> </receiver> ``` 2. 创建一个名为 MyBroadcastReceiver 的类,并继承 BroadcastReceiver,如下所示: ``` public class MyBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (action != null) { if (action.equals(Intent.ACTION_BOOT_COMPLETED)) { // 处理开机启动广播 } else if (action.equals(Intent.ACTION_POWER_CONNECTED)) { // 处理电源连接广播 } else if (action.equals(Intent.ACTION_POWER_DISCONNECTED)) { // 处理电源断开广播 } } } } ``` 3. 在 MyBroadcastReceiver 类中实现您所需的广播接收处理逻辑。 4. 运行应用程序并测试广播接收器是否按预期工作。 注意:静态注册广播接收器必须应用程序的 AndroidManifest.xml 文件中声明,并且必须包含至少一个 intent-filter,以指定要处理的广播类型。此外,由于 Android 8.0(API 级别 26)引入了后台执行限制,因此在 Android 8.0 及更高版本中,一些广播接收器需要在运行时进行动态注册才能正常工作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值