【问题标题】:Sync "pause/resume" button's image with the actual state将“暂停/恢复”按钮的图像与实际状态同步
【发布时间】:2016-09-12 13:54:23
【问题描述】:

在我的 Android 应用中,有一个服务执行长时间运行的任务(例如播放音乐),它可以处于以下两种状态之一:运行或暂停。有一个“暂停/恢复”图像按钮可以暂停/恢复任务。由于其他原因(不是来自 UI),任务也可能被暂停。根据任务的当前状态(运行或暂停),按钮的外观应有所不同。所以我需要将按钮图像与任务的实际状态同步。

现在我想出了以下解决方案: 我的服务有静态的 pauseresume 方法,它们像这样向自己发送意图:

public static void pause(Context context) {
    Intent intent = new Intent(context, MyService.class);
    intent.putExtra("PAUSE", true);
    context.startService(intent);
}

public static void resume(Context context) {
    Intent intent = new Intent(context, MyService.class);
    intent.putExtra("RESUME", true);
    context.startService(intent);
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    if (intent.getBooleanExtra("PAUSE", false)) {
        doPause();
    } else if (intent.getBooleanExtra("RESUME", false)) {
        doResume();
    }
    return START_STICKY;
}

由于doPause()doResume()也可以从其他地方调用,所以在调用MyService.pause()/MyService.resume()时不能只给ImageButton设置图片:按钮图片和任务的实际状态可能变得不同步。相反,我使用 LocalBroadcastManager 在应该更新按钮时通知活动:

public void doPause() {
    paused = true;

    ... // Do some stuff to pause the service

    // Notify about state change
    Intent intent = new Intent("SERIVCE_STATE_CHANGED");
    intent.putExtra("PAUSED", true);
    LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
}

doResume() 的代码类似。 所以,我的活动注册了接收者并将图像设置在onReceive()

该解决方案似乎有效。但我的问题是是否有更好/更简单的方法来实现相同的目标?有什么最佳做法吗?

【问题讨论】:

    标签: android service localbroadcastmanager


    【解决方案1】:

    我不认为您的解决方案不好。但是,可以说更好的另一种方法是使用 Android 数据绑定。

    这样做的方式是,创建一个表示服务状态的模型对象。例如。 Player.isPlaying,代表服务状态。然后在服务中设置 isPlaying 状态。

    然后在您的布局中,您将使用数据绑定将该模型对象 isPlaying 状态链接到 UI,但是您想设置它,例如:

    android:background="@{player.isPlaying ? @drawable/pause : @drawable/play}"
    

    我认为这可能是一个更好的解决方案的原因是,它将 UI 状态与服务直接 1:1 联系起来。从概念上讲,我认为广播可以来自多个来源。不过,我认为只有一个广播源没有问题,这就是为什么我不认为您当前的解决方案很糟糕。

    您可以在此处查看有关 Google I/O 2016 数据绑定的详细视频:https://www.youtube.com/watch?v=DAmMN7m3wLU

    【讨论】:

    • 谢谢,我不知道这种可能性,我一定会尝试的。代码好像少了很多!
    • 我认为这是一个非常酷的功能。它允许将许多链接状态/模型的样板代码从代码移动到 xml 中,甚至还可以链接动作以避免必须创建所有匿名的内部 OnClickListener 类。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-05
    • 1970-01-01
    • 2020-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多