【问题标题】:Saving SharedPreferences in Android Service在 Android 服务中保存 SharedPreferences
【发布时间】:2014-03-07 12:12:42
【问题描述】:

我有一个在我的应用程序中播放音乐的服务。我正在尝试为用户在退出应用程序时是否停止音乐保存一个布尔值。当音乐播放并且他使用“退出”按钮退出应用程序时,它应该保存该值,但当他重新输入时,保存的值始终为“假”。

活动:

public class MainActivity extends Activity implements OnClickListener {

private Boolean isMusicPlaying;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.activity_main);

    View exitButton=findViewById(R.id.exit);
    exitButton.setOnClickListener(this);

    isMusicPlaying=getSharedPreferences("SFX", MODE_PRIVATE).getBoolean("music", true);
    if(isMusicPlaying)
        startService(new Intent(getBaseContext(), MyService.class));

}

@Override
public void onClick(View v) {
    switch(v.getId()){


    case R.id.exit: 
    {
        isMusicPlaying=getSharedPreferences("SFX", MODE_PRIVATE).getBoolean("music", true);
        stopService(new Intent(getBaseContext(), MyService.class));
        getSharedPreferences("SFX", MODE_PRIVATE).edit().putBoolean("music", isMusicPlaying).commit();
        if(isMusicPlaying)
            Toast.makeText(this, "YES", Toast.LENGTH_SHORT).show();
        this.finish();
    }
    }
}

}

音乐服务:

public class MyService extends Service {

MediaPlayer player;
public static int lastStopped;

public static int getLastStopped() {
    return lastStopped;
}

public static void setLastStopped(int lastStopped) {
    MyService.lastStopped = lastStopped;
}

public IBinder onBind(Intent arg0) {
    return null;
}


@Override
public void onCreate() {
    super.onCreate();
    player = MediaPlayer.create(this, R.raw.background);
    player.setLooping(true);
    player.setVolume(100,100);
    player.seekTo(getLastStopped());

}
public int onStartCommand(Intent intent, int flags, int startId) {
    getSharedPreferences("SFX", MODE_PRIVATE).edit().putBoolean("music", true).commit();
    player.start();
    return START_STICKY;
}

@Override
public void onDestroy() {
    getSharedPreferences("SFX", MODE_PRIVATE).edit().putBoolean("music", false).commit();
    setLastStopped(player.getCurrentPosition());
    player.pause();
}

}

【问题讨论】:

    标签: android android-activity sharedpreferences android-service


    【解决方案1】:

    最好你应该在服务中维护一个静态布尔字段并检查它是否正在播放音乐。这样很简单,代码流也很容易理解。为什么要通过多次使用共享偏好来使事​​情变得复杂

      public class MyService extends Service {
      Public static boolean isMusicPlaying=false;
      public int onStartCommand(Intent intent, int flags, int startId) {
       isMusicPlaying=true;
      .......
       }
    

    在活动中只需检查

      if(MyService .isMusicPlaying)
            Toast.makeText(this, "YES", Toast.LENGTH_SHORT).show();
     else
      startService(new Intent(getBaseContext(), MyService.class));
    

    【讨论】:

      【解决方案2】:

      好吧,当服务被销毁时,您确实将“false”写入 SharedPreference,这将在您退出应用程序时发生。

      您可能希望将该服务编码为前台服务。请看Googles developer reference

      【讨论】:

      • 如果您注意到活动中的“退出”情况,我会停止服务,然后将值放入销毁之前的 SharedPreference 中。
      • stopService(Intent) 是异步调用。 Service onDestroy() 将覆盖以前写入的值。
      • 我不明白。我将销毁前的最后一个值保存在 isMusicPlaying 中。当我销毁服务时,它会覆盖它吗?
      • 顺便说一句,我在 this.finish() 命令之前做了一个 toast 打印 isMusicPlaying 的值。当音乐播放并退出应用程序时,它会打印“true”
      • 异步调用使处理无需等待函数返回值即可继续进行。如果您将日志放入 MyService.onDestroy() 并在 this.finish() 之前,您会看到 MyService.onDestroy() 实际上是在 this.finish() 之后调用的
      猜你喜欢
      • 2015-12-11
      • 2012-05-30
      • 2016-05-27
      • 1970-01-01
      • 2014-03-05
      • 2012-04-15
      • 1970-01-01
      • 2016-06-23
      • 2016-06-15
      相关资源
      最近更新 更多