二、服务与广播

  • 功能说明

短信到来时自动产生的系统广播→激活音乐播放服务程序→活动组件程序使得停止按钮可用。

  • 页面展示

 

 

 

 

 

 

  • 代码分析

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

 

posted @ 2020-12-27 01:14  cean_seven  阅读(96)  评论(0)    收藏  举报