Как я могу изменить настройки услуги? - PullRequest
0 голосов
/ 19 марта 2019

Я делаю приложение, которое хочу запустить при загрузке и запустить в фоновом режиме.Я решил сделать его службой в соответствии с этим руководством:

Android - запуск службы при загрузке

Однако я хочу, чтобы пользователь мог открывать приложение инажмите кнопку, чтобы включить / отключить его функциональность.У меня есть логическое значение с именем enabled , которое я сохраняю с помощью SharedPreferences onStop и onStart:

//Save preferences on stop
@Override
public void onStop() {
    super.onStop();

    SharedPreferences pref = getSharedPreferences("info", MODE_PRIVATE);
    SharedPreferences.Editor editor = pref.edit();
    editor.putBoolean("AppEnabled", enabled);
    editor.commit();
}

//Load preferences on start
@Override
public void onStart() {
    super.onStart();

    SharedPreferences pref = getSharedPreferences("info", MODE_PRIVATE);
    enabled = pref.getBoolean("AppEnabled", true);

    //Make button reflect saved preference
    Button button = (Button)findViewById(R.id.enableButton);
    if(enabled) {
        button.setText("Disable");
    }
    else {
        button.setText("Enable");
    }
}

Если я открою приложение и нажму кнопку, функциональность будет переключаться по желанию.Но если я нажму кнопку, чтобы отключить эту функцию и закрыть приложение, служба, работающая в фоновом режиме, все равно будет считать, что она включена.Как правильно обновить службу, чтобы она получала обновленную переменную?

РЕДАКТИРОВАТЬ:

Это зарегистрировано в манифесте и вызывается при загрузке:

/*This class starts MainService on boot*/
package com.example.sayonara;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.util.Log;

public class StartAppServiceOnBoot extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent arg1) {
        Intent intent = new Intent(context, MainService.class);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            context.startForegroundService(intent);
        } else {
            context.startService(intent);
        }
        Log.i("Autostart", "started");
    }
}

Вызывается классом выше для запуска службы:

/*Called by StartAppServiceOnBoot, starts mainActivity as a service*/
package com.example.sayonara;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;
import android.widget.Toast;

public class MainService extends Service {
    private static final String TAG = "MyService";
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
    public void onDestroy() {
        Toast.makeText(this, "My Service Stopped", Toast.LENGTH_LONG).show();
        Log.d(TAG, "onDestroy");
    }

    @Override
    public void onStart(Intent intent, int startid)
    {
        Intent intents = new Intent(getBaseContext(), MainActivity.class);
        intents.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(intents);
        Toast.makeText(this, "My Service Started", Toast.LENGTH_LONG).show();
        Log.d(TAG, "onStart");
    }
}

1 Ответ

0 голосов
/ 20 марта 2019

Оказывается, поскольку я расширяю BroadCastReceiver, класс работает в фоновом режиме и не зависит от моего приложения, поэтому он блокирует вызовы, даже когда служба отключена.Я следовал этому учебнику , чтобы отключить мой приемник, когда служба отключена, и теперь она работает.

...