实验三: 服务与广播

news/2024/7/8 11:39:11

实验目标和实验内容:
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、结果截图
刚启动时界面:

在这里插入图片描述

发送短信后:
在这里插入图片描述

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


http://www.niftyadmin.cn/n/3069156.html

相关文章

Nginx的负载均衡 - 最少连接 (least_conn)

Nginx版本&#xff1a;1.9.1 我的博客&#xff1a;http://blog.csdn.net/zhangskd 算法介绍 我们知道轮询算法是把请求平均的转发给各个后端&#xff0c;使它们的负载大致相同。 这有个前提&#xff0c;就是每个请求所占用的后端时间要差不多&#xff0c;如果有些请求占用的时间…

《世界是数字的》读后感(3)

第六章 软件系统 6.1 操作系统 操作系统控制和分配计算机资源&#xff1a;首先&#xff0c;它负责管理CPU,调度和协调当前运行的程序(可在任务管理器中查看进程和任务)&#xff1b;其次&#xff0c;操作系统管理RAM(为有效利用RAM&#xff0c;一种思路是在必要时把程序的一部分…

cisco 路由器IOS操作系统

在路由器的使用和配置过程中&#xff0c;有时因操作失误或系统故障&#xff0c;致使路由器IOS操作系统的丢失&#xff0c;导致路由器无法进入正常工作&#xff0c;下面以Cisco2611为例&#xff0c;简要介绍一种方便可靠的IOS操作系统恢复的方法。一、路由器的基本组成及有关术语…

MongoDB介绍与windows下安装

MongoDB是一个介于关系数据库和非关系数据库之间的产品&#xff0c;是非关系数据库当中功能最丰富&#xff0c;最像关系数据库的。他支持的数据结构非常松散&#xff0c;是类 似json的bjson格式&#xff0c;因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言…

《Mysql实战45讲》网盘链接

链接&#xff1a;https://pan.baidu.com/s/14fq7BzQD4sIBjYeh1sElQw 提取码&#xff1a;1119

魔兽80以后!!

首先恭喜你的是&#xff0c;你达到80级&#xff0c;这个时候你还在迷茫&#xff0c;究竟我该做些什么。很好&#xff0c;这说明&#xff0c;你有一颗DK的心。 杂七杂八的说完了&#xff0c;说一下装备提升的事情。没听错&#xff0c;只需要三天左右&#xff0c;就差不多了 第一…

晒晒上次活动的照片

昨天打开照相机看到了九月份的活动照片&#xff0c;发现还是有很多比较好玩的场景和大家分享的&#xff0c;比如说有大黄蜂、乐队表演、园友大玩三国杀的场景。不多说了&#xff0c;直接上图了。内有一位闪存明星哦~~~~。 先来展现两张大黄蜂的照片&#xff0c;真是有气势啊&am…

【先进的算法】Lasvegas算法3SAT问题(C++实现代码)

转载请注明出处&#xff1a;http://blog.csdn.net/zhoubin1992/article/details/46469557 1.SAT问题描写叙述 命题逻辑中合取范式 (CNF) 的可满足性问题 (SAT)是当代理论计算机科学的核心问题, 是一典型的NP 全然问题.在定义可满足性问题SAT之前。先引进一些逻辑符号。 一个 S…