-1

我有一个Mainactivity扩展fragmentActivity(不知道是否相关),它播放的背景音乐罚款。当你离开活动时,我希望音乐停止。我最小化了下面的代码。我在活动的onPause()生命周期中收到空点异常。如何停止播放fragmentActivity上的背景音乐

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 
} 
+1

像你的[来自昨天的问题](https://stackoverflow.com/questions/41587155/starting-a-3rd-activity-setting-up-interfaces-and-listeners)被关闭,问题是从没有了解Android Activity生命周期。你是否阅读过官方文件(在封闭问题中建议)?您不应该期望只从互联网上复制和粘贴示例,而不理解背后的概念。请花一些时间了解活动生命周期并发布[mcve],否则问题不在话题之列,并且往往会被低估 –

+0

@DavidRawson我已阅读并观看了您分享的链接。用我学到的东西,我认为可能是片段被附加到活动类的生命周期。现在,如果我可以问你如何进一步研究b/cI,试图让玩家停在onPause(activity和fragment)上,但我仍然得到一个空的异常错误。在什么生命周期(活动或片段或两者)我应该把玩家停止的命令?我不是故意脱离主题,也许我只是不知道如何提出正确的问题。 –

+1

你从视频中学到的很棒。现在编辑您的问题,以包含您提到的信息。所以,玩家停止在[例如这里的生命周期。 onStart()]或者,我在[lifecycle here]中获得[nullpointerexception]。如果你这样做,它可以让人们更容易快速诊断问题,而无需通读所有代码 –

回答

0

经过更多的研究,我完成了我想要的服务,我学到了一些新东西。下面是我用

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> 

这个工程即使在我的局部视图包含这一点。今天我学到了很多。希望这可以帮助像我这样的其他人。

+0

以及自己解决问题! –