title: How to stop or pause Pandora and Spotify
body: <p>I have an app that has a feature to launch an app, Pandora station, or shortcut.  That all works fine.  Later I want to stop the app I started.  This works for most things except Pandora and Spotify don't always close.  Sometimes they do but not always.  It seems to be related to the current UI state.  For instance, it works fine when I have Pandora showing or the home screen showing.  When Home Dock or Car Mode is active it does not work.  You can see all my source code here: <a href="http://code.google.com/p/a2dpvolume/" rel="nofollow">http://code.google.com/p/a2dpvolume/</a>
  service.java is the file that has this functionality.</p>
  
  <p>Here is the part of that code that tries to stop the music from playing and then stop the app.</p>
  
  <pre><code>if (bt2.hasIntent()) {
          // if music is playing, pause it
          if (am2.isMusicActive()) {
              // first pause the music so it removes the notify icon
              Intent i = new Intent("com.android.music.musicservicecommand");
              i.putExtra("command", "pause");
              sendBroadcast(i);
              // for more stubborn players, try this too...
              Intent downIntent2 = new Intent(Intent.ACTION_MEDIA_BUTTON, null);
              KeyEvent downEvent2 = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_STOP);
              downIntent2.putExtra(Intent.EXTRA_KEY_EVENT, downEvent2);
              sendOrderedBroadcast(downIntent2, null);
          }
  
          // if we opened a package for this device, try to close it now
          if (bt2.getPname().length() &gt; 3 &amp;&amp; bt2.isAppkill()) {
              // also open the home screen to make music app revert to
              // background
              Intent startMain = new Intent(Intent.ACTION_MAIN);
              startMain.addCategory(Intent.CATEGORY_HOME);
              startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
              startActivity(startMain);
              // now we can kill the app is asked to
  
              final String kpackage = bt2.getPname();
              CountDownTimer killTimer = new CountDownTimer(6000, 3000) {
                  @Override
                  public void onFinish() {
                      try {
                          stopApp(kpackage);
                      } catch (Exception e) {
                          e.printStackTrace();
                          Log.e(LOG_TAG, "Error " + e.getMessage());
                      }
                  }
  
                  @Override
                  public void onTick(long arg0) {
  
                      if (am2.isMusicActive()) {
  
                          // for more stubborn players, try this too...
                          Intent downIntent2 = new Intent(Intent.ACTION_MEDIA_BUTTON, null);
                          KeyEvent downEvent2 = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_STOP);
                          downIntent2.putExtra(Intent.EXTRA_KEY_EVENT, downEvent2);
                          sendOrderedBroadcast(downIntent2, null);
                      }
  
                      try {
                          stopApp(kpackage);
                      } catch (Exception e) {
                          e.printStackTrace();
                          Log.e(LOG_TAG, "Error " + e.getMessage());
                      }
                  }
              };
              killTimer.start();
  
          }
      }
  </code></pre>
  
  <p>Here is the function stopApp().</p>
  
  <pre><code>protected void stopApp(String packageName) {
      Intent mIntent = getPackageManager().getLaunchIntentForPackage(
              packageName);
      if (mIntent != null) {
          try {
  
              ActivityManager act1 = (ActivityManager) this
                      .getSystemService(ACTIVITY_SERVICE);
              // act1.restartPackage(packageName);
              act1.killBackgroundProcesses(packageName);
              List&lt;ActivityManager.RunningAppProcessInfo&gt; processes;
              processes = act1.getRunningAppProcesses();
              for (ActivityManager.RunningAppProcessInfo info : processes) {
                  for (int i = 0; i &lt; info.pkgList.length; i++) {
                      if (info.pkgList[i].contains(packageName)) {
                          android.os.Process.killProcess(info.pid);
                      }
                  }
              }
          } catch (ActivityNotFoundException err) {
              err.printStackTrace();
              Toast t = Toast.makeText(getApplicationContext(),
                      R.string.app_not_found, Toast.LENGTH_SHORT);
              if (notify)
                  t.show();
          }
  
      }
  }
  </code></pre>
  
  <p>Has someone else run into this problem?  How can I reliably stop the launched app?  I need to first get it to pause and put it in the background.  That is the problem I am having.  It works for most situations but not all.  Some cases Pandora and Spotify will not respond to the key event being sent and they just keep playing.  This keeps the notify icon active and makes the app a foreground activity so I can't stop it.  </p>