【问题标题】:How to stop playing background music on fragmentActivity如何停止在 fragmentActivity 上播放背景音乐
【发布时间】:2017-01-12 16:28:18
【问题描述】:

我有一个 Mainactivity 扩展 fragmentActivity(不确定是否相关),它可以正常播放背景音乐。我希望音乐在您离开活动时停止。我最小化了下面的代码。我在 Activity 的 onPause() 生命周期上遇到空点异常。

public class MainActivitytest extends FragmentActivity implements
    ActionBar.TabListener{

private String[] tabs = {"Colors and Shapes", "Letters and Numbers", "CVC and Sight Words", "Adjectives", "Simple Sentences", "Reading Comprehension"};
private ViewPager viewPager;
private TabsPagerAdapter mAdapter;
private ActionBar actionBar;
private int myShuffledSize;
private Context context;
public static final String PREFS_NAME = "MyPrefsFile";
public MediaPlayer player;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    super.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    Intent intent = new Intent(this, MusicService.class);
    startService(intent);

    new SetupViews().invoke();  //setup fragment views
}

public void onResume() {
    super.onResume();
    MediaPlayer player = MediaPlayer.create(MainActivitytest.this, R.raw.bgmusic3);
    player.setLooping(true);
    player.setVolume(100, 100);
    player.start();

}
public void onPause(){
    super.onPause();
    //player.stop();  //causes null pointer exception
}

【问题讨论】:

  • 就像您关闭的question from yesterday 一样,问题在于不了解Android Activity 生命周期。您是否阅读过活动的官方文档(在封闭式问题中建议)?您不应该仅仅期望只是从互联网上复制和粘贴示例而不了解其背后的概念。请花一些时间了解 Activity 生命周期并发布 minimal reproducible example,否则问题偏离主题,往往会被否决
  • @DavidRawson 我已阅读并观看了您分享的链接。根据我所学到的,我认为问题在于片段与活动类的生命周期相关联。现在,如果我可以问你如何进一步研究 b/c,我试图让播放器在 onPause(活动和片段)处停止,但我仍然不断收到空异常错误。我应该在哪个生命周期(活动或片段或两者)下命令让玩家停止?我并不是要跑题,也许我只是不知道如何提出正确的问题。
  • 您从视频中学到了很多东西。现在也许编辑您的问题以包含您提到的信息。所以,玩家在[生命周期这里停止,例如。 onStart()] 或者,我在 [这里的生命周期] 得到 [nullpointerexception]。如果你这样做,它可以让人们更容易快速诊断问题,而无需通读所有代码

标签: android android-fragmentactivity background-music background-media-player


【解决方案1】:

在进行了更多研究之后,我通过服务实现了我想要的,这是我学到的新东西。这是我使用的代码

public class MainActivitytest extends FragmentActivity implements
    ActionBar.TabListener {
public final static String EXTRA_MESSAGE = "com.example.myfirstapp.MESSAGE";
public final static String MUSIC_BACKGROUND = "com.example.myfirstapp.MESSAGE";

private String[] tabs = {"Colors and Shapes", "Letters and Numbers", "CVC and Sight Words", "Adjectives", "Simple Sentences", "Reading Comprehension"};
private ViewPager viewPager;
private TabsPagerAdapter mAdapter;
private ActionBar actionBar;
private Context context;
public static final String PREFS_NAME = "MyPrefsFile";

private boolean mIsBound = false;
private MusicService mServ;
private ServiceConnection Scon =new ServiceConnection(){

    public void onServiceConnected(ComponentName name, IBinder
            binder) {

        mServ = ((MusicService.ServiceBinder)binder).getService();
    }

    public void onServiceDisconnected(ComponentName name) {
        mServ = null;
    }
};

void doBindService(){
    bindService(new Intent(this,MusicService.class),
            Scon,Context.BIND_AUTO_CREATE);
    mIsBound = true;
}

void doUnbindService()
{
    if(mIsBound)
    {
        unbindService(Scon);
        mIsBound = false;
    }
}
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    super.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    Intent intent = new Intent(this, MusicService.class);
    startService(intent);

    new SetupViews().invoke();  //setup fragment views
}

    public void onPause(){
    super.onPause();
    Intent intent = new Intent(this, MusicService.class);
    stopService(intent);

现在我的服务类

package info.androidhive.tabsswipe;

import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnErrorListener;
import android.os.Binder;
import android.os.IBinder;
import android.widget.Toast;

public class MusicService extends Service  implements MediaPlayer.OnErrorListener {
private final IBinder mBinder = new ServiceBinder();
MediaPlayer mPlayer;
private int length = 0;

public MusicService() {
}

public class ServiceBinder extends Binder {
    public MusicService getService() {
        return MusicService.this;
    }

}

@Override
public IBinder onBind(Intent arg0) {
    return mBinder;
}

@Override
public void onCreate() {
    super.onCreate();

    mPlayer = MediaPlayer.create(this, R.raw.bgmusic3);
    mPlayer.setOnErrorListener(this);

    if (mPlayer != null) {
        mPlayer.setLooping(true);
        mPlayer.setVolume(100, 100);
    }


    mPlayer.setOnErrorListener(new OnErrorListener() {

        public boolean onError(MediaPlayer mp, int what, int
                extra) {

            onError(mPlayer, what, extra);
            return true;
        }
    });
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    mPlayer.start();
    return START_STICKY;
}

public void pauseMusic() {
    if (mPlayer.isPlaying()) {
        mPlayer.pause();
        length = mPlayer.getCurrentPosition();

    }
}

public void resumeMusic() {
    if (mPlayer.isPlaying() == false) {
        mPlayer.seekTo(length);
        mPlayer.start();
    }
}

public void stopMusic() {
    mPlayer.stop();
    mPlayer.release();
    mPlayer = null;
}

@Override
public void onDestroy() {
    super.onDestroy();
    if (mPlayer != null) {
        try {
            mPlayer.stop();
            mPlayer.release();
        } finally {
            mPlayer = null;
        }
    }
}

public boolean onError(MediaPlayer mp, int what, int extra) {

    Toast.makeText(this, "music player failed", Toast.LENGTH_SHORT).show();
    if (mPlayer != null) {
        try {
            mPlayer.stop();
            mPlayer.release();
        } finally {
            mPlayer = null;
        }
    }
    return false;
}


}

将其包含在清单中

    <service android:name=".MusicService" />
    <activity
        android:name="info.androidhive.tabsswipe.MainActivitytest"
        android:label="@string/app_name" >


        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>

这甚至适用于我的碎片化视图。我今天学到了很多。希望这可以帮助像我这样的其他人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-25
    • 1970-01-01
    • 2021-06-22
    • 1970-01-01
    • 2011-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多