Использование Android WifiP2P в нескольких действиях

Я использую технологию Android Wifi P2P в своем приложении для Android, чтобы отправлять простые передачи данных между несколькими устройствами. Я читаю Руководство разработчика для Wifi p2p, но реализация выглядит так, как будто она создана только для одного действия, использующего прямую службу Wifi.

Следуя руководству, я создал этот класс BroadcastReceiver для прослушивания событий Wifi Direct:

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.wifi.p2p.WifiP2pManager;
import android.net.wifi.p2p.WifiP2pManager.Channel;

public class WifiDirectBroadcastReceiver extends BroadcastReceiver {
    private WifiP2pManager manager;
    private Channel channel;
    private WifiActivity activity;

    public WifiDirectBroadcastReceiver(WifiP2pManager manager, Channel channel, WifiActivity activity){
        this.manager = manager;
        this.channel = channel;
        this.activity = activity;
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();

        if (WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION.equals(action)){
            // Check to see if Wi-Fi is enabled and notify appropriate activity
        }else if (WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)){
            // Call WifiP2pManager.requestPeers() to get a list of current peers
        }else if (WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION.equals(action)){
            // Respond to new connection or disconnections
        }else if (WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION.equals(action)){
            // Respond to this device's wifi state changing
        }
    }
}

Однако конструктор, похоже, работает только с одним действием. Должен ли я создавать приемник для каждого действия, использующего Wifi Direct? Как передать соединение различным действиям без необходимости каждый раз устанавливать соединение (например, находить одноранговые узлы, подключаться к одноранговым узлам и т. д.)?


person terpak    schedule 15.09.2014    source источник
comment
Я не понимаю, как вы используете активность. Итак, у вас, вероятно, все хорошо, даже если вы удалите его... И иногда вы можете заменить действие контекстом...   -  person Saeid Farivar    schedule 16.09.2014
comment
Например, в одном действии я перечисляю сверстников. В другом я передаю данные. Эти действия имеют разные методы, так как же мне выбрать, к какому классу действий приводить объект, чтобы я мог вызвать соответствующий метод?   -  person terpak    schedule 16.09.2014
comment
Первое, что нужно сказать, это то, что НЕ ПЕРЕДАВАЙТЕ активность в качестве аргумента, насколько это возможно, потому что это может вызвать утечку памяти. Решением может быть то, что вы можете отправить широковещательные приемники (используйте localbroadcastmanager), просто передайте намерение, которое вы получили в своем классе, для других получателей внутри вашей деятельности... Я могу опубликовать код, если хотите.... но все, что вам нужно, - это учебник, который я упомянул здесь...   -  person Saeid Farivar    schedule 16.09.2014
comment
Итак, я должен статически создать основной широковещательный приемник при загрузке приложения и использовать его onReceive для отправки локальной трансляции для передачи данных в соответствующее действие?   -  person terpak    schedule 17.09.2014
comment
Таким образом, вы должны создать широковещательный приемник в каждом действии. но убедитесь, что вы используете localbroadcastmanager и не забудьте зарегистрировать его в onResume и отменить регистрацию в onPause, чтобы убедиться, что только одно действие получает намерение. и да, у вас есть общий широковещательный приемник, который всегда получает исходное намерение и передает его действиям...   -  person Saeid Farivar    schedule 18.09.2014


Ответы (1)


Хотя ответ слишком запоздал, но, поскольку на него никто не ответил, я подумал о том, чтобы предоставить решение.

Вам необходимо зарегистрировать широковещательный приемник с несколькими действиями и изменить свой конструктор с помощью следующего кода

public WiFiDirectBroadcastReceiver(WifiP2pManager manager, Channel channel,Context activity) {
        super();
        this.manager = manager;
        this.channel = channel;
        this.activity = activity;
    }

И везде, где вам нужно изменить код в соответствии с активностью, просто проверьте это

if(activity instanceof yourActivityName){
// your code based on the current activity
}

И зарегистрируйте свой широковещательный приемник в своей деятельности с помощью этого

receiver = new WiFiDirectBroadcastReceiver(manager, channel, this);
        registerReceiver(receiver, intentFilter);

Надеюсь это поможет

person Sarang S. Chaturvedi    schedule 10.02.2018