首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >尝试后台服务时的结果

尝试后台服务时的结果
EN

Stack Overflow用户
提问于 2022-10-02 16:59:50
回答 2查看 263关注 0票数 1

我正试着在android上做一个抽搐脚趾游戏。它也有一些变体。我创建了一个后台服务类。相同的代码如下所示。

代码语言:javascript
运行
复制
package com.sudarshan.tictactoenew;

import android.content.Intent;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.os.IBinder;
import android.app.Service;
import android.util.Log;

public class BackgroundSoundService extends Service {
    private static final String TAG = null;
   // Intent intent;

    MediaPlayer mp;
    public IBinder onBind(Intent arg0) {

        return null;
    }
    @Override
    public void onCreate() {
        super.onCreate();


    }
    public int onStartCommand(Intent intent, int flags, int startId) {

         mp = new MediaPlayer();

        Bundle extras = intent.getExtras();
        String itemname = (String) extras.get("itemname");
        Log.i("Itemname",itemname);
        if(itemname.equals("menupage"))
        {

            String filename = "android.resource://" + this.getPackageName() + "/raw/got";

            try {
                mp.setDataSource(this, Uri.parse(filename));
                mp.prepareAsync();
                mp.setLooping(true); // Set looping
                mp.setVolume(100,100);
                mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                    @Override
                    public void onPrepared(MediaPlayer mp) {
                        mp.start();
                    }
                });
                    ;
            } catch(Exception e){
                e.printStackTrace();
            }
            // = MediaPlayer.create(this, R.raw.got);

           // player1.start();
        }
        else if(itemname.equals("classictictactoe"))
        {

            Log.i("Inside","Inside classic tic tac toe");
            String filename = "android.resource://" + this.getPackageName() + "/raw/cof";

            try {
                mp.setDataSource(this, Uri.parse(filename));
                mp.prepareAsync();
                mp.setLooping(true); // Set looping
                mp.setVolume(100,100);
                mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                    @Override
                    public void onPrepared(MediaPlayer mp) {

                        mp.start();
                    }
                });
                
            } catch(Exception e){
                e.printStackTrace();
            }
            
        }


        return startId;
    }

    public void onStart(Intent intent, int startId) {
        // TO DO
    }
    public IBinder onUnBind(Intent arg0) {
        // TO DO Auto-generated method
        return null;
    }

    public void onStop() {

    }
    public void onPause() {

    }
    @Override
    public void onDestroy() {
        mp.stop();
        mp.release();


    }

    @Override
    public void onLowMemory() {

    }
}

这段代码不会被执行Log.i( "Inside ",“inin古典toe");下面是我的日志文件的一部分

代码语言:javascript
运行
复制
2022-10-02 21:44:36.475 13019-13019 Itemname                com.sudarshan.tictactoenew           I  menupage
2022-10-02 21:45:01.080 13019-13019 Itemname                com.sudarshan.tictactoenew           I  classictictactoe
2022-10-02 21:57:39.288 13019-13019 Itemname                com.sudarshan.tictactoenew           I  menupage
2022-10-02 21:57:46.764 13019-13019 Itemname                com.sudarshan.tictactoenew           I  classictictactoe
2022-10-02 21:57:57.114 13019-13019 Itemname                com.sudarshan.tictactoenew           I  menupage
2022-10-02 21:58:03.626 13019-13019 Itemname                com.sudarshan.tictactoenew           I  menupage
2022-10-02 21:58:08.837 13019-13019 Itemname                com.sudarshan.tictactoenew           I  classictictactoe
---------------------------- PROCESS ENDED (13019) for package com.sudarshan.tictactoenew ----------------------------
---------------------------- PROCESS STARTED (13341) for package com.sudarshan.tictactoenew ----------------------------
---------------------------- PROCESS ENDED (13341) for package com.sudarshan.tictactoenew ----------------------------
---------------------------- PROCESS STARTED (13430) for package com.sudarshan.tictactoenew ----------------------------
2022-10-02 21:59:31.086 13430-13430 Itemname                com.sudarshan.tictactoenew           I  menupage
2022-10-02 21:59:36.137 13430-13430 Itemname                com.sudarshan.tictactoenew           I  classictictactoe

男人和古典主义都是活动。音乐应该在活动开始时播放(无论是活动还是古典音乐),但当活动古典音乐开始时,音乐不播放,只有当活动活动开始时,音乐才会播放。

//古典主义活动相关代码的一部分

代码语言:javascript
运行
复制
Intent  intent = new Intent(ClassicTicToe.this, BackgroundSoundService.class);
        intent.putExtra("itemname","classictictactoe");
        startService(intent);

//有关活动守则的部分

代码语言:javascript
运行
复制
i = new Intent(MenuPage.this, BackgroundSoundService.class);
       i.putExtra("itemname","menupage");
        startService(i);

我不明白为什么两种活动中的音乐都不演奏。

我在原始文件夹中有音乐文件cof.mp3和got.mp3

EN

回答 2

Stack Overflow用户

发布于 2022-10-05 05:37:35

我认为你应该加入mp = null;来摧毁

代码语言:javascript
运行
复制
public void onDestroy() {
        mp.stop();
        mp.release();
        mp = null;
    }

查看这个例子以获得更多信息

票数 0
EN

Stack Overflow用户

发布于 2022-10-05 09:05:20

我已经测试了您的代码,在您在onStartCommand() of BackgroundSoundService中做了以下更改之后,它就可以工作了:

代码语言:javascript
运行
复制
public int onStartCommand(Intent intent, int flags, int startId) {

    if(mp == null){
        mp = new MediaPlayer();
    }
    else{
        mp.reset();
    }

    Bundle extras = intent.getExtras();
    String itemname = (String) extras.get("itemname");
    ...
    ...

  return START_STICKY;
}

第一次从MenuPage活动启动服务时,它会创建一个新的MediaPlayer实例,并播放第一个音乐(got.mp3)。稍后,当您想用不同的意图数据从ClassicTicToe活动重新启动服务时,它使用reset()方法重置现有的MediaPlayer实例,然后播放第二个音乐(cof.mp3)。此外,我还根据START_STICKY的文档将返回id更改为onStartCommand

返回值指示系统应该对服务的当前启动状态使用什么语义。它可能是与START_CONTINUATION_MASK位相关联的常量之一。值是START_STICKY_COMPATIBILITY、START_STICKY、START_NOT_STICKY或START_REDELIVER_INTENT。

因此,在您的例子中,最好是START_STICKY,因为您有一个服务正在执行背景音乐播放。根据粘稠的文档

这种模式对于将显式启动并停止运行任意一段时间的事情是有意义的,例如执行背景音乐播放的服务。

另外,当您使用活动中的stopService()或BackgroundSoundService中的stopSelf()完成服务任务时,不要忘记停止服务来释放资源。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73927714

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档