实验三: 服务与广播

  • Post author:
  • Post category:其他


实验目标和实验内容:

1、掌握服务的基本概念,能编写服务过程并进行调用;

2、掌握广播的基本概念,能实现广播通信。

3、需实现的具体功能为:

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

实验结果:(实验小结与结果截图)

4、功能说明与核心代码

MainActivity的Demo:

主要绑定相应的service以及加载相关的控件

package com.example.myapplication2020;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity2020 extends AppCompatActivity {

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

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2020);
        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(MainActivity2020.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();
                }
        }
    }
}

接收广播的Demo:
主要用于在接收广播之后要触发服务
```java
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

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, MainActivity2020.class);
        activityIntent.putExtra("iscast", true);  //携带数据
        //新建栈用来存放被启动的Activity(当已经存在时,只做移动处理)
        activityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        //在广播组件里,通过上下文对象启动Activity组件
        context.startActivity(activityIntent);
    }
}
音乐播放服务的编写:
主要用于启动时在后台启动音乐播放服务
package com.example.myapplication2020;

import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;

public class MyAudioService extends Service {
    MediaPlayer mediaPlayer;

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
    @Override
    public void onCreate() {
        mediaPlayer  = MediaPlayer.create(this,R.raw.white);//加载上下文即相应的音乐文件
        mediaPlayer.start();
    }
    @Override
    public void onDestroy() {
        mediaPlayer.stop();
    }
}

在AndroidManiffest.xml注册广播接收及加入相关权限
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapplication2020">
    <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"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
            </intent-filter>
        </receiver>

        <service
            android:name=".MyAudioService"
            android:enabled="true"
            android:exported="true" />

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

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

</manifest>

5、结果截图

刚启动时界面:

在这里插入图片描述

发送短信后:

在这里插入图片描述

点击按钮:
在这里插入图片描述



版权声明:本文为m0_47014744原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。