在服务中显示Snackbar

Nou*_*vay 9 service android android-layout android-snackbar

SnackBar从里面显示一个时Activity,我有rootView可用的.但我需要在SnackBar里面展示一个Service,我没有View可用的.我怎么能做到这一点?

作为背景故事:活动启动服务来执行任务.在Service需要显示SnackBar根据情况.我不想为此纠结Service.那么我怎么能做到这一点呢?通常我可以显示一个Toast,但我需要用户能够阅读该消息并确认.

Mau*_*ker 14

Snackbar需要View显示的需求,所以如果你想在你的应用程序上显示零食栏,这取决于你的状态,Service你必须将它绑定到你的Activity或通过广播消息LocalBroadcastManager并在你的网站上显示一条消息View.

我不认为还有其他方法,你必须与你ActivityFragment某种方式沟通.

Snackbars不像只需要上下文的Toasts,所以如果你想从你的应用程序中显示它,我相信你不能使用Android提供的类.

设计指南来看:

放置

Snackbars出现在屏幕上的大多数元素上方,并且它们与浮动操作按钮的高度相等.但是,它们的高度低于对话框,底部工作表和导航抽屉.

它并不明确,但您可以得出结论,它只显示在您的应用视图中.所以,再一次,你必须以某种方式与你的可见视图进行沟通.


广播消息的片段:

发件人(在您的服务上)

private void doSendBroadcast(String message) {
    Intent it = new Intent("EVENT_SNACKBAR");

    if (!TextUtils.isEmpty(message))
        it.putExtra(EXTRA_RETURN_MESSAGE,message);

    LocalBroadcastManager.getInstance(mContext).sendBroadcast(it);
}
Run Code Online (Sandbox Code Playgroud)

接收者(在你的活动上)

private BroadcastReceiver mMessageReceiver = null;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // Other stuff.

    mMessageReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            // Do something
        }
    };
}

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

    LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver, new IntentFilter("EVENT_SNACKBAR"));
}
Run Code Online (Sandbox Code Playgroud)

更多关于绑定服务的信息.

而关于LocalBroadcastManager 这里在这个问题上.

更新:您还可以使用EventBus可见视图进行通信,因为它适用于发布者/订阅者时尚.您甚至可以利用Sticky事件的概念来确保Snackbar在应用再次可见时显示.

看看我的这个答案如何使用事件总线.


Cor*_*ton 5

你可以通过经常发送广播LocalBroadcastManagerService

LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent("SERVICE_DID_SOMETHING"));
Run Code Online (Sandbox Code Playgroud)

然后在Activity使用BroadcastReceiver来显示Snackbar

private final ServiceReceiver _serviceReceiver = new ServiceReceiver();

@Override
protected void onResume() {
    super.onResume();

    final IntentFilter intentFilter = new IntentFilter();
    intentFilter.addAction("SERVICE_DID_SOMETHING");

    LocalBroadcastManager.getInstance(this).registerReceiver(_serviceReceiver, intentFilter);
}

@Override
protected void onPause() {
    super.onPause();

    try {
        LocalBroadcastManager.getInstance(this).unregisterReceiver(_serviceReceiver);
    } catch (Exception ex) {
        Log.e(TAG, "Error unregistering ServiceReceiver", ex);
    }
}

// region ServiceReceiver
private class ServiceReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO: Show your Snackbar here...
    }
}
// endregion
Run Code Online (Sandbox Code Playgroud)

Intent如果需要,您可以使用发送来传递其他数据,然后将其拉出BroadcastReceiver.onReceive(Context context, Intent intent)