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.