使用方法引用定义 BroadcastReceiver.onReceive
Define BroadcastReceiver.onReceive with a method reference
使用 Jack 对 Java 8 的支持,我希望能够编写类似的东西:
public void onReceive(Context context, Intent intent) {
if (!intent.getAction().equals(ACTION_BINGO)) return;
Log.d(TAG, "Bingo!");
}
...
registerReceiver(this::onReceive, INTENT_FILTER_BINGO);
不幸的是,这是不可能的。虽然onReceive()
是BroadcastReceiver
唯一的抽象方法,但那个东西不是接口,而是抽象class,它们似乎不能被 lambda 表达式替换。有什么解决这个问题的建议吗?
使用 中概述的技巧,我得到:
public class BroadcastReceiver extends android.content.BroadcastReceiver {
private final BiConsumer<Context, Intent> receiver;
public BroadcastReceiver(final BiConsumer<Context, Intent> onReceive) {
receiver = onReceive;
}
@Override
public void onReceive(Context context, Intent intent) {
if (receiver == null) {
throw new UnsupportedOperationException("Not yet implemented");
}
receiver.accept(context, intent);
}
}
没有我想象的那么简洁,但是更好:
BroadcastReceiver receiver = new BroadcastReceiver(this::onReceive);
registerReceiver(receiver, INTENT_FILTER_BINGO);
只是为了扩展上面的答案,没有 BiConsumer(在 API<24 中不可用)
class BroadcastReceiver extends android.content.BroadcastReceiver {
public interface IBR {
void onReceive(Context context, Intent intent);
}
private final IBR receiver;
public BroadcastReceiver( IBR receiver ){
this.receiver = receiver;
}
@Override
public void onReceive(Context context, Intent intent) {
receiver.onReceive(context, intent);
}
}
然后,同上或下
BroadcastReceiver receiver = new BroadcastReceiver(this::onReceive);
registerReceiver(receiver, INTENT_FILTER_BINGO);
使用 Jack 对 Java 8 的支持,我希望能够编写类似的东西:
public void onReceive(Context context, Intent intent) {
if (!intent.getAction().equals(ACTION_BINGO)) return;
Log.d(TAG, "Bingo!");
}
...
registerReceiver(this::onReceive, INTENT_FILTER_BINGO);
不幸的是,这是不可能的。虽然onReceive()
是BroadcastReceiver
唯一的抽象方法,但那个东西不是接口,而是抽象class,它们似乎不能被 lambda 表达式替换。有什么解决这个问题的建议吗?
使用
public class BroadcastReceiver extends android.content.BroadcastReceiver {
private final BiConsumer<Context, Intent> receiver;
public BroadcastReceiver(final BiConsumer<Context, Intent> onReceive) {
receiver = onReceive;
}
@Override
public void onReceive(Context context, Intent intent) {
if (receiver == null) {
throw new UnsupportedOperationException("Not yet implemented");
}
receiver.accept(context, intent);
}
}
没有我想象的那么简洁,但是更好:
BroadcastReceiver receiver = new BroadcastReceiver(this::onReceive);
registerReceiver(receiver, INTENT_FILTER_BINGO);
只是为了扩展上面的答案,没有 BiConsumer(在 API<24 中不可用)
class BroadcastReceiver extends android.content.BroadcastReceiver {
public interface IBR {
void onReceive(Context context, Intent intent);
}
private final IBR receiver;
public BroadcastReceiver( IBR receiver ){
this.receiver = receiver;
}
@Override
public void onReceive(Context context, Intent intent) {
receiver.onReceive(context, intent);
}
}
然后,同上或下
BroadcastReceiver receiver = new BroadcastReceiver(this::onReceive);
registerReceiver(receiver, INTENT_FILTER_BINGO);