broadcastreceiver - 从广播接收器访问主要事件方法/组件

标签 broadcastreceiver android-4.4-kitkat

基本上,我希望我的应用程序在单击耳机两次时在后台执行某些操作。 仅当我需要来自调试器的信息时,此代码才有效,我想做的是从主事件中调用方法或单击主事件中的按钮。

举例来说: 一旦我从耳机中听到双击,请单击主要事件中的按钮。

关于如何做到这一点有什么建议吗?

PD
这是我在 Android 上的第一个应用程序,所以我想要一些关于它的反馈。
我的手机是 Android 4.4.2,以防有人告诉我为什么我没有使用 MediaSession 或其他任何东西。 (我知道 registerMediaButtonEventReceiver 已被弃用)


接收器类别:

public class MediaReceiver extends BroadcastReceiver {

    private static int d = 0;

    public MediaReceiver() {
    }

    @Override
    public void onReceive(final Context context, Intent intent) {
        String intentAction = intent.getAction();
        if (!Intent.ACTION_MEDIA_BUTTON.equals(intentAction))
            return;
        KeyEvent event = (KeyEvent) intent
                .getParcelableExtra(Intent.EXTRA_KEY_EVENT);
        int keycode = event.getKeyCode();
        int action = event.getAction();

        switch (keycode) {
            case KeyEvent.KEYCODE_HEADSETHOOK:
                if (action == KeyEvent.ACTION_DOWN) {
                    d++;

                    Handler handler = new Handler();
                    Runnable r = new Runnable() {
                        @Override
                        public void run() {
                            if (d == 1) {
                                Log.i("Info", "single click!");
                            }
                            // double click 
                            if (d == 2) {
                                Log.i("Info", "double click!");

                                //handleClick();  this method is inside MainActivity
                            }
                            d = 0;
                        }
                    };
                    if (d == 1) {
                        handler.postDelayed(r, 400);
                    }
                }
                break;
        }
        abortBroadcast();
    }
}


onCreate MainActivity 类:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        txtText = (TextView) findViewById(R.id.status);
        btnStart = (ImageButton) findViewById(R.id.startButton);
        focus = (Chronometer) findViewById(R.id.chronometer);

        btnStart.setBackgroundResource(R.drawable.start_button);
        focus.setFormat("%s");

        manager = (PowerManager) getSystemService(Context.POWER_SERVICE);
        wl = manager.newWakeLock(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK, "Proximity screen");

        mAudioManager =  (AudioManager) getSystemService(Context.AUDIO_SERVICE);
        mReceiverComponent = new ComponentName(this, MediaReceiver.class);

        FillTaskScrollList();

        btnStart.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (headsetState == DISABLED_HEADSET_BUTTON) {
                    headsetState = ENABLED_HEADSET_BUTTON;
                    wl.acquire();
                    ...
                    focus.stop();
                    focus.setBase(SystemClock.elapsedRealtime());
                    btnStart.setBackgroundResource(R.drawable.stop_button);
                    mAudioManager.registerMediaButtonEventReceiver(mReceiverComponent);
                } else {
                    headsetState = DISABLED_HEADSET_BUTTON;
                    wl.release();
                    ...
                    focus.stop();
                    btnStart.setBackgroundResource(R.drawable.start_button);
                }
            }
        });
    }

最佳答案

我已经成功解决了。

您必须使用另一个BroadcastReceiver(在您需要的类内)来捕获来自另一个类中的BroadcastReceiver的消息。就我而言,是 MediaReceiver,因此我必须添加此行以将消息发送到我想要使用的事件。


MediaReceive onReceive()
您需要创建一个新的意图,我将其命名为“android.intent.MAIN”,并且您必须将消息添加到该意图(您可以使用 putExtra[s] 方法来做到这一点)。

public void onReceive(final Context context, Intent intent) {
    ...
    Intent in = new Intent("android.intent.MAIN")
    in.putExtra("get_msg", "voice_rec");

    context.sendBroadcast(in);
    ...
}


主要事件

我声明了一个新的 BroadcastReceiver 并添加了 onResume/onPause 方法。 使用与在 MediaReceive 类中创建的 Intent 相同的名称创建了一个 IntentFilter。这样做使您能够通过 BroadcastReceiver 类和事件发送消息。代码的其余部分是您想要对该消息执行的操作,调用方法或更新变量。

private BroadcastReceiver mIntentReceiver;

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

    IntentFilter intentFilter = new IntentFilter("android.intent.MAIN");
    mIntentReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String msg = intent.getStringExtra("get_msg");

            }
        }
    };
    this.registerReceiver(mIntentReceiver, intentFilter);
}

@Override
protected void onPause() {
    super.onPause();
    this.unregisterReceiver(this.mIntentReceiver);
}

不要忘记注册/取消注册每个 BroadcastReceiver。

我希望它对任何像我一样遇到问题的人有所帮助。 欢迎发表评论。

来源:https://sites.google.com/site/zainozzaini/android/receive-sms-using-android-broadcastreceiver-inside-an-activity

关于broadcastreceiver - 从广播接收器访问主要事件方法/组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31214855/

相关文章:

android - 使用 setGroup() 的 Kitkat(API 19)中的堆栈通知不起作用

android - 媒体播放器 : Should have subtitle controller already set: KitKat

android - Toasts 在 4.4.2 中停止工作

android - 如何在android中使用广播接收器获取应用程序的包名称?

android - Android 上无法接收短信(进程错误)

Android:更改 list 中的 BroadcastReceiver 属性是否可以阻止其在用户更新应用程序时接收广播?

android-5.0-lollipop - Android BLE 特性读/写在 Lollipop 中失败,但在 Kitkat 中工作

java - 如何在广播接收器上使用 if else 语句?

android - 广播接收器中接收调用的优先级

android - 在 Android 4.4 中启用 TLS 1.2