Android 服务——为共享首选项声明静态字符串的最佳位置
在一个持久的Android服务中,什么是声明引用SharedReference的静态字符串的最佳位置,以便最终在BroadcastReceivers中使用Android 服务——为共享首选项声明静态字符串的最佳位置,android,string,service,static,sharedpreferences,Android,String,Service,Static,Sharedpreferences,在一个持久的Android服务中,什么是声明引用SharedReference的静态字符串的最佳位置,以便最终在BroadcastReceivers中使用 public final static String KEY_ENABLE_LOCKSCREEN = "key_enable_lockscreen"; 在下列文件中声明: 服务 活动 单身汉 您可以扩展应用程序类来创建自己的类并在其中声明它 您可以创建一个helper类并在其中声明它。您的常量不需要上下文,因此它可以安全地存在其中。这个类不
public final static String KEY_ENABLE_LOCKSCREEN = "key_enable_lockscreen";
在下列文件中声明:
应用程序
类来创建自己的类并在其中声明它上下文
,因此它可以安全地存在其中。这个类不必是一个单例来保存静态final变量,因为它不必有一个实例那样更干净。
通常我在包名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);
除了静态类之外,我看不出有任何理由声明它们。它们是常数,真的。您不会更改它们(如示例中所示)。为什么要费心在单例中实例化它们呢?静态类的作用就像C中的头文件。更好的技巧是将它们放在接口定义中。这样,您可以通过在一个类中实现多个接口来混合和匹配常量。当您实现一个没有任何方法的接口时,您将继承这些常量。我认为最好将这些常量作为最终静态字符串放入服务中,并具有所需的最小范围(例如,根据需要,包私有或公共)
- 单例是完全不必要的(不需要实例)
- 不需要单独的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使用唯一的字符串
意图名称空间是全局的。确保意向操作名称和其他字符串写在您拥有的名称空间中,否则您可能会无意中与其他应用程序发生冲突
(请参阅:)更好的方法和实践是创建一个单独的类,如
/**
*
*/
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
因此,它将为您提供托管代码,以加快代码的速度。对于#2,是否有理由创建帮助器类而不是仅在服务本身中声明它们?是的,真的只是为了清晰和代码组织。
静态final
几乎可以在任何地方声明。您可以在服务构造函数或onCreate()中实例化Singleton?通常,Singleton会在第一次使用时实例化自身。这如何帮助提供xml访问,例如:?我想你最后会再次输入常量值(“诸如此类”)。