来自android活动的JAVAFX Glon执行视图

来自android活动的JAVAFX Glon执行视图,javafx,google-cloud-messaging,gluon,Javafx,Google Cloud Messaging,Gluon,在我之前的问题之后 我想在消息到达时通知用户。 最近我使用NotificationCompat 当用户触摸通知栏中的通知时,它必须直接打开相关视图(DirectMessageView)。 我已经在androidmanifest.xml中的receive标记上配置了一个活动类(NotificationActivy extends activity),并在方法“onCreate”上调用DirectMessageView及其presenter 当用户在通知时触摸消息时,它不会显示DirectMessa

在我之前的问题之后

我想在消息到达时通知用户。 最近我使用NotificationCompat

当用户触摸通知栏中的通知时,它必须直接打开相关视图(DirectMessageView)。 我已经在androidmanifest.xml中的receive标记上配置了一个活动类(NotificationActivy extends activity),并在方法“onCreate”上调用DirectMessageView及其presenter

当用户在通知时触摸消息时,它不会显示DirectMessageView,但会调用presenter内部的方法,并且视图不可见。也许这是我的错误实现,请帮助

以下是我创建的类

扩展MobileApplication的SKSApplication类

public class SKSApplication extends MobileApplication{
   private static SKSApplication instance;
   public static final String DIRECT_MESSAGE_VIEW = "DIRECT_MESSAGE_VIEW";
   public static final String GROUP_MESSAGE_VIEW = "GROUP_MESSAGE_VIEW";
private ViewRefresh activeView;

   public SKSApplication() {
       instance = this;
   }

   public static SKSApplication getInstance() {
       return instance;
   }

@Override
public void init() {
   addViewFactory(HOME_VIEW, () -> {
        HomeView homeView = new HomeView();
        homePresenter = (HomePresenter) homeView.getPresenter();
        return (View) homeView.getView();
    });

    addViewFactory(DIRECT_MESSAGE_VIEW, () -> {
        DirectMessageView directMessageView = new DirectMessageView();
        return (View) directMessageView.getView();
    });

    addViewFactory(GROUP_MESSAGE_VIEW, () -> {
        GroupMessageView groupMessageView = new GroupMessageView();
        return (View) groupMessageView.getView();
    });

    public void doRefreshMessageUI(Object objectModel) {
    System.out.println("SKSApplication.doRefreshMessageUI " + getView().getName());
    if (getActiveView() != null)
        getActiveView().doRefresh(objectModel);
}

public ViewRefresh getActiveView() {
    return activeView;
}

public void setActiveView(ViewRefresh activeView) {
    this.activeView = activeView;
}
 }
类别MyGCMListenerService

public class MyGCMListenerService extends GcmListenerService {
private final String NOTIFICATION_TAG = "NotificationExample";

public MyGCMListenerService() {
}

@Override
public void onMessageReceived(String from, Bundle data) {
String varMessage = data.getString("message");
    try {
        JSONObject json = new JSONObject(varMessage);

        String messageContent = getStringFromJSON(json, "message");
        Integer senderId = getIntegerFromJSON(json, "senderId");
        String senderName = getStringFromJSON(json, "senderName");
        String comId = getStringFromJSON(json, "communityId");
        String salesGroup = getStringFromJSON(json, "salesGroup");
        Integer messageType = getIntegerFromJSON(json, "type");

        doViewNotification(messageType, senderName, salesGroup);
     SKSApplication.getInstance().doRefreshMessageUI(messageContent,senderId,senderName,comId );
    } catch (JSONException e) {
        e.printStackTrace();
    }
}

private void doViewNotification(Integer messageType, String senderName, String salesGroup) {
    StringBuilder msg = new StringBuilder()
            .append("Message from ")
            .append(senderName)
            .append(" @").append(salesGroup);


    Intent resultIntent = new Intent(FXActivity.getInstance(), NotificationActivity.class);
    resultIntent.putExtra(Constants.EXTRA_INTENT.MESSAGE_TYPE.getValue(), messageType);

    PendingIntent resultPendingIntent =
            PendingIntent.getActivity(
                    FXActivity.getInstance(),
                    0,
                    resultIntent,
                    PendingIntent.FLAG_UPDATE_CURRENT
            );

    Uri uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

    long[] v = {500, 1000};


    NotificationCompat.Builder builder =
            new NotificationCompat.Builder(this)
                    .setSound(uri)
                    .setSmallIcon(FXActivity.getInstance().getApplicationInfo().icon)
                    .setContentTitle(getApplicationName(FXActivity.getInstance().getApplicationContext()))
                    .setVibrate(v)
                    .setContentText(msg.toString())
                    .setPriority(Notification.PRIORITY_DEFAULT)
                    .setNumber(100)
                    .setWhen(System.currentTimeMillis())
                    .setContentIntent(resultPendingIntent)
                    .setAutoCancel(true)
                    .addAction(FXActivity.getInstance().getApplicationInfo().icon, "Action", null);

    NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ECLAIR) {
        notificationManager.notify(NOTIFICATION_TAG, 0, builder.build());
    } else {
        notificationManager.notify(NOTIFICATION_TAG.hashCode(), builder.build());
    }

}
}
布局xml文件(directmessage.fxml)

