7

我们正在开发一个将在JVM和中使用的库Android。现在我们需要实施试用期通知。在其他平台(.Net 和 Mac)中显示弹出消息框就足够了。但到目前为止,我找不到为 Android 执行此操作的方法。

问题是要显示一些消息(toast 或 AlertDialog),我需要有一个实际的上下文。但是由于我们的库不包含 UI 元素并且与 UI 没有任何关系,因此我们不会在创建组件时要求用户传递上下文。

简而言之:

  • 如何在没有从用户代码传递的上下文引用的情况下显示 Toast(AlertDialog,Notification)。
  • 如果我不能,也许有人有更好的解决方案来在 Android 和 Java 上实现试用模式。
4

2 回答 2

3

使用抽象工厂模式

您的抽象工厂将允许您创建对话框和其他通知。然后,您将有 2 个具体实现来创建通知的 Android 版本或 JVM 版本。

例子:

/*
 * The abstract factory
 */
public abstract class NotificationFactory {
    /**
     * Pops a message up for the user.
     * 
     * @param msg
     */
    public abstract void newToast(String msg);

    // other notifications can go here
}

/**
 * Concrete Android notification factory
 * 
 */
public final class AndroidNotificationFactory extends NotificationFactory {

    private final Context context;

    public AndroidNotificationFactory(Context context) {
        this.context = context;
    }

    @Override
    public void newToast(String msg) {
        // normal Android toast stuff using the context
    }

}

/**
 * Concrete JVM Notification factory
 * 
 */
public final class JvmNotificationFactory extends NotificationFactory {

    @Override
    public void newToast(String msg) {
        // JVM toast stuff
    }

}

/**
 * A singleton used for accessing the factory.
 * 
 */
public enum Library {
    Instance;

    private NotificationFactory notificationFactory;

    public NotificationFactory getNotificationFactory() {
        // nb: add synchronized if needed
        return notificationFactory;
    }

    public void setNotificationFactory(NotificationFactory notificationFactory) {
        // nb: add synchronized if needed
        this.notificationFactory = notificationFactory;
    }

    public void InitForAndroid(Context context) {
        setNotificationFactory(new AndroidNotificationFactory(context));
    }

    public void InitForJvm() {
        setNotificationFactory(new JvmNotificationFactory());
    }
}

public class ExampleUsage {

    /**
     * @param args
     */
    public static void main(String[] args) {

        // init the library
        // Library.Instance.InitForAndroid(context); //or:
        Library.Instance.InitForJvm();

        // usage
        Library.Instance.getNotificationFactory().newToast("Test");

    }

}

对于需要能够在创建后调用方法的对话框,您需要创建一个IDialog接口以及实现该接口的具体 Android 和 JVM 包装器。

于 2012-06-25T17:03:43.350 回答
1

看来,如果没有上下文,您确实无法显示 Toast 和 AlertDialog 。最接近的变体是在您的库中提供一些用户应该实现的接口。

于 2013-07-26T18:48:26.977 回答