#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 🙂