Java 从广播接收器显示snackbar?

Java 从广播接收器显示snackbar?,java,android,Java,Android,所以我想做一个tasker插件,显示一个带有用户输入文本的snackbar。我遇到的问题是,我必须从广播接收器显示snackbar。我想我找到了一种方法,通过从活动类传递活动上下文,但是应用程序崩溃了。非常感谢您的帮助 以下是receiver类: public final class FireReceiver extends BroadcastReceiver { Maker maker; /** * @param context {@inheritDoc}.

所以我想做一个tasker插件,显示一个带有用户输入文本的snackbar。我遇到的问题是,我必须从广播接收器显示snackbar。我想我找到了一种方法,通过从活动类传递活动上下文,但是应用程序崩溃了。非常感谢您的帮助

以下是receiver类:

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。