在Android中实现Singleton的正确方式,以便在活动之间共享数据?

时间:2013-03-01 18:09:03

标签: android design-patterns singleton

我一直在努力解决这个问题很长一段时间,实际上我已经在stackoverflow中检查了很多关于相同但没有确定性的帖子。

如何实现 Singleton模式来实现Android活动之间的数据共享? 我在谈论活动,而不是课程,哪一个是正确的方式?

这是我发现的所有信息:

1-推荐标准Singleton表单的人,可以在Java,C等中实现的表单,这里有一个例子:

http://es.wikipedia.org/wiki/Singleton

2-建议在OnCreate方法中实现它的人,如下所示:

http://androidcookbook.com/Recipe.seam?recipeId=1218

3-使用Application实现方法的那些(对此不太确定):

Is it acceptable practice to use Singleton Objects to save state or share data between Activities?

4-那些使用“singleTask”方法的方法,在清单中定义它:

http://developer.android.com/guide/topics/manifest/activity-element.html#lmode

5-和这样的更开放的方式(实际上这不是我认为的单身人士):

http://www.jameselsey.co.uk/blogs/techblog/android-implementing-global-state-share-data-between-activities-and-across-your-application/

连连呢?评论?实例

谷歌Android人士建议将其作为在活动之间共享复杂信息的一种方式,但不知道Android中的最佳方法。

http://developer.android.com/guide/faq/framework.html#3

请帮我澄清一下。

1 个答案:

答案 0 :(得分:3)

我已经使用Application来保存“Singleton”实例以及静态final变量。在我工作的框架中,Transfuse,Singletons通过@Singleton注释进行范围化。这些将给定的单例保存在静态最终映射中:

@Singleton
public class SingletonExample{
    ...
}

http://androidtransfuse.org/documentation.html#singleton

这是包含给定单例实例的地图:

public class ConcurrentDoubleLockingScope implements Scope {

    private final ConcurrentMap<Class, Object> singletonMap = new ConcurrentHashMap<Class, Object>();

    @Override
    public <T> T getScopedObject(Class<T> clazz, Provider<T> provider) {
        Object result = singletonMap.get(clazz);
        if (result == null) {
            Object value = provider.get();
            result = singletonMap.putIfAbsent(clazz, value);
            if (result == null) {
                result = value;
            }
        }

        return (T) result;
    }
}