• Android Broadcast编写的音乐播放器


    此播放器的播放操作交给后台执行,二者通过广播进行进行通信(双向通信),前台点击播放暂停停止按钮通过广播发送给后台,后台播放变换通过广播通知前台。

    前台代码

    package org.crazyit.broadcast;
    
    import android.app.Activity;
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.content.IntentFilter;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.ImageButton;
    import android.widget.TextView;
    
    /**
     * Description:
     * <br/>site: <a href="http://www.crazyit.org">crazyit.org</a>
     * <br/>Copyright (C), 2001-2014, Yeeku.H.Lee
     * <br/>This program is protected by copyright laws.
     * <br/>Program Name:
     * <br/>Date:
     * @author  Yeeku.H.Lee kongyeeku@163.com
     * @version  1.0
     */
    public class MusicBox extends Activity implements OnClickListener
    {
        // 获取界面中显示歌曲标题、作者文本框
        TextView title, author;
        // 播放/暂停、停止按钮
        ImageButton play, stop;
        ActivityReceiver activityReceiver;
        public static final String CTL_ACTION = 
            "org.crazyit.action.CTL_ACTION";
        public static final String UPDATE_ACTION =
            "org.crazyit.action.UPDATE_ACTION";
        // 定义音乐的播放状态,0x11代表没有播放;0x12代表正在播放;0x13代表暂停
        int status = 0x11;
        String[] titleStrs = new String[] { "心愿", "约定", "美丽新世界" };
        String[] authorStrs = new String[] { "未知艺术家", "周蕙", "伍佰" };
    
        @Override
        public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            // 获取程序界面界面中的两个按钮
            play = (ImageButton) this.findViewById(R.id.play);
            stop = (ImageButton) this.findViewById(R.id.stop);
            title = (TextView) findViewById(R.id.title);
            author = (TextView) findViewById(R.id.author);
            // 为两个按钮的单击事件添加监听器
            play.setOnClickListener(this);
            stop.setOnClickListener(this);
            activityReceiver = new ActivityReceiver();
            // 创建IntentFilter
            IntentFilter filter = new IntentFilter();
            // 指定BroadcastReceiver监听的Action
            filter.addAction(UPDATE_ACTION);
            // 注册BroadcastReceiver
            registerReceiver(activityReceiver, filter);
            Intent intent = new Intent(this, MusicService.class);
            // 启动后台Service
            startService(intent);
        }
    
        // 自定义的BroadcastReceiver,负责监听从Service传回来的广播
        public class ActivityReceiver extends BroadcastReceiver
        {
            @Override
            public void onReceive(Context context, Intent intent)
            {
                // 获取Intent中的update消息,update代表播放状态
                int update = intent.getIntExtra("update", -1);
                // 获取Intent中的current消息,current代表当前正在播放的歌曲
                int current = intent.getIntExtra("current", -1);
                if (current >= 0)
                {
                    title.setText(titleStrs[current]);
                    author.setText(authorStrs[current]);
                }
                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 void onClick(View source)
        {
            // 创建Intent
            Intent intent = new Intent("org.crazyit.action.CTL_ACTION");
            switch (source.getId())
            {
                // 按下播放/暂停按钮
                case R.id.play:
                    intent.putExtra("control", 1);
                    break;
                // 按下停止按钮
                case R.id.stop:
                    intent.putExtra("control", 2);
                    break;
            }
            // 发送广播,将被Service组件中的BroadcastReceiver接收到
            sendBroadcast(intent);
        }
    }

    后台服务

    /**
     *
     */
    package org.crazyit.broadcast;
    
    import java.io.IOException;
    
    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.media.MediaPlayer.OnCompletionListener;
    import android.os.IBinder;
    
    /**
     * Description:
     * <br/>网站: <a href="http://www.crazyit.org">疯狂Java联盟</a>
     * <br/>Copyright (C), 2001-2014, Yeeku.H.Lee
     * <br/>This program is protected by copyright laws.
     * <br/>Program Name:
     * <br/>Date:
     * @author  Yeeku.H.Lee kongyeeku@163.com
     * @version  1.0
     */
    public class MusicService extends Service
    {
        MyReceiver serviceReceiver;
        AssetManager am;
        String[] musics = new String[] { "wish.mp3", "promise.mp3",
            "beautiful.mp3" };
        MediaPlayer mPlayer;
        // 当前的状态,0x11 代表没有播放 ;0x12代表 正在播放;0x13代表暂停
        int status = 0x11;
        // 记录当前正在播放的音乐
        int current = 0;
    
        @Override
        public IBinder onBind(Intent intent)
        {
            return null;
        }
    
        @Override
        public void onCreate()
        {
            am = getAssets();
            // 创建BroadcastReceiver
            serviceReceiver = new MyReceiver();
            // 创建IntentFilter
            IntentFilter filter = new IntentFilter();
            filter.addAction(MusicBox.CTL_ACTION);
            registerReceiver(serviceReceiver, filter);
            // 创建MediaPlayer
            mPlayer = new MediaPlayer();
            // 为MediaPlayer播放完成事件绑定监听器
            mPlayer.setOnCompletionListener(new OnCompletionListener() //
            {
                @Override
                public void onCompletion(MediaPlayer mp)
                {
                    current++;
                    if (current >= 3)
                    {
                        current = 0;
                    }
                    // 发送广播通知Activity更改文本框
                    Intent sendIntent = new Intent(MusicBox.UPDATE_ACTION);
                    sendIntent.putExtra("current", current);
                    // 发送广播 ,将被Activity组件中的BroadcastReceiver接收到
                    sendBroadcast(sendIntent);
                    // 准备、并播放音乐
                    prepareAndPlay(musics[current]);
                }
            });
            super.onCreate();
        }
    
        public class MyReceiver extends BroadcastReceiver
        {
            @Override
            public void onReceive(final 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;
                        }
                }
                // 发送广播通知Activity更改图标、文本框
                Intent sendIntent = new Intent(MusicBox.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();
            }
        }
    }

    布局文件

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content">
    <ImageButton
        android:id="@+id/play"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/play"/>
    <ImageButton 
        android:id="@+id/stop" 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/stop"/>
    <LinearLayout
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"
        android:textSize="25px"
        android:textColor="#ffffff"
        android:ellipsize="marquee"
        android:layout_weight="1"
        android:marqueeRepeatLimit="marquee_forever"/>
    <TextView
        android:id="@+id/author"
        android:textSize="15px"
        android:gravity="center_vertical"
        android:layout_weight="1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>            
    </LinearLayout>
    </LinearLayout>

    配置文件

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="org.crazyit.broadcast"
        android:versionCode="1"
        android:versionName="1.0">
        <uses-sdk
            android:minSdkVersion="10"
            android:targetSdkVersion="17" />
        <application android:icon="@drawable/ic_launcher" android:label="@string/app_name">
            <activity android:name=".MusicBox"
                    android:label="@string/app_name">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
            <service android:name=".MusicService">
            </service>
        </application>
    </manifest> 
  • 相关阅读:
    此类目的是防治序列化Json字符串时的循环引用问题-------最好解决方案
    Json.Net学习笔记
    深入理解javascript原型和闭包(完结)
    SDL 威胁建模工具入门 threat modeling tool
    .NET 4.0 中的契约式编程
    MVC调用部分视图PartialView
    visual studio 常识
    【阿里云产品评测】小鸡咕咕的初体验
    【阿里云入门产品免费试用半年】加入微博话题+“最”炫推荐理由,得精美小礼物
    镜像公测招募啦!!!用镜像开通云服务器,限时免费体验!!
  • 原文地址:https://www.cnblogs.com/songyao/p/4142829.html
Copyright © 2020-2023  润新知