Не показывать сокетное сообщение на API 26+ на устройствах Android - PullRequest
0 голосов
/ 17 апреля 2019

Я протестировал свое приложение на старых версиях 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 Ответ

1 голос
/ 17 апреля 2019

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

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

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

UPDATE

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

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 в соответствии с обратными вызовами жизненного цикла действия.

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

...