服务 - 为共享首选项声明静态字符串的最佳位置

时间:2013-10-01 01:21:08

标签: android string service static sharedpreferences

在持久的Android服务中,什么是声明静态字符串以引用SharedPreferences的最佳位置,以便最终在BroadcastReceivers中使用?

public final static String KEY_ENABLE_LOCKSCREEN = "key_enable_lockscreen";

在:

中声明它们
  1. 服务?
  2. 活动?
  3. 单身人士?

5 个答案:

答案 0 :(得分:1)

单身人士! 这种方式更干净。
通常我在包名称utils中声明我的。

mycustom.package.com.utils

这是一个例子。

public class MyUtility{
    public final static String KEY_ENABLE_LOCKSCREEN = "key_enable_lockscreen";
}

当你使用它时,只需按照以下方式引用它:

SharedPreferences prefs = getSharedPreferences( MyUtility.KEY_ENABLE_LOCKSCREEN, Context.MODE_PRIVATE);

答案 1 :(得分:1)

我认为最好将这些常量作为最终的静态字符串放在服务中,并且具有所需的最小范围(例如,包私有或公共,如需要)。

  • 单身是完全没必要的(不需要实例)。

  • 不需要单独的utils类。这可能是一个偏好的问题,但是将常量定义与它们相关的类分开几乎没有什么好处。它们可以从服务中轻松访问,也可以从其他任意类访问,从长远来看,我觉得更容易记住MyService的常量,如果它们在MyService中,那么它们是否在一些其他的utils类,你现在必须记住它的名字。

  • 单独的utils类使命名复杂化。假设您有多个服务/广播,将所有常量放在一个单独的类中也需要您装饰名称。换句话说,您将无法在多个服务中明确地为常量使用相同的名称。

例如,我觉得这样:

public class PlaylistManager extends IntentService {
    public static final String BROADCAST_ERROR = "@package.name@.PlaylistManager.broadcast.ERROR";
    // can be referenced within this class as BROADCAST_ERROR

    private void broadcastError() {
        Intent broadcastIntent = new Intent();
        if(broadcastIntent != null) {
            broadcastIntent.setAction(BROADCAST_ERROR);
            // etc.
            sendBroadcast(broadcastIntent);
        }
    }
}

public class AudioCacheLoader extends IntentService {
    public static final String BROADCAST_ERROR = "@package.name@.AudioCacheLoader.broadcast.ERROR";
    // can also be referenced within this class as BROADCAST_ERROR

    private void broadcastError() {
        Intent broadcastIntent = new Intent();
        if(broadcastIntent != null) {
            broadcastIntent.setAction(BROADCAST_ERROR);
            // etc.
            sendBroadcast(broadcastIntent);
        }
    }
}

// naming pattern:
// PlaylistManager.BROADCAST_ERROR
// AudioCacheLoader.BROADCAST_ERROR
// etc.

......比这更可取:

public class MyUtils {
    public static final String PLAYLIST_MANAGER_BROADCAST_ERROR = "@package.name@.PlaylistManager.broadcast.ERROR";
    public static final String AUDIO_CACHE_LOADER_BROADCAST_ERROR = "@package.name@.AudioCacheLoader.broadcast.ERROR";
}

public class PlaylistManager extends IntentService {

    private void broadcastError() {
        Intent broadcastIntent = new Intent();
        if(broadcastIntent != null) {
            broadcastIntent.setAction(MyUtils.PLAYLIST_MANAGER_BROADCAST_ERROR);
            // etc.
            sendBroadcast(broadcastIntent);
        }
    }
}

public class AudioCacheLoader extends IntentService {

    private void broadcastError() {
        Intent broadcastIntent = new Intent();
        if(broadcastIntent != null) {
            broadcastIntent.setAction(MyUtils.AUDIO_CACHE_LOADER_BROADCAST_ERROR);
            // etc.
            sendBroadcast(broadcastIntent);
        }
    }
}

// naming pattern:
// MyUtils.PLAYLIST_MANAGER_BROADCAST_ERROR
// MyUtils.AUDIO_CACHE_LOADER_BROADCAST_ERROR
// etc.

请注意,第一个示例使得在服务类之间复制和粘贴代码变得更加容易。

此外,请记住,除非您使用LocalBroadcastManager,否则应为BroadcastReceivers使用唯一字符串。

  

Intent命名空间是全局的。确保将Intent操作名称和其他字符串写入您拥有的命名空间中,否则您可能会无意中与其他应用程序冲突。

(参见:http://developer.android.com/reference/android/content/BroadcastReceiver.html

答案 2 :(得分:1)

更好的方法&练习创建一个单独的类,如

/**
 * 
 */
package com.comapnyname.projectname.utility;

/**
* @author Rakesh.Jha
* All static member variable will be listed here
*/
public class MyPreferences {

    /*
     * @Declare all static variables here   
 */
    public final static String KEY_ENABLE_CODE = "0001";

}

如果您想使用偏好设置,可以使用 -

MyPreferences.KEY_ENABLE_CODE 

因此,它会为您提供托管代码,以提高代码的速度。

答案 3 :(得分:0)

  1. 您可以扩展Application类来创建自己的类并在那里声明它。
  2. 您可以创建一个帮助程序类,并在其中声明它。你的常数不需要Context所以它可以安全地生活在那里。这个类不必是一个单独的例子来保存你的静态最终变量,因为它不必有一个实例。
  3. 来自Application课程的Android Developer Reference

      

    需要维护全局应用程序状态的基类。您可以通过在AndroidManifest.xml的标记中指定其名称来提供自己的实现,这将导致在创建应用程序/包的过程时为您实例化该类。

         

    通常不需要子类Application。在大多数情况下,静态单例可以以更模块化的方式提供相同的功能。如果你的单例需要一个全局上下文(例如注册广播接收器),那么检索它的函数可以给一个Context,它在第一次构造单例时在内部使用Context.getApplicationContext()。

    请注意,这个问题有点基于意见,而且没有一个好的答案。

答案 4 :(得分:0)

我认为没有理由在静态类中声明它们。他们是常数,真的。你不会改变它们(如示例中所示)。为什么要在单例中实例化它们呢?静态类就像C中的头文件一样。更好的技巧是将它们放在 interface 定义中。这样,您可以通过在类中实现多个接口来混合和匹配常量。当您实现一个没有任何方法的接口时,您将继承常量。