java - 不要在 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);
}
解决方案
我不确定是否是这种情况,但您可能正在清单中注册您的接收器。
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
根据活动的生命周期回调将活动取消注册为回调。
无论如何,这段代码只是为了说明这个想法,所以我不建议在你的应用程序中使用它。
推荐阅读
- laravel - 如何在laravel的url中隐藏id?
- node.js - nodemon crash - 应用程序崩溃 - 在启动前等待文件更改
- windows - 使用llvm-objdump在exe文件的反汇编中查找符号
- docker - 我已经安装了 docker 版本 19.03,在运行 docker 守护进程时,几天后容器被间歇性删除
- javascript - GIthub Api 获取用户每个 repo 的所有提交
- javascript - Converting Vanilla JS to Vue.js, querySelector, this issue
- python - set_clip_path 使绘图在轴之外
- python - 即使变量匹配,while循环也不会停止
- node.js - 试图升级@ng-bootstrap/ng-bootstrap 但它保持相同的版本
- html - 如何在 Bootstrap 4 中的网格之间留出边距?