Android移动应用开发--广播接收者的介绍、分类和相关案例

广播接收者

Android中的广播接收者就好像我们生活中的收音机一样,Android系统内部已经定义好了发送广播的电台和一些广播事件(外拨电话、短信到来、sd卡的状态等),而Android中我们使用的是 broadcastReceiver去接收系统预定义好的事件。

定义广播接收者的步骤

  1. 自定义类继承broadcastReceiver类
  2. 在清单文件中配置receiver
  3. 并增加相应的权限

ip拨号器的案例

通过将用户输入的区号用SharedPreferences保存,然后如果用户拨打的号码如果以“0”开头,就加上用户输入的区号

activity_main.xml文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/et_num"
    android:hint="请输入IP号码"
    />
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="click"
        android:text="保存"/>

</LinearLayout>

MainActivity类

package com.dsl.ipCall;

import androidx.appcompat.app.AppCompatActivity;

import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    EditText num;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        num = findViewById(R.id.et_num);
    }
    public void  click(View v){
        String numIP = num.getText().toString().trim();
        if (numIP.equals("")){
            SharedPreferences sp = getSharedPreferences("config", 0);
            sp.edit().putString("num",numIP).commit();
            Toast.makeText(getApplicationContext(),"你使用了默认区号",Toast.LENGTH_SHORT).show();
        }else{
            SharedPreferences sp = getSharedPreferences("config", 0);
            sp.edit().putString("num",numIP).commit();
            Toast.makeText(getApplicationContext(),"保存区号成功",Toast.LENGTH_SHORT).show();
        }




    }
}

广播接收者类

package com.dsl.ipCall;

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

public class MyReceiver extends BroadcastReceiver {

    //当接收广播的时候调用
    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO: This method is called when the BroadcastReceiver is receiving
        // an Intent broadcast.
        //把用户输入的IP号码获取出来
        SharedPreferences sp = context.getSharedPreferences("config", 0);
        String num = sp.getString("num", "");
        String currentNum = getResultData();
       // System.out.println("currentNum:"+currentNum);
        if (currentNum.startsWith("0")){
            //修改拨打电话的号码
            setResultData(num+currentNum);
        }




    }
}

清单文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.dsl.ipCall">
   <!-- 增加外拨电话的权限-->
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <!--        注册广播接收者-->
        <receiver
            android:name="com.dsl.ipCall.MyReceiver"
         >
            <intent-filter>
              <!--        具体定义哪种广播-->
                <action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
            </intent-filter>
        </receiver>

        <activity android:name="com.dsl.ipCall.MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

短信监听机制

通过广播接收者获取短信的内容和发送的地址

SmSReceiver类

package com.dsl.sms;

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

public class SmSReceiver extends BroadcastReceiver {

    //当接收短信的时候执行
    @Override
    public void onReceive(Context context, Intent intent) {
       // System.out.println("hahahahaha");
        //获取发送者的号码和发送内容
        Object [] objects = (Object[]) intent.getExtras().get("pdus");
        for (Object object :objects){
            //获取SmsMessage的实例
            SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) object);
            //获取发送短信的内容和地址
            String content = smsMessage.getDisplayMessageBody();
            String address = smsMessage.getOriginatingAddress();
            System.out.println("内容为:"+content+"--------"+"号码为:"+address);

        }
    }
}

清单文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.dsl.sms">
	增加短信接收的权限
    <uses-permission android:name="android.permission.RECEIVE_SMS" />
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <receiver android:name=".SmSReceiver">
            <intent-filter>
            定义接收短信的行为
                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
            </intent-filter>
        </receiver>

        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

有序广播和无序广播

不同点:

  1. 有序广播可以被终止
  2. 有序广播的数据可以被修改
  3. 而无序广播不行

无序广播

无序广播是完全异步执行,发送广播时所有监听这个广播的广播接收者都会接收到此消息,但接收的顺序不确定

自定义无序广播

自定义发送广播

通过按钮的点击发送广播

package com.dsl.customersendbroadcast;

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

import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    public void click (View v){
        Intent intent = new Intent();
        intent.setAction("com.dsl.customer");
        intent.putExtra("name","新闻联播开播了");
        sendBroadcast(intent);
    }
}

定义广播接收者
package com.dsl.receiverbroadcast;

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

public class MyReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        String name = intent.getStringExtra("name");
        Toast.makeText(context.getApplicationContext(),name,Toast.LENGTH_SHORT).show();
    }
}

/**
注意要在清单文件中定义的action要和广播设置的action保持一致
*/

有序广播

按照接收者的优先级接收,只有一个广播接收者能接收消息,在此广播接收者中逻辑执行完毕后,才会继续传递。

自定义有序广播

package com.dsl.broadcast;

import androidx.appcompat.app.AppCompatActivity;

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

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    //点击发送有序广播
    public void click(View v){
        Intent intent = new Intent();
        intent.setAction("com.dsl.broadcast");
/**
 * 第一个参数:意图对象
 * 第二个参数:接收的权限
 * 第三个参数:最终的接收者
 * 第四个参数:handler类型
 * 第五个参数:初始码
 * 第六个参数:初始化数据
 * 第七个参数:额外的初始化
 */
        sendOrderedBroadcast(intent,null,new FinalBroadcast(),null,1,"我给你送了1000个快递",null);
    }
}


定义最终的接收者用于监听广播

package com.dsl.broadcast;

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

public class FinalBroadcast extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        String content = getResultData();

        Toast.makeText(context.getApplicationContext(), "最终的接收者:" + content, Toast.LENGTH_SHORT).show();
    }
}

定义多个接收者
package com.dsl.receiverorderbroadcast;

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

public class FirstReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        //获取广播携带的数据
        String content = getResultData();


        Toast.makeText(context.getApplicationContext(), "第一个接收者:" + content, Toast.LENGTH_SHORT).show();


        //修改数据
        setResultData("我接收到800个快递");
    }
}

package com.dsl.receiverorderbroadcast;

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

public class SecondReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        //获取广播携带的数据
        String content = getResultData();

        Toast.makeText(context.getApplicationContext(), "第二个接收者:" + content, Toast.LENGTH_SHORT).show();
        //终止广播
       abortBroadcast();
         setResultData("我接收到600个快递");
    }
}

```java
package com.dsl.receiverorderbroadcast;

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

public class ThirdReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        //获取广播携带的数据
        String content = getResultData();

        Toast.makeText(context.getApplicationContext(), "第三个接收者:" + content, Toast.LENGTH_SHORT).show();
        setResultData("我接收到400个快递");
    }
}

```java
package com.dsl.receiverorderbroadcast;

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

public class ForthReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        //获取广播携带的数据
        String content = getResultData();

        Toast.makeText(context.getApplicationContext(), "第四个接收者:" + content, Toast.LENGTH_SHORT).show();

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

何一平?

你的收获就是我学习的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值