Android上的持久服务

Android上的持久服务,第1张

概述我正在尝试编写一个MediaPlayer附带的服务.我有不同的活动访问它,所以我认为最好仔细阅读服务.它到目前为止工作正常,我还添加了对startForeground的调用,如here所述.通知显示.但是当我现在按下设备上的主页或后退按钮时,服务停止并调用onDestroy,通知图标消失.当我回来时,服务似

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

它到目前为止工作正常,我还添加了对startForeground的调用,如here所述.通知显示.

但是当我现在按下设备上的主页或后退按钮时,服务停止并调用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:来自活动的方法,取自here

    @OverrIDeprotected voID onStart() {    super.onStart();    // Bind to the service    bindService(new Intent(this, MediaPlayerService.class),            playerServiceConnection, Context.BIND_auto_CREATE);}@OverrIDeprotected voID onStop() {    super.onStop();    // Unbind from the service    if (bound) {        unbindService(playerServiceConnection);        bound = false;    }}

解决方法:

你应该让你的服务sticky.事实上,这就是tutorial uses:

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()中.

总结

以上是内存溢出为你收集整理的Android上的持久服务全部内容,希望文章能够帮你解决Android上的持久服务所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1114708.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-29
下一篇 2022-05-29

发表评论

登录后才能评论

评论列表(0条)

保存