从后台服务访问当前的SharedPreferences数据

时间:2019-11-20 13:53:26

标签: android-studio sharedpreferences

我的应用程序在扩展服务的类的后台使用倒数计时器。后台运行服务旨在访问应用程序的Sharedpreferences数据。在倒计时期间,Sharedpreferences中的特定整数会更改值,并且期望在倒数计时器的onFinish()调用中访问更新后的值。现在的问题是,服务不会从Sharedpreference读取更新的值,而是在后台服务启动时返回初始值。

我在某处看到解决问题的方法是使用

PreferenceManager.getDefaultSharedPreferences()

而不是getSharedPrefences才能访问当前的SharedPreferences值。我实施了此建议,但问题仍然存在。

请有人帮助我,因为试图弄清楚这占用了我太多时间。

我的代码在这里:

public class BroadcastService extends Service {

DatabaseHelperClass myDatabase = new DatabaseHelperClass(this);

private SharedPreferences defaultSharedPreferences, sharedPreferences, staffSignedIn;
private SharedPreferences.Editor staffEditor, defaultSharedPreferencesEditor;
int countSignIn;

private SimpleDateFormat simpleDateFormatII;

Long timeLeftInMiliseconds;

private final static String TAG = "BroadcastService";

public static final String COUNTDOWN_BR = "com.cenitscitech.www.etimebook.countdown_br";
Intent bi = new Intent(COUNTDOWN_BR);

CountDownTimer cdt = null;

@Override
public void onCreate() {
    super.onCreate();

    defaultSharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
    defaultSharedPreferencesEditor = defaultSharedPreferences.edit();
    sharedPreferences = getSharedPreferences("setTime", MODE_PRIVATE);
    //staffSignedIn = getSharedPreferences("present", MODE_PRIVATE);

    //countSignIn = staffSignedIn.getInt("max", 0);

    //staffEditor = staffSignedIn.edit();
    simpleDateFormatII = new SimpleDateFormat("MMM EEE dd, yyyy HH:mm");

    Log.i(TAG, "Starting timer in broadcast receiver...");
    Log.i(TAG, "max Count Obtained onBroadcastCreate: "+defaultSharedPreferences.getInt("max", 0));

}

@Override
public void onDestroy() {
    //cdt.cancel();
    Log.i(TAG, "Timer in broadcast receiver cancelled");
    super.onDestroy();
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {

    timeLeftInMiliseconds = intent.getLongExtra("timeLeft", 0L);

    cdt = new CountDownTimer(timeLeftInMiliseconds, 1000) {
        @Override
        public void onTick(long millisUntilFinished) {
            SharedPreferences defaultShared = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());

            Log.i(TAG, "Countdown seconds remaining: " + millisUntilFinished / 1000);
            /*bi.putExtra("countdown", millisUntilFinished);
            sendBroadcast(bi);*/
        }

        @Override
        public void onFinish() {
            SharedPreferences defaultSharedPreferences2 = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
            countSignIn = defaultSharedPreferences2.getInt("max", 0);
            Log.i(TAG, "Timer finished");
            bi.putExtra("countdown", "Timer finished");
            sendBroadcast(bi);

            StringBuilder phoneBuilder = new StringBuilder();

            Calendar cStart = Calendar.getInstance();
            cStart.set(Calendar.HOUR_OF_DAY, 0);
            cStart.set(Calendar.MINUTE, 0);
            cStart.set(Calendar.SECOND, 0);
            Long cStartLong = cStart.getTimeInMillis();

            Calendar cEnd = Calendar.getInstance();
            cEnd.set(Calendar.HOUR_OF_DAY, 23);
            cEnd.set(Calendar.MINUTE, 59);
            cEnd.set(Calendar.SECOND, 59);
            Long cEndLong = cEnd.getTimeInMillis();

            String[] conditionsElements;

            Log.i(TAG + " onFinish", "MAXIMUM COUNT OBTAINED: " + defaultSharedPreferences2.getInt("max", 0));
            Log.i(TAG + " onFinish", "MAXIMUM COUNT OBTAINED: " + countSignIn);

            if (defaultSharedPreferences2.getInt("max", 0) > 0) {
                Log.i(TAG + " onFinish", "CURRENT countSignIn Value: "+countSignIn+"\n"+" max Value: "+defaultSharedPreferences2.getInt("max", 0));
                conditionsElements = new String[defaultSharedPreferences2.getInt("max", 0)];
                for (int i = 1; i <= defaultSharedPreferences2.getInt("max", 0); i++) {
                    conditionsElements[i - 1] = defaultSharedPreferences2.getString(Integer.toString(i), "NoElement");
                    Log.i(TAG + " onFinish", "conditionsElement[" + (i - 1) + "] = " + defaultSharedPreferences2.getString(Integer.toString(i), "NoElement"));
                    if (i < defaultSharedPreferences2.getInt("max", 0)) {
                        phoneBuilder.append("MOBILE_NUMBER = ? OR ");
                        Log.i(TAG + " onFinish", "phoneBuilder[" + (i - 1) + "]: " + phoneBuilder);
                        //phoneBuilder.append(staffSignedIn.getString(Integer.toString(i), "NoStaff")+"_");
                    } else if (i == defaultSharedPreferences2.getInt("max", 0)) {
                        //phoneBuilder.append(staffSignedIn.getString(Integer.toString(i), "NoStaff"));
                        phoneBuilder.append("MOBILE_NUMBER = ?");
                        Log.i(TAG + " onFinish", "phoneBuilder[final]: " + phoneBuilder);
                    }
                }

            } else {
                Log.i(TAG + " onFinishInsideElse", "CURRENT countSignIn Value: "+countSignIn+"\n"+" max Value: "+defaultSharedPreferences2.getInt("max", 0));
                conditionsElements = new String[1];
                conditionsElements[0] = "NoElement";
                phoneBuilder.append("MOBILE_NUMBER = ?");
            }

            Cursor cursor = myDatabase.queryAbsentStaff(SURNAME_COLUMN + ", " + FIRST_NAME_COLUMN + ", " + MIDDLE_NAME_COLUMN + ", " + MOBILE_NUMBER_COLUMN + ", " + DATE_COLUMN,
                    SURNAME_COLUMN + ", " + FIRST_NAME_COLUMN + ", " + MIDDLE_NAME_COLUMN + ", " + MOBILE_NUMBER_COLUMN + ", " + DATE_COLUMN,
                    phoneBuilder.toString(),
                    conditionsElements);


            Log.i(TAG + " onFinish", "\n" + "SET TIMES:" + "\n" + cStartLong + "\n" + cEndLong + "\n" + "RETURNED ROWS:" + "\n" + cursor.getCount());
            /*staffEditor.putInt("max", 0);
            staffEditor.apply();
            for(int i=0; i<staffSignedIn.getInt("totalStaff", 100); i++){
                staffEditor.putString(Integer.toString((i+1)), "empty").apply();
            }*/
            if(cursor.moveToFirst()){
                for (int i = 0; i < cursor.getCount(); i++) {

                    if(myDatabase.insertTimeBookRecord(cursor.getString(cursor.getColumnIndex(SURNAME_COLUMN)), cursor.getString(cursor.getColumnIndex(FIRST_NAME_COLUMN)),
                            cursor.getString(cursor.getColumnIndex(MIDDLE_NAME_COLUMN)), cursor.getString(cursor.getColumnIndex(MOBILE_NUMBER_COLUMN)),
                            "ABSENT", Long.toString(System.currentTimeMillis()), 1000000L, "NO", "0000", System.currentTimeMillis(), "notSynced", "notSynced")){
                        cursor.moveToNext();
                        if(cursor.isAfterLast()){
                            cursor.close();
                        }
                    }else{
                        cursor.moveToNext();
                        if(cursor.isAfterLast()){
                            cursor.close();
                        }
                    }
                }
            }

            Log.i(TAG +" onFinish: ", "max val reset: "+defaultSharedPreferences2.getInt("max", 0));

0 个答案:

没有答案
相关问题