Получатель не зарегистрировал исключение в фоновой службе - PullRequest
0 голосов
/ 13 июля 2020

В моем приложении широковещательный приемник должен выполняться в фоновом режиме. Итак, я реализовал это так.

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 и отменить регистрацию приемника. Я не могу найти решение. Пожалуйста, помогите, если у кого-нибудь есть идеи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...