Android 上的持久服务

Lan*_*nbo 3 service notifications android

我正在尝试编写一个带有MediaPlayer. 我有不同的活动访问它,所以我认为最好仔细研究服务。

到目前为止它工作正常,我还添加了对 的调用startForeground,如此处所述。通知出现。

但是,当我现在按下设备上的主页或后退按钮时,该服务将停止并被onDestroy调用,并且通知图标消失。当我返回时,服务似乎重新绑定得很好。

我停止了音乐播放onDestroy,所以它当然停止了。但我希望即使用户在使用另一个应用程序时也能保持通知和服务处于活动状态。

编辑:我希望这是相关部分:

public class MediaPlayerService extends Service {
    private static class PlayerMessageHandler extends Handler {
        private final MediaPlayerService owner;

        public PlayerMessageHandler(MediaPlayerService owner) {
            this.owner = owner;
        }

        @Override
        public void handleMessage(Message msg) {
            // Handle
        }
    }

    private static final int NOTIFICATION_ID = 13138;

    private final Messenger messenger = new Messenger(new PlayerMessageHandler(
            this));
    private MediaPlayer player;
    private Notification notification;

    @Override
    public IBinder onBind(Intent intent) {
        startNotification();
        return messenger.getBinder();
    }

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

        Log.v(TAG, "Media player service created.");

        player = new AudiobookPlayer(this);
        new Thread(seekerUpdate).start();
        isRunning = true;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.v(TAG, "Received start id " + startId + ": " + intent);
        return START_STICKY;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.v(TAG, "Media player service destroyed.");

        if (player.isPlaying()) {
            player.pause();
        }
        sendMessageToUI(MSG_PLAYER_HAS_PAUSED);

        isRunning = false;
    }

    private void sendMessageToUI(int msg) {
        Log.v(TAG, "Sending " + msg);

        sendMessage(Message.obtain(null, msg));
    }

    private void sendMessage(final Message message) {
        // Send
    }

    private void startNotification() {
        NotificationCompat.Builder builder = new NotificationCompat.Builder(
                this);
        builder.setSmallIcon(R.drawable.notification);
        builder.setContentTitle(getString(R.string.app_name));
        notification = builder.build();

        startForeground(NOTIFICATION_ID, notification);
    }
}
Run Code Online (Sandbox Code Playgroud)

EDIT2:活动中的方法,取自此处

    @Override
protected void onStart() {
    super.onStart();
    // Bind to the service
    bindService(new Intent(this, MediaPlayerService.class),
            playerServiceConnection, Context.BIND_AUTO_CREATE);
}

@Override
protected void onStop() {
    super.onStop();
    // Unbind from the service
    if (bound) {
        unbindService(playerServiceConnection);
        bound = false;
    }
}
Run Code Online (Sandbox Code Playgroud)

mik*_*łak 5

你应该让你的服务具有粘性。事实上,这就是本教程使用的内容:

public class HelloService extends Service {
...

 @Override
  public int onStartCommand(Intent intent, int flags, int startId) {
      ...

      // If we get killed, after returning from here, restart
      return START_STICKY;
  }
...
}
Run Code Online (Sandbox Code Playgroud)

编辑:从此后发生的讨论来看,事实证明我的怀疑是正确的,雨果提供了准确的诊断。我想你现在需要builder.setOngoing(true);添加startNotification()。