Data Sharing
Overview
The Intents API is accessible through io.intents()
.
Finding Intents
To find all registered intents, use the all()
method:
io.intents().all();
Raising Intents
To raise an Intent, use the raise()
method:
io.intents().raise("ShowChart");
The raise()
method accepts an Intent name as a String
or an IntentRequest
instance as an argument.
Targeting Intent Handlers
When raising an Intent, optionally target one or more IntentHandler
instances using the withTarget()
method of the IntentRequest
builder:
Intent intent = io.intents().all()
.toCompletableFuture().join()
.get("ShowChart");
IntentHandler intentHandler = intent.getHandlers().get(0);
IntentRequest intentRequest =
IntentRequest.intent(intent.getName())
.withTarget(IntentTarget.application(intentHandler.getApplicationName()))
.build();
io.intents().raise(intentRequest);
The IntentTarget
can be created using one of the following factory methods:
Method | Accepts | Description |
---|---|---|
startNew() |
- |
Will start a new instance of the first available Intent handler. |
reuse() |
- |
Will reuse the first available running instance of an Intent handler or fallback to startNew() if there are no running instances available. |
application() |
String |
Will start a new instance of a specific Intent handler app. |
instance() |
String |
Will reuse a specific running instance of an Intent handler. |
The default value for the Intent request target is startNew()
when an Intent handler app is available. If the Intent has only been registered dynamically, the default value is reuse()
.
Context
Passing Initial Context
To pass initial context to the Intent handler, use the withContext()
method of the IntentRequest
builder. Pass the context type as a first String
argument and the context data as a second generic type argument:
Map<String, Object> contextData =
Collections.singletonMap("data",
Collections.singletonMap("RIC", "MSFT"));
Map<String, Object> options = new LinkedHashMap<>();
options.put("width", 300);
options.put("height", 200);
io.intents().raise(
IntentRequest.intent("ShowChart")
.withTarget(IntentTarget.startNew())
.withContext(
// Context type.
"Instrument",
contextData)
.withOptions(options)
.build()
);
The withOptions()
method of the IntentRequest
builder is used to pass custom app startup options to the Intent handler. It accepts a Map<String,Object>
value as an argument.
Handling Context Updates
To handle the context data passed when an Intent is raised and targeted at your app, use the addIntentListener()
method. Pass the intent name as a first String
argument and an IntentContextHandler
as a second:
io.intents().addIntentListener("ShowChart", context -> {
context.getType().ifPresent(contextType -> {
switch (contextType) {
case "Instrument": {
Map<String, Object> data = context.getData();
// App-specific logic for handling the new context data.
break;
}
}
});
// Optionally return a result to the caller.
return Collections.emptyMap();
});
Registering Intents at Runtime
To register an Intent at runtime, use addIntentListener()
method. Pass an IntentListenerRequest
as a first argument and an IntentContextHandler
as a second:
IntentListenerRequest<Map<String, Object>> intent =
IntentListenerRequest.intent("ShowChart", ReifiedType.OBJECT_MAP)
.withContextTypes(Collections.singletonList("Instrument"))
.withDisplayName("Instrument Chart")
.build();
io.intents().addIntentListener(intent, (context) -> {
context.getType().ifPresent(contextType -> {
switch (contextType) {
case "Instrument": {
Map<String, Object> data = context.getData();
// App-specific logic for handling the new context data.
break;
}
}
});
// Optionally return a result to the caller.
return Collections.emptyMap();
});
⚠️ Note that when you register an Intent only at runtime (the Intent isn't defined in the app definition file), your app must be running in order to handle the Intent. If your app isn't running when this Intent is raised, it won't be available as a possible Intent handler.