有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java不在API26+安卓设备上显示socket消息

我已经在旧设备上测试了我的应用程序API版本,并显示了socket消息。但在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;
    }

}

在我的主要活动中。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);
}

共 (1) 个答案

  1. # 1 楼答案

    我不确定是否是这样,但有可能你正在舱单上登记你的接收人

    Android Ointroduced对注册广播接收器有一些限制-通常,除了一些exceptions之外,您不能在清单中注册隐式接收器

    因此,您必须在runtime期间注册接收机,或者坚持显式广播(这可以通过setting intent's target component完成)

    更新

    这是您注册的接收者

    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回调

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