AS之广播与服务(音乐盒)

功能说明:在Fragment布局的tab页面中添加了基本的音乐播放器,包括下一曲、上一曲、播放、停止等功能。

分析:BroadcastReceiver是Android的四大组件之一,用来编写广播接收者程序,对广播做出响应;

BroadcastReceiver程序必须在清单文件里注册(配置);

广播划分为系统广播和用户自定义广播两种;

在Android系统里,存在大量的系统广播,如短信到来时会产生一个系统广播,系统程序和用户程序都可以处理广播;

接收系统的广播,有静态注册和动态注册两种使用方式;

可以发送自定义广播并动态注册广播接收者;

短信到来时,系统的短信处理程序会在手机通知栏产生一条通知,单击通知标题可以查看通知内容,这是使用了PendingIntent。当然,从手机联系人也可以查看短信内容。

代码:

Fragment.java :


package com.example.zy;

        import

android.content.BroadcastReceiver;

        import

android.content.Context;

        import

android.content.Intent;

        import

android.content.IntentFilter;

        import

android.os.Bundle;

        import

android.view.LayoutInflater;

        import

android.view.View;

        import

android.view.ViewGroup;

        import

android.widget.ImageButton;

        import

android.widget.TextView;

        import

androidx.fragment.app.Fragment;

/**

 * A simple {@link Fragment}subclass.

 * Use the {@link FrdFragment#newInstance}factory method to

 * create an instance of this fragment.

 */

public class FrdFragment extends Fragment implements View.OnClickListener {


// TODO:Rename parameter arguments, choose names that match

    // the fragment initialization parameters, e.g.ARG_ITEM_NUMBER


private static final String ARG_PARAM1= "param1";

    private static final

String ARG_PARAM2 = "param2";


// TODO:Rename and change types of parameters

    private StringmParam1;

    private

String mParam2;


TextView title, author;


ImageButton play, stop,last,next;


ActivityReceiver activityReceiver;

    public static final

String CTL_ACTION=


"org.jay.action.CTL_ACTION";

    public static final

String UPDATE_ACTION=


"org.jay.action.UPDATE_ACTION";

    int

status = 0x11;


String[] titleStrs= new String[]

{"Not Afraid ","你要相信这不是最后一天","失眠飞行","男孩","你不是真正的快乐"};


String[] authorStrs= new String[]

{"Eminem~","华晨宇","沈以诚","梁博","五月天"};

    public

FrdFragment() {


// Required empty public constructor


}


/**

     * Use this factory method to createa new instance of

     * this fragment using the providedparameters.

     *

     *@param param1 Parameter 1.

     *@param param2 Parameter 2.

     *@return A new instance offragment BlankFragment.

     */

    // TODO:Rename and change types and number of parameters

    public static FrdFragment newInstance(String param1, Stringparam2) {

        FrdFragment fragment =

new FrdFragment();


Bundle args = new Bundle();


args.putString(ARG_PARAM1, param1);


args.putString(ARG_PARAM2, param2);


fragment.setArguments(args);

        return

fragment;


}


@Override


public void onClick(View view) {

        Intent intent =

new Intent(CTL_ACTION);


//在主界面按下对应按钮,传递给service对应参数

        switch (view.getId())

        {


case R.id.play:

                intent.putExtra(

"control",1);

                break;

            case

R.id.stop:

                intent.putExtra(

"control",2);

                break;

            case

R.id.next:

                intent.putExtra(

"control",3);

                break;

            case

R.id.last:

                intent.putExtra(

"control",4);

                break;


}

       getActivity().sendBroadcast(intent)

;


}


@Override


public void onCreate(BundlesavedInstanceState) {


super.onCreate(savedInstanceState);

        if

(getArguments() != null) {


mParam1 =

getArguments().getString(ARG_PARAM1);


mParam2 =

getArguments().getString(ARG_PARAM2);


}


activityReceiver = new ActivityReceiver();


IntentFilter filter = new IntentFilter(UPDATE_ACTION);


getActivity().getApplicationContext().registerReceiver(activityReceiver,filter);


Intent intent = new Intent(getActivity(),MusicService.class);


getActivity().startService(intent);


}


class ActivityReceiverextends BroadcastReceiver {


@Override


public void onReceive(Context context, Intent intent) {


//获取来自receive中intent的update消息,代表播放状态

            int update = intent.getIntExtra("update",-1);


//获取来自receive中intent的curruent消息,代表正在播放的歌曲

            int current = intent.getIntExtra("current",-1);


//如果状态为正在播放歌曲或暂停

            if(current>=0 && (update == 0x12 || update == 0x13))

            {


title.setText(titleStrs[current]);


author.setText(authorStrs[current]);


}


//如果状态为未播放歌曲

            else if (update == 0x11)

            {


title.setText("未播放歌曲");


author.setText("未播放歌曲");


}


switch (update)

            {


//如果未播放歌曲,则播放图标为播放

                case 0x11:


play.setImageResource(R.drawable.play);


status=0x11;

                    break;


//如果正在播放歌曲,则播放图标为暂停

                case 0x12:


play.setImageResource(R.drawable.pause);


status=0x12;

                    break;

                case

0x13:


play.setImageResource(R.drawable.play);


status=0x13;

                    break;


}

        }

    }


@Override


public ViewonCreateView(LayoutInflater inflater, ViewGroup

container,


Bundle savedInstanceState) {


// Inflate the layout for this fragment


View view = inflater.inflate(R.layout.tab02,container,false);


//找到对应控件

        play = view.findViewById(R.id.play);


stop =

view.findViewById(R.id.stop);


next =

view.findViewById(R.id.next);


last =

view.findViewById(R.id.last);


title =

view.findViewById(R.id.name);


author =

view.findViewById(R.id.singer);


//添加监听

        play.setOnClickListener(this);


stop.setOnClickListener(this);


next.setOnClickListener(this);


last.setOnClickListener(this);

        return

view;


}

}

