-1

У меня есть функция MainActivity (не уверена, если это уместно), и она отлично играет в фоновой музыке. Я хочу, чтобы музыка остановилась, когда вы покинули мероприятие. Я минимизировал коды ниже. Я получаю исключение nullpoint в жизненном цикле onPause() Activity.Как прекратить играть в фоновую музыку на фрагментеАктивность

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 активности. Прочтите ли вы официальную документацию на мероприятия (предложено в закрытом вопросе)? Вам не следует просто просто копировать и вставлять примеры из Интернета без понимания концепций, стоящих за ним. Пожалуйста, потратьте некоторое время на понимание жизненных циклов деятельности и опубликуйте [mcve], иначе вопрос будет отключен от темы и будет иметь тенденцию к снижению. –

+0

@DavidRawson Я прочитал и просмотрел ссылку, которую вы поделили. Что я узнал, я думаю, что проблема заключается в том, что фрагменты привязаны к жизненному циклу классов активности. Теперь, если я могу просто спросить вас, как исследовать дальнейший b/cI, попытался поставить игрока на остановку onPause (активность и фрагмент), но все же я все равно получаю ошибку исключения. На какой жизненный цикл (активность, фрагмент или и то, и другое) я должен положить команду для остановки игрока? Я не хочу быть вне темы, может быть, я просто не знаю, как задать правильный вопрос. –

+1

Замечательно, что вы узнали из видео. Теперь, возможно, отредактируйте свой вопрос, чтобы включить указанную вами информацию. Итак, игрок останавливается на [жизненном цикле здесь, например. onStart()] или, я получаю [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

, хорошо сделанный при решении проблемы самостоятельно! –