2

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

public final static String KEY_ENABLE_LOCKSCREEN = "key_enable_lockscreen";

在以下位置声明它们:

  1. 服务?
  2. 活动?
  3. 单身狗?
4

5 回答 5

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);
于 2013-10-01T01:27:53.133 回答
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 

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

于 2013-10-17T08:16:18.230 回答
0
  1. 您可以扩展Application类来创建自己的类并在那里声明它。
  2. 您可以创建一个辅助类并在其中声明它。你的常数不需要 aContext所以它可以安全地住在那里。这个类不必是一个单例来保存你的静态最终变量,因为它不必有一个实例。

来自Android开发者参考Application

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

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

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

于 2013-10-01T01:25:48.093 回答
0

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

于 2013-10-01T02:28:37.910 回答
0

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

  • 单例完全没有必要(不需要实例)。

  • 不需要单独的 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

于 2013-10-03T21:09:40.187 回答