2016-11-25 2 views
0

Использование поддержки Jack для Java 8, я хотел бы быть в состоянии написать что-то вроде этого:Определение BroadcastReceiver.onReceive со ссылкой метод

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, эта вещь не является интерфейсом , это абстракционный класс, который не представляется заменяемым лямбда-выражениями. Любое предложение обойти это?

+2

Вы можете создать construc tor для класса, который расширяет BroadcastReceiver и передает прослушиватель интерфейса этому конструктору. В методе onReceive позвоните слушателю –

+0

. Я почти пришел к такому же выводу, за исключением того, что я не пользуюсь слушателем. – cuihtlauac

ответ

2

Используя прием, изложенный в this answer, вот что я получаю:

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); 
0

Просто продлить на ответ выше, без BiConsumer (недоступно в API < 24)

interface IBR { 
    void onReceive(Context context, Intent intent); 
} 

class BroadcastReceiver extends android.content.BroadcastReceiver { 
    private final IBR receiver; 

    public BroadcastReceiver(IBR receiver){ 
     this.receiver = receiver; 
    } 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     receiver.onReceive(context, intent); 
    } 
}