类DirectMessagePresenter

public class DirectMessagePresenter implements Initializable, ViewRefresh{
    @Override
public void initialize(URL location, ResourceBundle resources) {
    {
        directMessageView.showingProperty().addListener((observable, oldValue, newValue) -> {
        if (newValue) {
            SKSApplication.getInstance().setActiveView(this);
            doViewMessage();
        }
   });
    }

    private void doViewMessage() {
    listMessage.getItems().clear();

    MessageStoryHelper hlp = new MessageStoryHelper();
    List<MessageModel> ls = null;
    try {
        ls = hlp.getMessages(Constants.MESSAGE_TYPE.DIRECT);
    if (ls != null && ls.size() != 0)
        for (MessageModel m :ls)
            listMessage.add(m);

    } catch (SQLException e) {
        e.printStackTrace();
    }

}
}
它正在工作,但没有可见的视图

SKSApplication.getInstance().switchView(SKSApplication.DIRECT_MESSAGE_VIEW);
也许使用下面这行,但是如何设置Glion视图setContentView? 或者检索视图ID和setContentView

DirectMessageView directMessageView = new DirectMessageView();
                Parent v = directMessageView.getView();
                FXActivity.getInstance().setContentView(?????????);
        }
}
任何帮助都将不胜感激


提前感谢您

假设您的应用程序正在运行,这对我很有用:

将消息发送回视图后,需要通过调用
finish()
关闭通知活动:

注意:您不需要创建
SKSApplication
的单例实例,您可以随时通过调用
MobileApplication.getInstance()
来检索它的实例

可以在
SKSApplication
中使用
Platform.runLater()
将消息传递给视图,因为您没有在JavaFX线程上运行

要检索相应的视图,只需切换到该视图:

public void doRefreshMessageUI(String msg) {
    Platform.runLater(() -> {
        messagesView.messageProperty().set(msg);
        switchView(DIRECT_MESSAGE_VIEW);
    });
}
如果视图具有绑定到其任何控件文本属性的
StringProperty

private StringProperty message = new SimpleStringProperty();

public StringProperty messageProperty() {
    return message;
}

假设应用程序正在运行,这对我来说是可行的:

将消息发送回视图后,需要通过调用
finish()
关闭通知活动:

注意:您不需要创建
SKSApplication
的单例实例,您可以随时通过调用
MobileApplication.getInstance()
来检索它的实例

可以在
SKSApplication
中使用
Platform.runLater()
将消息传递给视图,因为您没有在JavaFX线程上运行

要检索相应的视图,只需切换到该视图:

public void doRefreshMessageUI(String msg) {
    Platform.runLater(() -> {
        messagesView.messageProperty().set(msg);
        switchView(DIRECT_MESSAGE_VIEW);
    });
}
如果视图具有绑定到其任何控件文本属性的
StringProperty

private StringProperty message = new SimpleStringProperty();

public StringProperty messageProperty() {
    return message;
}

可能重复-谢谢,我需要在NotificationActivity初始化后调用Android活动中的Gluon视图。在android活动上有一个setContentView。但我还不知道如何让Glion View能够设置为android setContentView。也许我错过了一些实现,我发现您可以像这样设置ContentView:'FXActivity.getInstance().setContentView(R.layout.defaultlayout);'我将一个布局文件从android eclipse项目复制到我的javafxports eclipse项目,并将其复制到我的项目文件夹中的res/layout文件夹中。您需要一个“import com.example.R;”匹配您的包,以便可以解析“R.layout.defaultlayout”。您的类需要“扩展活动”可能重复-谢谢,我需要在NotificationActivity初始化后调用Android活动内部的Gluon视图。在android活动上有一个setContentView。但我还不知道如何让Glion View能够设置为android setContentView。也许我错过了一些实现,我发现您可以像这样设置ContentView:'FXActivity.getInstance().setContentView(R.layout.defaultlayout);'我将一个布局文件从android eclipse项目复制到我的javafxports eclipse项目,并将其复制到我的项目文件夹中的res/layout文件夹中。您需要一个“import com.example.R;”匹配您的包,以便可以解析“R.layout.defaultlayout”。你的班级需要“扩展活动”
public class NotificationActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        ((SKSApplication) MobileApplication.getInstance()).doRefreshMessageUI("Hi from NotificationActivity");

        finish();
    }

}
public void doRefreshMessageUI(String msg) {
    Platform.runLater(() -> {
        messagesView.messageProperty().set(msg);
        switchView(DIRECT_MESSAGE_VIEW);
    });
}
private StringProperty message = new SimpleStringProperty();

public StringProperty messageProperty() {
    return message;
}