【问题标题】:How do I pass shared preferences from a service to a fragment?如何将共享首选项从服务传递到片段?
【发布时间】:2025-12-22 06:25:10
【问题描述】:

我正在尝试通过共享首选项将数据从服务类传递到片段类。

我没有遇到语法错误,但是有一个逻辑错误,因为我没有在 StepsFragment 中使用我想要的更新的计步器更新文本视图。

我正在StepsService.java 中运行计步器,并尝试将信息传递给StepsFragment.java

我尝试了以下解决方案:

Access shared preference from a service

Can I get data from shared preferences inside a service?

这是我在StepsService.java中的代码

  @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        final long timeInterval = 1000;
        Runnable runnable = new Runnable() {
            public void run() {
                while (true){
                    // ------- code for task to run
                    SharedPreferences.Editor editor = getSharedPreferences("DeviceToken",MODE_PRIVATE).edit();
                    editor.putString("DeviceToken",String.valueOf(stepsCounter));
                    editor.apply();
                    addNotification(String.valueOf(stepsCounter));
                    // ------- ends here
                    try {
                        Thread.sleep(timeInterval);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        };
        Thread thread = new Thread(runnable);
        thread.start();
        return START_NOT_STICKY;
    }

这是我在StepsFragment.java中的代码

    public void startService(View view) {

        Intent serviceIntent = new Intent(getActivity(),StepsService.class);
        getActivity().startService(serviceIntent);
        SharedPreferences prefs = this.getActivity().getSharedPreferences("DeviceToken", MODE_PRIVATE);
        String deviceToken = prefs.getString("DeviceToken", null);
        tv_steps.setText(deviceToken);
    }

【问题讨论】:

    标签: android android-fragments android-service sharedpreferences


    【解决方案1】:

    在您的Fragment 中调用startService(),然后立即读取SharedPreferences。这行不通。对startService() 的调用是异步的。它基本上只是要求 Android 启动Service。这将在未来某个时间发生,但绝对不会立即发生。

    Service 的启动和SharedPreferences 的更新需要一些时间。

    您可以让您的Service 在更新SharedPreferences 时发送广播Intent,并且您的FragmentActivity 可以注册以收到此广播Intent 的通知,并将其用作触发更新View

    或者您可以等待一段时间再检查SharedPreferences

    【讨论】: