二、服务与广播
- 功能说明
短信到来时自动产生的系统广播→激活音乐播放服务程序→活动组件程序使得停止按钮可用。
- 页面展示



- 代码分析
当BroadcastReceiver收到发送过短信的广播以后,调用播放音乐的服务程序开始播放音乐,当主程序监听到点击了停止播放按钮以后,调用停止播放音乐的服务程序。
(1)在页面中添加一个button按钮,用来实现停止播放音乐的功能:
<Button android:id="@+id/btnStop" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="停止播放" tools:layout_editor_absoluteX="130dp" tools:layout_editor_absoluteY="279dp" />
(2)创建开始播放音乐和停止播放音乐的服务:
public class MyAudioService extends Service { public MyAudioService() { } MediaPlayer mediaPlayer; @Override public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { mediaPlayer = MediaPlayer.create(this,R.raw.onestep); mediaPlayer.start(); } @Override public void onDestroy() { mediaPlayer.stop(); } }
(3)利用BroadcastReceiver组件接收到短信后开启服务
public class SmsReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { 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); } }
(4)请求开启短信接收权限,点击停止按钮后停止服务
@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(); } } }
浙公网安备 33010602011771号