首页 > 解决方案 > 不要在 API 26+ android 设备上显示套接字消息

问题描述

我已经在旧设备 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, "Порака") ;
}

更新:我在 onCreate 中添加了 BroadcasReceiver,我还需要做哪些其他更改?

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

标签: javaandroidsocketsserversocket

解决方案


我不确定是否是这种情况,但您可能正在清单中注册您的接收器。

Android O对注册广播接收器引入了一些限制——通常,除了一些例外,您不能在清单中注册隐式接收器。

因此,您必须在运行时注册接收器或坚持显式广播(这可以通过设置意图的目标组件来完成)。

更新

在这里您正在注册一个接收器

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根据活动的生命周期回调将活动取消注册为回调。

无论如何,这段代码只是为了说明这个想法,所以我不建议在你的应用程序中使用它。


推荐阅读