3

が付属するサービスを作成しようとしてい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);
    }
}

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;
    }
}
4

2 に答える 2

4

サービスをstickyにする必要があります。実際、これはチュートリアルで使用するものです。

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;
  }
...
}

編集:その後の議論から、私の疑いが正しかったことが判明し、ヒューゴは的確な診断を提供しました. builder.setOngoing(true);を追加する必要があると思いますstartNotification()

于 2013-08-16T12:09:42.983 に答える
4

http://developer.android.com/guide/components/services.html から抽出

アプリケーション コンポーネントが bindService() を呼び出してサービスにバインドすると、サービスは「バインド」されます。バインドされたサービスは、コンポーネントがサービスとやり取りしたり、要求を送信したり、結果を取得したり、プロセス間通信 (IPC) を使用してプロセス全体でそれらを実行したりできるようにするクライアント サーバー インターフェイスを提供します。バインドされたサービスは、別のアプリケーション コンポーネントがバインドされている間だけ実行されます。一度に複数のコンポーネントをサービスにバインドできますが、すべてのコンポーネントがバインド解除されると、サービスは破棄されます。

でアクティビティをバインドし、でバインドonStartを解除していonStopます。Home または Back を押すと、最後のフォアグラウンド アクティビティが を呼び出しonStop、サービスから最後のアクティビティのバインドを解除して強制終了する場合があります。

別の解決策として、 が呼び出されるstartServiceように呼び出してからonStartCommand、 を呼び出しbindServiceてアクティビティをバインドします。

于 2013-08-16T14:56:30.263 に答える