应用程序被杀时重新启动服务

时间:2016-02-06 11:33:41

标签: android service media-player

我已经阅读了这个问题,但它没有帮助我...... 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;
    }


}

一切正常,直到我从后台杀了应用程序。一旦我从后台杀了应用程序,我的服务就会重新启动,音乐文件将从顶部播放。

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

请帮帮我。

1 个答案:

答案 0 :(得分: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属性可以设置a   所有组件的默认值不同。但组件可以覆盖   默认具有自己的流程属性,允许您传播您的   跨多个流程的应用程序

     

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

使用此方法,您的服务和您的应用将有两个不同的过程,导致它们因各种原因被杀死。 然而,这并不能保证它仍然不会被杀死。你应该设计,期待并且愿意让你的服务被杀死。

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