The onStartCommand service is called after the action completes.

I start my service when I press the play button to play the song and associate it with it and get it on onStartCommand. The problem is that when my activity that starts the service ends, my service calls onStartCommand again. When he goes to get this package, it does not exist, because this time it was not launched. Because of this, I get an invalid exception when preparing my media player. I do not tie my service.

Why is the onStartCommand call called when my activity ends?

Service Launch:

Intent i = new Intent(SongList.this,MyService.class); i.putExtra("songURL", user.songurlz); i.putExtra("songNAME", songplay_name); startService(i); 

Class of service:

 public class MyService extends Service { static MediaPlayer mediaPlayer; static int pauseplay; static NotificationManager notificationManagerPlay; static CharSequence tickerText; static Notification notification4;//Notification variable(for song playing) TelephonyManager telephonyManager; PhoneStateListener listener; static Notification notification; static NotificationManager mNotificationManager; String songurl; String songname; @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return null; } @Override public void onCreate() { super.onCreate(); mediaPlayer = new MediaPlayer(); pauseplay = 1; MainMenu.serviceRunning = 1; telephonyManager = (TelephonyManager) getSystemService( Context.TELEPHONY_SERVICE); // Create a new PhoneStateListener listener = new PhoneStateListener() { @Override public void onCallStateChanged(int state, String incomingNumber) { switch (state) { case TelephonyManager.CALL_STATE_IDLE: break; case TelephonyManager.CALL_STATE_OFFHOOK: break; case TelephonyManager.CALL_STATE_RINGING: if (mediaPlayer.isPlaying() == true && mediaPlayer != null){ pauseSong(); } break; } } }; // Register the listener wit the telephony manager telephonyManager.listen(listener, PhoneStateListener.LISTEN_CALL_STATE); } public int onStartCommand(Intent intent, int flags, int startId) { super.onStartCommand(intent, flags, startId); if (intent != null) { Bundle bundle = intent.getExtras(); //Retrieve your data using the name songurl = bundle.getString("songURL"); Bundle bundle2 = intent.getExtras(); //Retrieve your data using the name songname = bundle2.getString("songNAME"); } Toast toast = Toast.makeText(getApplicationContext(), "Now Playing: " + songname, Toast.LENGTH_LONG); toast.show(); // configure the intent Intent playIntent = new Intent(MyService.this, SongList.class); final PendingIntent pendingIntent = PendingIntent.getActivity( MyService.this, 0, playIntent, 0); notification = new Notification(R.drawable.playicon, "Buffering...", System.currentTimeMillis()); notification.contentView = new RemoteViews(getPackageName(), R.layout.custom_notification2); notification.contentIntent = pendingIntent; if (SongList.bitmap != null) { notification.contentView.setImageViewBitmap(R.id.notifimage, SongList.bitmap); } else { notification.contentView.setImageViewResource(R.id.notifimage, R.drawable.icon); } notification.contentView .setTextViewText(R.id.notiftitle, "Now Playing"); notification.contentView.setTextViewText(R.id.notiftext, songname); notification.flags = notification.flags | Notification.FLAG_ONGOING_EVENT; mNotificationManager = (NotificationManager) getApplicationContext() .getSystemService(Context.NOTIFICATION_SERVICE); mNotificationManager.notify(4, notification); mediaPlayer.reset(); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); try { mediaPlayer.setDataSource(songurl); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalStateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } // register an error listener via MediaPlayer setOnErrorListener mediaPlayer.setOnErrorListener(new OnErrorListener() { @Override public boolean onError(MediaPlayer mp, int what, int extra) { Log.e("MEDIAPLAYER ERRORS", "what: " + what + " extra: " + extra); mediaPlayer.reset(); mNotificationManager.cancel(4); return false; } }); mediaPlayer.prepareAsync(); mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { mediaPlayer.start(); } }); mediaPlayer .setOnCompletionListener(new MediaPlayer.OnCompletionListener(){ public void onCompletion(MediaPlayer mp) { stopSelf(); } }); return START_STICKY; } @Override public void onDestroy() { MainMenu.serviceRunning = 0; mNotificationManager.cancel(4); } public static void pauseSong() { if (mediaPlayer.isPlaying() == true) { mediaPlayer.pause(); mNotificationManager.cancel(4); pauseplay = 0; } } public static void playSong() { if (pauseplay == 0) { mNotificationManager.notify(4, notification); mediaPlayer.start(); pauseplay = 1; } } } 
+6
android
Feb 22 '12 at 17:17
source share
2 answers

Why is the onStartCommand call called when my activity ends?

Either you call startService() when your “activity completes” (no matter what that means), or Android restarts your service for some reason due to using START_STICKY .

Personally for the music player, I claim that START_NOT_STICKY is the correct answer. If your service is stopped for any reason, the user must be responsible for starting it again.

+5
Feb 22 '12 at 19:38
source share

I know this answer may not be useful anymore, but I had the same problem, and after checking the documentation for this , return the code for onStartCommand I found that this would solve the problem.

EDIT: Your onStartCommand should look like this:

 public int onStartCommand(Intent intent, int flags, int startId) { //the same code //...... //then return the new code which I'm pointing to return START_REDELIVER_INTENT; } 

Here is what the documentation says about this return code:

public static final int START_REDELIVER_INTENT

Constant for returning from onStartCommand (Intent, int, int): if this service process is killed during its launch (after returning from onStartCommand (Intent, int, int)), it will be scheduled for reboot, and the last delivered Intent will be resent to him through onStartCommand (Intent, int, int).

Using this return code will cause the OS to resubmit the intent each time the onStartCommand method is called (for some reason it may call it).

+3
Aug 11 '15 at 1:09 on
source share



All Articles