Broadcast的简单应用

Broadcast应用之短信提示

(一)、相关知识

广播(Broadcast)是一种广泛运用在应用程序之间传输信息的机制。即将消息或信息以广播的形式发送给应用程序,由相对应的广播接收器去处理这小消息。

广播分类

普通广播: 通过sendBroadcast()方法发送,所有的广播接收者同时能接收到发送的广播。
有序广播: 使用sendOrderedBroadcast()方法发送。所有的receiver依次执行。即从优先级别最高的广播接收器开始接收,接收完了如果没有丢弃,就下传给下一个次高优先级别的广播接收器进行处理,依次类推,直到最后。有序广播是可以被截获。
粘性消息: 通过sendStickyBroadcast()方法发送。在发送后就一直存在于系统的消息容器里面,等待对应的receiver去处理,如果暂时没有receiver处理,则一直在消息容器里面处于等待状态。

(二)、项目实践

当到来一条短信时,短信播放音乐,当点击“暂停播放”时,停止播放音乐。

短信的到来的广播属于系统广播,故广播由系统发送,不需写广播发送方,只需写相应的广播接收器。

过程如下

(1)准备工作
在res文件夹下新建raw文件夹,将音乐文件复制到raw文件夹
在这里插入图片描述
res/raw文件夹通常存放资源文件,如音频、视频等资源。注意:raw文件夹下不能有子文件,此外raw下的文件名应为英文名,否则不能识别。

(2)广播接收者注册并添加接收广播的权限

注册:告诉系统这个BroadcastReceiver要接收哪种广播消息(实质是Intent)

<receiver
    android:name=".SmsReceiver"
    android:enabled="true"
    android:exported="true">
    <intent-filter>
        <action android:name="android.provider.Telephony.SMS_RECEIVED" />
    </intent-filter>
</receiver>

intent-filter属于过滤器,即使手机应用接收固定的广播。

在AndroidManifest.xml文件中添加权限信息:

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

由于接收短信广播权限是危险权限,因此,在Android 6.0设备上运行时,必须对本应用进行动态权限处理。

(3)布局文件
布局文件中就一个button

<Button
    android:id="@+id/btnStop"
    android:layout_width="200dp"
    android:layout_height="105dp"
    android:text="暂停播放"
    android:textSize="35sp"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.0"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintVertical_bias="0.0" />

(4)音乐服务文件


public class MyAudioService extends Service {
    public MyAudioService() {
    }

    MediaPlayer mediaPlayer;

    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        return null;
    }

    @Override
    public void onCreate() {
       // super.onCreate();
        mediaPlayer  = MediaPlayer.create(this,R.raw.one);
        mediaPlayer.start();
    }

    @Override
    public void onDestroy() {
        //super.onDestroy();
        mediaPlayer.stop();
    }
}

(5)广播接收器程序

public class SmsReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO: This method is called when the BroadcastReceiver is receiving
        // an Intent broadcast.
        Intent serviceIntent = new Intent(context, MyAudioService.class);
        //在广播组件里,通过上下文对象启动音乐播放服务组件
        context.startService(serviceIntent);

        //新建调用Activity组件的意图
        Intent activityIntent = new Intent(context, MainActivity.class);
        activityIntent.putExtra("iscast", true);  //携带数据
        //新建栈用来存放被启动的Activity(当已经存在时,只做移动处理)
        activityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        //在广播组件里,通过上下文对象启动Activity组件
        context.startActivity(activityIntent);
    }
}

(6)主界面程序

public class MainActivity extends AppCompatActivity {

    private Button btnStop;
    private boolean isCast; //是否为广播激活

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

        if (ContextCompat.checkSelfPermission(this, Manifest.permission.RECEIVE_SMS) != PackageManager.PERMISSION_GRANTED){
            ActivityCompat.requestPermissions(this,new String[]{"android.permission.RECEIVE_SMS"},1);
        }

        btnStop=findViewById(R.id.btnStop);
        Intent intent = getIntent(); //获取广播意图对象
        isCast = intent.getBooleanExtra("iscast", false);  //默认值为false
        btnStop.setEnabled(isCast);   //设置停止按钮可用和单击监听
        if(isCast)
            Toast.makeText(this, "正在播放音乐...", Toast.LENGTH_SHORT).show();

        btnStop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //显式服务调用意图(非绑定式)
                Intent intent=new Intent(MainActivity.this,MyAudioService.class);
                //在Activity组件里,停止音乐播放服务
                stopService(intent);
                finish();  //销毁本活动
            }
        });
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        switch (requestCode){
            case 1:
                if(grantResults[0]!=PackageManager.PERMISSION_GRANTED){
                    Toast.makeText(this, "未授权,无法实现预定的功能!", Toast.LENGTH_SHORT).show();
                    finish();
                }else{
                    Toast.makeText(this, "请发一条短信验证...", Toast.LENGTH_SHORT).show();
                }
        }

    }
}

(7)测试
短信发送前:
在这里插入图片描述
短信发送后:
在这里插入图片描述
短线发送:
在这里插入图片描述小结:
这里的广播为系统广播,故不用自己写广播,但其他广播需要自己写广播。此外,要注意对广播进行过滤,和动态权限的申请。

项目详细代码见如下连接:
链接: https://gitee.com/perpetual_peony/Broadcast_msgMusic.

发布了2 篇原创文章 · 获赞 0 · 访问量 64

猜你喜欢

转载自blog.csdn.net/m0_46678736/article/details/105562224