来自android活动的JAVAFX Glon执行视图
在我之前的问题之后 我想在消息到达时通知用户。 最近我使用NotificationCompat 当用户触摸通知栏中的通知时,它必须直接打开相关视图(DirectMessageView)。 我已经在androidmanifest.xml中的receive标记上配置了一个活动类(NotificationActivy extends activity),并在方法“onCreate”上调用DirectMessageView及其presenter 当用户在通知时触摸消息时,它不会显示DirectMessageView,但会调用presenter内部的方法,并且视图不可见。也许这是我的错误实现,请帮助 以下是我创建的类 扩展MobileApplication的SKSApplication类来自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
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;
}