Java 从广播接收器显示snackbar?
所以我想做一个tasker插件,显示一个带有用户输入文本的snackbar。我遇到的问题是,我必须从广播接收器显示snackbar。我想我找到了一种方法,通过从活动类传递活动上下文,但是应用程序崩溃了。非常感谢您的帮助 以下是receiver类:Java 从广播接收器显示snackbar?,java,android,Java,Android,所以我想做一个tasker插件,显示一个带有用户输入文本的snackbar。我遇到的问题是,我必须从广播接收器显示snackbar。我想我找到了一种方法,通过从活动类传递活动上下文,但是应用程序崩溃了。非常感谢您的帮助 以下是receiver类: public final class FireReceiver extends BroadcastReceiver { Maker maker; /** * @param context {@inheritDoc}.
public final class FireReceiver extends BroadcastReceiver {
Maker maker;
/**
* @param context {@inheritDoc}.
* @param intent the incoming {@link com.twofortyfouram.locale.Intent#ACTION_FIRE_SETTING} Intent. This
* should contain the {@link com.twofortyfouram.locale.Intent#EXTRA_BUNDLE} that was saved by
* {@link SnackbarActivity} and later broadcast by Locale.
*/
@Override
public void onReceive(final Context context, final Intent intent) {
/*
* Always be strict on input parameters! A malicious third-party app could send a malformed Intent.
*/
if (!com.twofortyfouram.locale.Intent.ACTION_FIRE_SETTING.equals(intent.getAction())) {
if (Constants.IS_LOGGABLE)
Log.e(Constants.LOG_TAG, String.format(Locale.US, "Received unexpected Intent action %s", intent.getAction())); //$NON-NLS-1$
return;
}
BundleScrubber.scrub(intent);
final Bundle bundle = intent.getBundleExtra(com.twofortyfouram.locale.Intent.EXTRA_BUNDLE);
BundleScrubber.scrub(bundle);
if (PluginBundleManager.isBundleValid(bundle)) {
final String message = bundle.getString(PluginBundleManager.BUNDLE_EXTRA_STRING_MESSAGE);
final String button = bundle.getString(PluginBundleManager.BUNDLE_EXTRA_STRING_BUTTON);
final String mode = bundle.getString(PluginBundleManager.BUNDLE_EXTRA_STRING_MODE);
if (maker == null) {
maker = new Maker();
}
//maker.createSnackbar(message, button, mode);
Snackbar.make(maker.getView(), message, Snackbar.LENGTH_SHORT).setAction(button, new View.OnClickListener() {
@Override
public void onClick(View v) {
}
}).show();
}
}
}
以下是Maker类:
public class Maker extends Activity {
public void createSnackbar(String Main, String Button, String Mode) {
if (Mode.equals("Short")) {
Snackbar.make(findViewById(android.R.id.content), Main, Snackbar.LENGTH_SHORT).setAction(Button, new View.OnClickListener() {
@Override
public void onClick(View v) {
}
}).show();
} else {
Snackbar.make(findViewById(android.R.id.content), Main, Snackbar.LENGTH_LONG).setAction(Button, new View.OnClickListener() {
@Override
public void onClick(View v) {
}
}).show();
}
}
public View getView() {
View view = findViewById(android.R.id.content);
return view;
}
}
我想我找到了一种方法,通过从活动类传递活动上下文,但是应用程序崩溃了
您不能通过构造函数自己创建活动的工作实例
我遇到的问题是,我必须从广播接收器显示snackbar
那真的不可能。欢迎您开始一项活动(可能使用不占用整个屏幕的对话主题)。或者,您可以显示
烤面包片。或者,您可以发出通知
。这些是您在广播接收器
中的主要UI选项。Snackbar
设计用于活动,而不是BroadcastReceiver
ok,dang。我真的希望这是可能的。谢谢你的回答。@JoeSmith我不得不恭敬地反对@Commonware。如果上下文是活动的实例,这是可能的-我们可以使用android.R.id.content
检索活动的根视图,并将其传递给SnackBar
@Abhijit:问题是关于创建Tasker插件FireReceiver
必须在清单中注册。使用onReceive()
调用FireReceiver
时,应用程序进程中可能没有任何活动,因为该进程可能是在几毫秒前创建的。即使有活动,它也可能不在前台,因此让该活动显示一个Snackbar
对用户来说是不可见的。@commonware感谢您的澄清。我站起来纠正了嘿,伙计们,我只是通过展示一个看不见的活动,然后像那样展示snackbar来结束这一切。我现在唯一的问题是允许用户点击下面的屏幕和snackbar。