【问题标题】:Service restarted when Application Killed应用程序终止时服务重新启动
【发布时间】:2016-08-27 14:47:00
【问题描述】:

我已阅读此 SO 问题,但对我没有帮助...Android Background Service is restarting when application is killed。但这里提到的答案根本没有帮助我。请考虑这个

我想为背景音乐创建一个服务,并且即使我的应用程序关闭也想播放它。所以我写了以下代码...

package elsner.com.mediaplayer;

import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Handler;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.util.Log;

/**
 * Created by nteam on 6/2/16.
 */
public class BackGround extends Service {

    MediaPlayer mPlayer;


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


    @Override
    public void onCreate() {
        super.onCreate();

        Log.i("niral", "Service Create");


    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.i("niral", "Service Start");
        final Handler h = new Handler();
        final long delayInMilliseconds = (6000*10);

        new Thread(new Runnable() {

            @Override
            public void run() {
                mPlayer = MediaPlayer.create(getApplicationContext(), R.raw.aayat);
                mPlayer.start();

                h.postDelayed(new Runnable() {
                    public void run() {

                        mPlayer.stop();
                    }
                }, delayInMilliseconds);
            }
        }).start();



        return START_NOT_STICKY;
    }


}

在我从后台杀死应用程序之前一切正常。一旦我从后台杀死应用程序,我的服务就会重新启动,并且音乐文件将从顶部播放。

我通过在“最近使用的应用程序”中刷掉该应用程序来终止该应用程序。

请帮帮我。

【问题讨论】:

  • 如果你杀死一个应用程序它会被杀死,你可以用默认的音乐播放器试试这个,如果你杀死它也会停止
  • 您是否尝试在服务的 onStartCommand 方法中返回 START_STICKY?
  • @VivekMishra 不,我已经用音乐应用程序尝试过它......它的钢铁演奏
  • @udenfox 是的,我试过了,但没有运气
  • 你唯一能做的就是使用startForeground,但它不会让你的服务“永生”

标签: android service media-player


【解决方案1】:

这是我在这里的回答的重新发布:https://stackoverflow.com/a/39169603/6761960。为了方便,我会重新发布。

应用程序和服务存在于同一个进程中,这意味着当应用程序被终止时,您的服务也会被终止。更改 onStartCommand 的返回值不会影响此过程。它只是告诉服务在您告诉它时启动/停止,或者在它完成所需的操作时启动/停止。

要更改服务以使其被单独终止并假设它是已启动的服务而不是由于使用 onStartCommand 而绑定的服务,请在该服务的清单中指定进程名称。

来自Process and Threads Developer Guide

每种组件元素的清单条目—<activity>, <service>, <receiver>, and <provider>— 支持一个 android:process 属性,可以指定一个 该组件应在其中运行的进程。你可以设置 这个 属性,以便每个组件在自己的进程中运行左右 一些组件共享一个进程,而 其他人没有。您还可以设置 android:process 以便 不同应用程序的组件运行在同一个 进程——前提是应用程序共享相同的 Linux 用户 ID 并使用相同的证书进行签名。

Android 可能会决定关闭某个进程 点,当内存不足且其他需要时 更直接地为用户服务的进程。 在进程中运行的应用程序组件 杀死因此被摧毁。一个进程被启动 当他们有工作要做时,再次为这些组件重新工作。

来自<service> in Manifest File

机器人:进程

要运行服务的进程的名称。 通常,应用程序的所有组件都在默认进程中运行 为应用程序创建。它与应用程序具有相同的名称 包裹。元素的 process 属性可以设置一个 所有组件的默认值不同。但是组件可以覆盖 默认具有自己的进程属性,允许您传播您的 跨多个进程的应用程序。

如果分配给此的名称 属性以冒号 (':') 开头,这是一个新进程,对 应用程序,在需要时创建,服务在其中运行 过程。如果进程名称以小写字符开头,则 服务将在该名称的全局进程中运行,前提是它 有权这样做。这允许不同的组件 应用程序共享进程,减少资源使用。

使用此方法,您的服务和您的应用程序将有两个不同的进程,导致它们因不同的原因被杀死。 但是,这并不能保证它仍然不会被杀死。您应该设计、预期并愿意让您的 Service 被杀死。

此外,由于您的应用是音乐应用,并且您的服务的使用是用户积极参与的事情,因此创建服务是使用 startForeground 为其赋予前台优先级的一个可接受的理由。但是,同样,这并不意味着它永远不会被杀死。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-08
    • 1970-01-01
    • 1970-01-01
    • 2017-01-19
    • 1970-01-01
    相关资源
    最近更新 更多