почему публичные переменные изменяются в Binding Service после запуска приложения? - PullRequest
0 голосов
/ 16 апреля 2019

Я использую службу привязки в Android. Я запускаю службу и останавливаю службу с помощью кнопки, и она работает правильно. История: я нажимаю кнопку запуска службы, чтобы затем запустить службу, я увеличиваю x с помощью кнопки showint и хорошо увеличиваю x, затем закрываю Приложение без остановки службы, затем снова запустите приложение, но общедоступный x превратится в ноль и снова начальный. Мне нужен сервис без повторной инициализации общедоступной переменной. Как я могу это сделать? Как можно связать.

public class MainActivity extends AppCompatActivity {
    BoundService mBoundService;
    boolean mServiceBound = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final TextView timestampText = (TextView) findViewById(R.id.timestamp_text);
        Button shownum = (Button) findViewById(R.id.shownum);
        Button stopService= (Button) findViewById(R.id.stop_service);
        Button start = (Button) findViewById(R.id.start);


        shownum.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mServiceBound) {
                    timestampText.setText(mBoundService.shownum());
                }
            }
        });


        stopService.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mServiceBound) {
                    unbindService(mServiceConnection);
                    mServiceBound = false;
                }
                Intent intent = new Intent(MainActivity.this,
                        BoundService.class);
                stopService(intent);

            }
        });


        start.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {

                Intent intent = new Intent(MainActivity.this, BoundService.class);
                startService(intent);
                bindService(intent, mServiceConnection, Context.BIND_AUTO_CREATE);

            }
        });

    }



    private ServiceConnection mServiceConnection = new ServiceConnection() {

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            BoundService.MyBinder myBinder = (BoundService.MyBinder) service;
            mBoundService = myBinder.getService();
            mServiceBound = true;
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            mServiceBound = false;
        }


    };
}

и класс BoundService:

public class BoundService extends Service {
    private IBinder mBinder = new MyBinder();
    public int x;

    @Override
        public void onCreate() {
//        super.onCreate();
        Toast.makeText(this,"onCreate",Toast.LENGTH_SHORT).show();
    }

    @Override
    public IBinder onBind(Intent intent) {
        Toast.makeText(this,"onBind",Toast.LENGTH_SHORT).show();
        return mBinder;
    }

    @Override
    public void onRebind(Intent intent) {
        Toast.makeText(this,"onRebind",Toast.LENGTH_SHORT).show();
        super.onRebind(intent);
    }

    @Override
    public boolean onUnbind(Intent intent) {
        Toast.makeText(this,"UUUUnbind",Toast.LENGTH_SHORT).show();
        return true;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Toast.makeText(this,"onDestroy",Toast.LENGTH_SHORT).show();

    }

    public String shownum()
    {
        x++;
        return  String.valueOf(x);
    }

    public class MyBinder extends Binder {
        BoundService getService() {
            return BoundService.this;
        }
    }
}

1 Ответ

0 голосов
/ 16 апреля 2019

Начиная с Android 8 (Oreo), все службы, которые должны оставаться в живых при закрытии приложения, должны запускаться с использованием startForegroundService () и должны отображать значок строки состояния во время работы.

Если вы этого не сделаете, Служба будет закрыта при закрытии приложения.

Тем не менее, вы должны увидеть журнал Logcat, в котором говорится, ПОЧЕМУ Служба уничтожена.

...