Не показывать сообщение сокета на устройствах API 26 Android

#java #android #sockets #serversocket

#java #Android #сокеты #serversocket

Вопрос:

Я протестировал свое приложение на более старых версиях API для устройств, и отображается сообщение сокета. Но на версии 26 не работает. Я не понимаю, почему моя функция не работает для более новой версии.

SocketMessageReceiver.java

 public class SocketMessageReceiver extends BroadcastReceiver {

    interface ISocketMessageReceiver {
        void sendSocketMessage(String socketMessage);
    }

    private static ISocketMessageReceiver iSocketMessageReceiver;
    private final String TAG = "DEBUG";

    @Override
    public void onReceive(Context context, Intent intent) {
            iSocketMessageReceiver.sendSocketMessage(intent.getBundleExtra(SocketService.BUNDLE_DATA_KEY_VALUE).getString(SocketService.BUNDLE_DATA_KEY_VALUE));
    }

    public void registerCallback(ISocketMessageReceiver iSocketMessageReceiver) {
        this.iSocketMessageReceiver = iSocketMessageReceiver;
    }

}
 

В моем MainActivity.java

 public void sendSocketMessage(String socketMessage) {
    lblMessage.setText(socketMessage);
    setNotificationMessage(socketMessage, "Порака") ;
}
 

ОБНОВЛЕНИЕ: я добавляю BroadcasReceiver в onCreate, какие еще изменения мне нужно внести?

 private static SocketMessageReceiver.ISocketMessageReceiver iSocketMessageReceiver;

private ISocketInterface iSocketInterface;

private SocketMessageReceiver socketMessageReceiver;

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

    BroadcastReceiver br = new SocketMessageReceiver();
    IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
    filter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED);
    this.registerReceiver(br, filter);

    iSocketMessageReceiver = this;

    socketMessageReceiver = new SocketMessageReceiver();
    socketMessageReceiver.registerCallback(iSocketMessageReceiver);
}
 

Ответ №1:

Я не уверен, что это так, но возможно, что вы регистрируете своего получателя в манифесте.

Android O ввел некоторые ограничения на регистрацию широковещательных приемников — как правило, вы не можете зарегистрировать неявный приемник в манифесте, за исключением некоторых исключений.

Итак, вам придется либо зарегистрировать свои приемники во время выполнения, либо придерживаться явных трансляций (это можно сделать, установив целевой компонент intent).

Обновить:

Здесь вы регистрируете получателя

 this.registerReceiver(br, filter);
 

Но после этого вы создаете новый экземпляр SocketMessageReceiver и вызываете registerCallback() его.

Я думаю, что то, что вы хотите сделать, это вызвать registerCallback() тот же экземпляр, который вы регистрируете для получения трансляций. Кроме того, нет необходимости иметь переменную для ISocketMessageReceiver , поскольку вы Activity ее реализуете.

Связанный код в вашей деятельности, вероятно, может быть таким

 class MyActivity extends AppCompatActivity 
    implements SocketMessageReceiver.ISocketMessageReceiver {

    private SocketMessageReceiver mSocketReceiver = null;

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

        mSocketReceiver = new SocketMessageReceiver();
        mSocketReceiver.registerCallback(this);

        IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
        filter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED);
        registerReceiver(mSocketReceiver, filter);
    }
}
 

Тогда, конечно, вам нужно быть осторожным и отменить регистрацию вашей активности в качестве SocketMessageReceiver обратного вызова в соответствии с обратными вызовами жизненного цикла activity.

В любом случае, этот код предназначен только для иллюстрации идеи, поэтому я не рекомендую использовать его в вашем приложении как есть.

Комментарии:

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