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.
我不认为还有其他方法,你必须与你Activity或Fragment某种方式沟通.
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在应用再次可见时显示.
看看我的这个答案如何使用事件总线.
你可以通过经常发送广播LocalBroadcastManager在Service
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)