android - 关闭应用程序时,Android广播接收器无法在服务中工作
问题描述
我正在使用服务来管理 wifi 网络状态。只要应用程序正在运行,它几乎可以正常工作。但是当应用程序关闭时,服务中的广播接收器不起作用。
public class WifiService extends Service {
private class WifiReceiver extends BroadcastReceiver{
String wifiNameN;
int wifiIdN;
@Override
public void onReceive(Context context, Intent intent) {
if(WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(intent.getAction())) {
NetworkInfo netInfo = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
assert netInfo != null;
Log.i("SerSC","=State"+wifiName);
Log.i("SerSC","=State"+wifiId);
if(netInfo.getDetailedState().equals(NetworkInfo.DetailedState.CONNECTED)) {
Log.i("SerSC","=Connection");
} else if(netInfo.getDetailedState().equals(NetworkInfo.DetailedState.CONNECTING)) {
} else if(netInfo.getDetailedState().equals(NetworkInfo.DetailedState.DISCONNECTING)) {
WifiManager wifiManager = (WifiManager) context.getApplicationContext().getSystemService(Context.WIFI_SERVICE);
assert wifiManager != null;
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
wifiInfo.getSSID();
wifiNameN = netInfo.getExtraInfo();
Log.i("SerSC","=D"+wifiNameN+"---"+wifiIdN);
wifiIdN = wifiInfo.getIpAddress();
} else if(netInfo.getDetailedState().equals(NetworkInfo.DetailedState.DISCONNECTED)) {
if (wifiName.equals(wifiNameN) && wifiId == wifiIdN) {
Log.i("SerSC","=DC"+wifiNameN+"---"+wifiIdN);
Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
// Vibrate for 5000 milliseconds
assert v != null;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
v.vibrate(VibrationEffect.createOneShot(1000, VibrationEffect.DEFAULT_AMPLITUDE));
} else {
//deprecated in API 26
v.vibrate(1000);
}
// I want to show a notification on system window e.g like messenger chat head appears when message comes
}
}
}
}
}
private String wifiName;
private int wifiId;
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
IntentFilter filter = new IntentFilter();
filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
registerReceiver(new WifiReceiver(), filter);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i("SerSC", "Service Started");
if (intent != null) {
wifiName = intent.getStringExtra(MainActivity.WIFI_NAME_TAG);
wifiId = intent.getIntExtra(MainActivity.WIFI_NETWORK_TAG, -1);
}
return START_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
Log.i("SerSC","Service Destroyed");
unregisterReceiver(new WifiReceiver());
}
}
这种情况也有效
if(netInfo.getDetailedState().equals(NetworkInfo.DetailedState.CONNECTED)) {
Log.i("SerSC","=Connection");
}
但是当我关闭 WIFI 设备时,NetworkInfo.DetailedState.DISCONNECTING 和 DISCONNECTED 不起作用。我想在后台永久运行服务并收听网络状态,即使应用程序没有运行。请不要提供链接。如果您决心帮助我,请编写代码
解决方案
推荐阅读
- sql - Oracle 强制唯一性
- html - Bootstrap flex 使 div 溢出
- ruby - 如何以无人身份运行 ruby
- java - Spring Boot 应用程序中的多个 Spring Data JPA 模块(非 Spring Boot)依赖项?
- c++ - C++:为什么我可以将指针值成员变量从 const 成员函数传递给采用非 const 指针参数的外部函数?
- python - Python 自动化 - 自动将文件移动到另一个文件夹 - 代码未执行
- sql - 关于SQL Server中同一列的除法问题
- python - aws-xray-sdk-python:手动创建的段未显示在 AWS 服务地图上
- reactjs - 获取 Redux 中所有相关方法的完整调用堆栈
- c# - 通过代码创建和执行的 SSIS 包需要在多次运行后重新启动服务