只要App正在使用,Android就会运行服务

时间:2015-01-17 07:39:36

标签: android service

我正在开发一款应用,我正在使用一种服务来播放背景音乐。 音乐只能在应用程序使用时播放,意味着在前台播放。 当我使用主页按钮或后退按钮离开应用程序时,音乐将停止(应用可能会保留在后台,但不可见 - >没有音乐)。 当我重新进入应用程序(使用主页按钮并切换回应用程序)时,音乐也将恢复。

我的服务:

public class MusicService extends Service {

MediaPlayer myPlayer;
private final IBinder localBinder = new LocalBinder();

public class LocalBinder extends Binder {

    MusicService getService() {
        return MusicService.this;
    }
}

@Override
public IBinder onBind(Intent intent) {
    return localBinder;
}

public boolean onUnbind(Intent intent) {
    return true;
    // called when the last Activity is unbound from this service
    // stop your timed operations here
}


@Override
public void onCreate() {
    Toast.makeText(this, "Music Service Created", Toast.LENGTH_LONG).show();
    myPlayer = MediaPlayer.create(this, R.raw.ost);
    myPlayer.setLooping(true); // Set looping
}

@Override
public void onDestroy() {
    Toast.makeText(this, "Music Service Stopped", Toast.LENGTH_LONG).show();
    myPlayer.stop();
}

@Override
public void onStart(Intent intent, int startid) {
    Toast.makeText(this, "Music Service Started", Toast.LENGTH_LONG).show();
    if(!myPlayer.isPlaying())
        myPlayer.start();
}

}

我还为所有活动使用父类。在那个父类中,我想在Methods onPause()和onStop()上停止服务:

ComponentName topActivity = taskInfo.get(0).topActivity; 
      if(!topActivity.getPackageName().equals(getApplicationContext().getPackageName())) {
          stopService(new Intent(this, MusicService.class));

我在启动器活动

上启动服务
startService(new Intent(this, MusicService.class));
        Intent intent = new Intent(this, MusicService.class);
        bindService(intent, this, 0);

现在我的问题:当我按下主页按钮时服务不会停止,当我离开应用程序时,服务不会停止(后退按钮)。 当我终止应用程序的任务时,服务会在几秒钟后重新启动,音乐将一直运行,直到我强制设置应用程序停止服务或卸载应用程序。

那么当应用程序处于不可见的背景或关闭时,如何完全关闭服务?我已经通过这里的几个主题,youtube视频,教程和尝试了很多。我也试过非服务解决方案,但我无法解决问题。

谢谢!

1 个答案:

答案 0 :(得分:0)

此处实现此功能的替代方法,但使用服务实现是标准方式

创建一个类ApplicationContextHolder,如下所示

public class ApplicationContextHolder extends Application {

    public static ApplicationContextHolder instance;

    public MediaPlayer mediaPlayerHome = new MediaPlayer();

    public static ApplicationContextHolder getAppInstance() {

        return instance;
    }

    public ApplicationContextHolder() {
        instance = this;
    }

    public void saveLastPlayingSongPath(String filePath) {
        songHolder = this.getSharedPreferences("songPath", 0);
        Editor editor = songHolder.edit();
        editor.putString("path", filePath);
        editor.commit();
    }


    public MediaPlayer getMediaPlayerForHome(Context ctx, int id) {
        return mediaPlayerHome = MediaPlayer.create(ctx, id);
    }

    public void stopMediaPlayerHome()

    {
        if (mediaPlayerHome != null && mediaPlayerHome.isPlaying()) {
            mediaPlayerHome.stop();
            mediaPlayerHome.reset();

        }
    }

    public void pauseMediaPlayerHome() {
        if (mediaPlayerHome != null && mediaPlayerHome.isPlaying()) {
            mediaPlayerHome.pause();

        }
    }

    public void startMediaPlayerHome() {
        if (mediaPlayerHome != null)
            mediaPlayerHome.start();
    }


}

现在,如何使用这个类 1)在您拥有媒体播放器的Activity / Fragment中创建此类的Object和MediaPlayer本地对象,或者您可以在MainActivity中创建它

private ApplicationContextHolder App;
private MediaPlayer mMediaPlayer;

2)在OnCreate中初始化对象

App = ApplicationContextHolder.getAppInstance();
mMediaPlayer = App.getMediaPlayerForHome(getActivity(),
                R.raw.new_introduction);

3)最后如果你想播放音乐播放器

App.startMediaPlayerHome();

4)并覆盖最后一个Activity的OnDestory(),如果按下后退按钮,应用程序将关闭

public void onDestroy() {

        try {
            App.stopMediaPlayerHome();

        } catch (IllegalStateException e) {
            e.printStackTrace();
        }
        super.onDestroy();
    }

这只是基本原理,但是你可以使用setLooping()/ Pause();以及如果你想要的所有方法

最后一步是在应用程序标记第一行的Manifest.xml中注册此类,如下所示

  <application
        android:name="yourpackagename.ApplicationContextHolder"

这是一个实时应用的工作代码,所以请试一试

对于主页按钮事件,您必须在每个活动中使用以下代码 编辑:此代码现在按Home键暂停媒体播放器,

@Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if ((keyCode == KeyEvent.KEYCODE_HOME)) {
            System.out.println("KEYCODE_HOME");
             try {
        App.pauseMediaPlayerHome();

    } catch (IllegalStateException e) {
        e.printStackTrace();
    }
            return true;
        }
    return false;
}

假设您想要在恢复应用程序时恢复音乐,则必须检查特定活动中的布尔值

if (mediaplayerPaused)
App.startMediaPlayerHome();