我们加入资源文件后就是要进行页面布局了,我们在/res/layout文件夹下新建.xml文件,然后将布局布置为自己所喜欢的样子即可,需要四个imagebutton和两个TextView,其他的可以自行添加,位置可以改变,这个也比较容易去配置

创建MusicService.java文件。新建一个MusicService.java文件,由它来继承Service,实现音乐的播放功能。

代码:

import android.app.Service;

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

import android.content.IntentFilter;

import android.content.res.AssetFileDescriptor;

import android.content.res.AssetManager;

import android.media.MediaPlayer;

import android.os.IBinder;

import androidx.annotation.Nullable;

import java.io.IOException;

public class MusicService extends Service {


@Nullable


MyReceiver serviceReceiver;

    AssetManager

am;

    String[]

musics=new String[]{"Fairy_town.mp3","Mojito.mp3","Re0.mp3","SayGood_NoCrying.mp3","Write_US.mp3"};

    MediaPlayer

mPlayer;


//0x11表示没有播放,0x12代表正在播放,0x13代表暂停

    int status=0x11;


int current=0;


public IBinder onBind(Intent intent) {


return null;

    }


public void onCreate(){


super.onCreate();


am=getAssets();


//创建BroadcastReceiver


serviceReceiver=new MyReceiver();


//创建IntentFilter


IntentFilter filter=new IntentFilter();

        filter.addAction(FrdFragment.

CTL_ACTION);

        registerReceiver(

serviceReceiver,filter);


mPlayer=new MediaPlayer();


//为MediaPlayer播放完成事件绑定监听器

        mPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {


@Override


public void onCompletion(MediaPlayer mp) {


current++;

                Intent sendIntent2 =

new Intent(FrdFragment.UPDATE_ACTION);

                sendIntent2.putExtra(

"current",current);


//发送广播,将被Activity组件中的BroadcastReceiver接收

                sendBroadcast(sendIntent2);


if (current>4)

                {


current=0;

                }

                Intent sendIntent3 =

new Intent(FrdFragment.UPDATE_ACTION);

                sendIntent3.putExtra(

"current",current);


//发送广播,将被Activity组件中的BroadcastReceiver接收

                sendBroadcast(sendIntent3);


//准备播放音乐

                prepareAndPlay(musics[current]);

            }

        });

    }


public class MyReceiver extends BroadcastReceiver {


@Override


public void onReceive(Context context, Intent intent) {


int control =intent.getIntExtra("control",-1);


switch (control)

            {


//播放或暂停

                case 1:


//原来处于没有播放状态

                    if (status==0x11)

                    {


//准备并播放音乐

                        prepareAndPlay(musics[current]);


status=0x12;

                    }


//原来处于播放状态

                    else if (status==0x12)

                    {


//暂停

                        mPlayer.pause();


//改变为暂停状态

                        status=0x13;

                    }


//原来处于暂停状态

                    else if (status==0x13)

                    {


//播放

                        mPlayer.start();


//改变状态

                        status=0x12;

                    }


break;


//停止声音

                case 2:


//如果原来正在播放或暂停

                    if (status==0x12||status==0x13) {


//停止播放

                        mPlayer.stop();


status = 0x11;

                    }


break;


case 3:


//原来处于没有播放或暂停状态

                    if (status==0x11||status==0x13)

                    {


if(current==0) {


current=4;

                        }


//准备并播放音乐

                        else {


current=current-1;

                        }

                        prepareAndPlay(

musics[current]);


status=0x12;

                    }


//原来处于播放状态

                    else if (status==0x12)

                    {


//上一首//准备并播放音乐

                        if(current==0) {


current=4;

                        }


else {


current=current-1;

                        }

                        prepareAndPlay(

musics[current]);

                    }


break;


case 4:


//原来处于没有播放或暂停状态

                    if (status==0x11||status==0x13)

                    {


if(current==4) {


current=0;

                        }  

//准备并播放音乐

                        else {


current=current+1;

                        }

                        prepareAndPlay(

musics[current]);


status=0x12;

                    }


else if (status==0x12)

                    {


if(current==4) {


current=0;

                        }


else {


current=current+1;

                        }

                        prepareAndPlay(

musics[current]);

                    }


break;

            }


//广播通知Activity更改图标、文本框

            Intent sendIntent=new Intent(FrdFragment.UPDATE_ACTION);

            sendIntent.putExtra(

"update",status);

            sendIntent.putExtra(

"current",current);


//发送广播,将被Activity组件中的BroadcastReceiver接收

            sendBroadcast(sendIntent);

        }

        }


private void prepareAndPlay(String music)

    {


try

        {


//打开指定音乐文件

            AssetFileDescriptor afd=am.openFd(music);


mPlayer.reset();


//使用MediaPlayer加载指定的音乐文件

            mPlayer.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());


//准备声音

            mPlayer.prepare();


//播放

            mPlayer.start();

        }

catch (IOException e) {

            e.printStackTrace();

        }

    }

}

结果截图:


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,039评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,426评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,417评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,868评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,892评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,692评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,416评论 3 419
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,326评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,782评论 1 316
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,957评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,102评论 1 350
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,790评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,442评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,996评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,113评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,332评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,044评论 2 355

推荐阅读更多精彩内容