Service播放音乐且Activity会切换

本文讲述了在Android开发中,如何避免在Service中使用MediaPlayer时因ApplicationContext为空导致的空指针异常,通过在Activity绑定Service时传递有效上下文。建议将Service内容放在onCreate()方法中,确保在接收到有效上下文后再创建MediaPlayer。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在写一个程序时遇到了一些情况,我需要使用Service播放音乐,且Activity会进行切换,切换时音乐不能中断

其中的MediaPlayer创建时如采用MediaPlayer.create(getApplicationContext(),R.raw.XXX)会造成环境为空指针的异常,原因时getApplicationContext()获取到的Service环境为空。

我对此提出的应对方案是在Activity绑定服务时(bindService)向服务传入有效上下文环境信息;服务在收到了有效环境信息后进行MediaPlayer的创建。

请注意本例中有不建议的方法,

Service建议将内容代码添加在重写的onCreate()方法中,不建议添加在构造函数中。

1.Service代码如下(省略使用Binder控制Service的部分)

public class MyService extends Service {
    MediaPlayer mediaPlayer;
    Context context;
    public MyService() {
        if(mediaPlayer==null){
                        while (true){
                            if(context!=null){//判断环境是否已传入,传入成功后再创建MediaPlayer
                                mediaPlayer=MediaPlayer.create(context.getApplicationContext(),R.raw.callofsilencexzeroeclipse);
                                break;
                            }
                            Thread.sleep(40);//环境依然为空,40毫秒后再次查看环境情况
                        }
         }
    }
    public IBinder onBind(Intent intent) {
        return new MyBinder();
    }

    public class MyBinder extends Binder{
        public void musicPause(){
            needPause=true;
        }
        public void musicContinue(){
            needPause=false;
        }
        public void putContext(Context con){
            context=con;
        }
    }
}

2.Activity代码

要记得页面销毁时解绑服务

public class MainActivity extends AppCompatActivity {

    private MyService.MyBinder myBinder;
    private MyConnection myConnection;
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_producer);
        //绑定服务
        Intent intent=new Intent(ProducerActivity.this,MyService_music.class);
        myConnection=new MyConnection();
        bindService(intent,myConnection,BIND_AUTO_CREATE);

    }

    protected void onDestroy() {
        unbindService(myConnection);
        super.onDestroy();
    }

    private class MyConnection implements ServiceConnection {
        //绑定执行
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
            myBinder= (MyService_music.MyBinder) iBinder;
            myBinder.putContext(MainActivity.this);
        }
        //接触绑定执行
        public void onServiceDisconnected(ComponentName componentName) {
            myBinder=null;
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

在下嗷呜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值