在持久的 Android 服务中,声明静态字符串以引用 SharedPreferences 以最终在 BroadcastReceivers 中使用的最佳位置是什么?
public final static String KEY_ENABLE_LOCKSCREEN = "key_enable_lockscreen";
在以下位置声明它们:
- 服务?
- 活动?
- 单身狗?
在持久的 Android 服务中,声明静态字符串以引用 SharedPreferences 以最终在 BroadcastReceivers 中使用的最佳位置是什么?
public final static String KEY_ENABLE_LOCKSCREEN = "key_enable_lockscreen";
在以下位置声明它们:
单身汉!
这样就干净多了。
通常我在包名 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);
它更好的方法和实践来创建一个单独的类,比如
/**
*
*/
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
因此,它将为您提供托管代码以提高代码的速度。
Application
类来创建自己的类并在那里声明它。Context
所以它可以安全地住在那里。这个类不必是一个单例来保存你的静态最终变量,因为它不必有一个实例。来自Android开发者参考类Application
:
需要维护全局应用程序状态的基类。您可以通过在 AndroidManifest.xml 的标记中指定其名称来提供自己的实现,这将导致在创建应用程序/包的进程时为您实例化该类。
通常不需要子类化 Application。在大多数情况下,静态单例可以以更模块化的方式提供相同的功能。如果您的单例需要全局上下文(例如注册广播接收器),则可以为检索它的函数提供一个 Context,该上下文在首次构建单例时在内部使用 Context.getApplicationContext()。
请注意,这个问题有点基于意见,没有一个好的答案。
我认为没有理由在静态类之外的任何东西中声明它们。它们是常数,真的。您不会更改它们(如示例中所示)。为什么要在单例中实例化它们?静态类就像 C 中的头文件一样。更好的技巧是将它们放在接口定义中。这样,您可以通过在一个类中实现多个接口来混合和匹配常量。当你实现一个没有任何方法的接口时,你继承了常量。
我认为最好将这些常量作为最终静态字符串放入服务中,并具有所需的最小范围(例如,包私有或公共,根据需要)。
单例完全没有必要(不需要实例)。
不需要单独的 utils 类。这可能是一个偏好问题,但是将常量定义与它们相关的类分开几乎没有什么好处。可以像从其他任意类一样轻松地从服务访问它们,从长远来看,我觉得记住 MyService 的常量在哪里会更容易,如果它们在 MyService 中,而不是它们在您现在还必须记住其他一些实用程序类的名称。
一个单独的 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.
请注意,第一个示例使在服务类之间复制和粘贴代码变得更加容易。
另外,请记住,您应该为 BroadcastReceivers 使用唯一的字符串,除非您使用LocalBroadcastManager
.
Intent 命名空间是全局的。确保 Intent 操作名称和其他字符串写在您拥有的命名空间中,否则您可能会无意中与其他应用程序发生冲突。
(见:http: //developer.android.com/reference/android/content/BroadcastReceiver.html)