В моем приложении широковещательный приемник должен выполняться в фоновом режиме. Итак, я реализовал это так.
public class Cloud_BatteryService extends Service {
int on;
int off;
int deviceStatus;
IntentFilter intentfilter;
static int batteryLevel;
String mDeviceAddress;
CompositeDisposable compositeDisposable = new CompositeDisposable ();
IMyService iMyService;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Retrofit retrofitClient = RetrofitClient.getInstance ();
iMyService = retrofitClient.create (IMyService.class);
intentfilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
try {
on = intent.getIntExtra("on",-1);
off = intent.getIntExtra("off",-1);
mDeviceAddress = intent.getStringExtra("address");
} catch (NullPointerException e){
e.printStackTrace();
}
registerReceiver(broadcastreceiver, intentfilter);
return START_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
SharedPreferences.Editor editor = Cloud_NormalbatteryOn_Off.preferences.edit();
on = -1;
off = -1;
editor.putBoolean("scheduled",false);
editor.putInt("offValue",-1);
editor.putInt("onValue",-1);
editor.apply();
unregisterReceiver(broadcastreceiver);
}
//Battery Percentage.
private BroadcastReceiver broadcastreceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
deviceStatus = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
batteryLevel = (int) (((float) level / (float) scale) * 100.0f);
Log.d("on",""+on+" off:"+off);
Log.e("battery status","status"+deviceStatus);
try {
if (batteryLevel == off) {
mqttMessage(mDeviceAddress,"smpoff");
if (on==-1){
Intent homeIntent = new Intent(Intent.ACTION_MAIN);
homeIntent.addCategory( Intent.CATEGORY_HOME );
homeIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(homeIntent);
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
if (deviceStatus != BatteryManager.BATTERY_STATUS_CHARGING) {
onDestroy();
}
}
}, 5000);
}
}
if (batteryLevel <= on)
mqttMessage(mDeviceAddress,"smpon");
} catch (Exception e){
e.printStackTrace();
}
}
};
private void mqttMessage(String deviceAddress,String msg) {
if (internetIsConnected()){
compositeDisposable.add (iMyService.mqttMessage (deviceAddress,msg)
.subscribeOn (Schedulers.io ())
.observeOn (AndroidSchedulers.mainThread ())
.subscribe (new Consumer<String>( ) {
@Override
public void accept(String responce) throws Exception {
Toast.makeText(getApplicationContext(),responce,Toast.LENGTH_SHORT).show();
}
}));
}
else
Toast.makeText(getApplicationContext(), "Please Check Internet Connection", Toast.LENGTH_SHORT).show();
}
public boolean internetIsConnected() {
try {
String command = "ping -c 1 google.com";
return (Runtime.getRuntime().exec(command).waitFor() == 0);
} catch (Exception e) {
return false;
}
}
}
Но при выполнении кода, когда он собирается onDestroy (), он выдает следующее исключение.
java.lang.IllegalArgumentException: Receiver not registered: com.smartplugapp.battery_onoff.Cloud_BatteryService$1@380a2a6
at android.app.LoadedApk.forgetReceiverDispatcher(LoadedApk.java:1007)
at android.app.ContextImpl.unregisterReceiver(ContextImpl.java:1358)
at android.content.ContextWrapper.unregisterReceiver(ContextWrapper.java:608)
at com.smartplugapp.battery_onoff.Cloud_BatteryService.onDestroy(Cloud_BatteryService.java:73)
at com.smartplugapp.battery_onoff.Cloud_BatteryService$1$1.run(Cloud_BatteryService.java:101)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6123)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:757)
Я ожидаю, что пока он отправляет smpoff, и процентное значение -1, если я удалю зарядное устройство, он должен go выполнить onDestroy и отменить регистрацию приемника. Я не могу найти решение. Пожалуйста, помогите, если у кого-нибудь есть идеи.