从广播接收器访问 main activity method/components
Access main activity method/components from broadcast receiver
基本上,当耳机被点击两次时,我希望我的应用程序在后台执行某些操作。
此代码仅在我需要来自调试器的信息时才有效,我要做的是从 main activity 调用方法或单击 main activity.
的按钮
举例:
一旦我从耳机中捕捉到双击,单击主 activity.
中的按钮
关于如何做到这一点有什么建议吗?
P.D.
这是我在 android 上的第一个应用程序,所以我想得到一些反馈。
我的 phone 是 Android 4.4.2,以防有人告诉我为什么我没有使用 MediaSession 或其他任何东西。 (我知道 registerMediaButtonEventReceiver 已被弃用)
接收者class:
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 class:
@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(在您需要的 class 中)来捕获来自 BroadcastReceiver 的消息另一个 class。在我的例子中是 MediaReceiver 所以我不得不添加这行来发送消息到我想使用的 activity。
MediaReceive onReceive()
您需要创建一个新的 Intent,我将其命名为 "android.intent.MAIN",并且您必须将消息添加到该 Intent(您可以使用 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);
...
}
MainActivity
我声明了一个新的 BroadcastReceiver 并添加了 onResume/onPause 方法。
使用与在 MediaReceive class 中创建的 Intent 相同的名称创建了一个 IntentFilter。这样做使您能够通过 BroadcastReceiver classes 和活动发送消息。其余代码是您要对该消息执行的操作,调用方法或更新变量。
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);
}
不要忘记 register/unregister 每个 BroadcastReceiver。
我希望它对遇到像我一样问题的任何人有所帮助。
欢迎发表评论。
基本上,当耳机被点击两次时,我希望我的应用程序在后台执行某些操作。 此代码仅在我需要来自调试器的信息时才有效,我要做的是从 main activity 调用方法或单击 main activity.
的按钮举例: 一旦我从耳机中捕捉到双击,单击主 activity.
中的按钮关于如何做到这一点有什么建议吗?
P.D.
这是我在 android 上的第一个应用程序,所以我想得到一些反馈。
我的 phone 是 Android 4.4.2,以防有人告诉我为什么我没有使用 MediaSession 或其他任何东西。 (我知道 registerMediaButtonEventReceiver 已被弃用)
接收者class:
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 class:
@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(在您需要的 class 中)来捕获来自 BroadcastReceiver 的消息另一个 class。在我的例子中是 MediaReceiver 所以我不得不添加这行来发送消息到我想使用的 activity。
MediaReceive onReceive()
您需要创建一个新的 Intent,我将其命名为 "android.intent.MAIN",并且您必须将消息添加到该 Intent(您可以使用 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);
...
}
MainActivity
我声明了一个新的 BroadcastReceiver 并添加了 onResume/onPause 方法。 使用与在 MediaReceive class 中创建的 Intent 相同的名称创建了一个 IntentFilter。这样做使您能够通过 BroadcastReceiver classes 和活动发送消息。其余代码是您要对该消息执行的操作,调用方法或更新变量。
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);
}
不要忘记 register/unregister 每个 BroadcastReceiver。
我希望它对遇到像我一样问题的任何人有所帮助。 欢迎发表评论。