何时停止音乐播放器中的音乐

时间:2018-09-07 16:39:25

标签: android media android-lifecycle activity-lifecycle exoplayer2.x

我正在用exoplayer构建音乐播放器。我正在使用单独的服务来播放音乐,但问题是,即使我通过浏览最近的曲目来关闭主要活动,音乐仍会继续播放。我试图通过在调用onDestroy()时停止服务来解决此问题。但是,当按下后退按钮时,这也会停止音乐服务。我检查了Musixmatch中的两种情况,如果您从最近关闭应用程序,它不会停止,但是当您按应用程序中的“后退”按钮时,它不会停止,即使我看到再次启动该应用程序时又创建了主要活动。那么如何在我的应用程序中实现相同的目标?

2 个答案:

答案 0 :(得分:0)

我有一个示例android声音项目-当我转到“最近”并“全部关闭”时,我的音频停止播放。并使用goBack-您可以暂停,但如果不暂停,它将继续播放。

#include <stdio.h>

/* read the next byte from the C source file, handing escaped newlines */
int getcpp(FILE *fp) {
    int ch;
    while ((ch = getc(fp)) == '\\') {
        if ((ch = getc(fp)) != '\n') {
            ungetc(ch, fp);
            return '\\';
        }
    }
    return ch;
}

/* read and write character and string constants */
int skipstr(int cch, FILE *fp, FILE *ft) {
    int ch;
    putc(cch, ft);
    while ((ch = getcpp(fp)) != EOF) {
        putc(ch, ft);
        if (ch == cch)
            return 0;
        if (ch == '\\') {
            if ((ch = getcpp(fp)) == EOF)
                return EOF;
            putc(ch, ft);
        }
    }
    return EOF;
}

int main(int argc, char *argv[]) {
    FILE *fp, *ft;
    int ch;

    if (argc < 3) {
        fprintf(stderr, "Missing arguments. Need input and output filenames\n");
        return 1;
    }
    if ((fp = fopen(argv[1], "r")) == NULL) {
        fprintf(stderr, "Cannot open input file %s\n", argv[1]);
        return 1;
    }
    if ((ft = fopen(argv[2], "w")) == NULL) {
        fprintf(stderr, "Cannot open output file %s\n", argv[2]);
        return 1;
    }
    while ((ch = getcpp(fp)) != EOF) {
        if (ch == '\'' || ch == '"') {
            if (skipstr(ch, fp, ft)) {
                fprintf(stderr, "unterminated string or character constant\n");
                break;
            }
            continue;
        }
        if (ch == '/') {
            if ((ch = getcpp(fp)) == '*') {
                /* multi-line comment */
                int lastc = 0;
                while ((ch = getcpp(fp)) != EOF) {
                    if (ch == '/' && lastc == '*') {
                        break;
                    }
                    lastc = ch;
                }
                if (ch == EOF) {
                    fprintf(stderr, "unterminated comment\n");
                    break;
                }
                ch = ' ';
            } else if (ch == '/') {
                /* single-line comment */
                while ((ch = getcpp(fp)) != EOF && ch != '\n')
                    continue;
                if (ch == EOF)
                    break;
            } else {
                putc('/', ft);
            }
        }
        putc(ch, ft);
    }
    fclose(fp);
    fclose(ft);
    return 0;
}

答案 1 :(得分:0)

因此,当任务从最新消息中删除时,我们需要停止服务。为此,您可以看看"stop service when remove app through recent app"的解决方案。

基本上,它建议在调用public void onTaskRemoved(Intent rootIntent)时停止服务。

1)。在清单中,在定义服务的位置添加stopWithTask属性:

<service
    android:enabled="true"
    android:name=".YourService"
    android:exported="false"
    android:stopWithTask="true" />

2)。如果上述方法无效,请反向操作

<service
    android:enabled="true"
    android:name=".MyService"
    android:exported="false"
    android:stopWithTask="false" />  //change to false

因此将调用服务的onTaskRemoved方法。 (请记住,如果将stopWithTask设置为true,则不会调用它。)

public class YourService extends Service {

    @Override
    public void onStartService() {
        //your code
    }

    @Override
    public void onTaskRemoved(Intent rootIntent) {
        System.out.println("onTaskRemoved called");
        super.onTaskRemoved(rootIntent);
        //do something you want
        //stop service
        this.stopSelf();
    }
}