Fields Summary |
---|
static final int | PAUSEDState of the MIDlet is Paused; it should be quiescent |
static final int | ACTIVEState of the MIDlet is Active |
static final int | PAUSED_RESUMEState of the MIDlet is Paused but Resume has been requested |
static final int | ACTIVE_PENDINGState of the MIDlet when resumed by the display manager |
static final int | PAUSE_PENDINGState of the MIDlet when paused by the display manager |
static final int | DESTROY_PENDINGState of the MIDlet with destroy pending |
static final int | DESTROYEDState of the MIDlet is Destroyed |
private static com.sun.midp.security.SecurityToken | classSecurityTokenThis class has a different security domain than the application. |
private static Object | createMIDletLockLock for creating a MIDlet. |
private static boolean | allowedToCreateMIDletLock for creating a MIDlet, default to false. |
private int | stateThe applications current state. |
private Object | mutexThe lock for changes to the state. |
private Scheduler | schedulerThe controller of MIDlets. |
protected javax.microedition.midlet.MIDlet | midletThe MIDlet for which this is the state. |
protected javax.microedition.lcdui.Display | displayThe Display for this MIDlet. |
protected com.sun.midp.lcdui.DisplayManager | displayManagerThe controller of Displays. |
Methods Summary |
---|
public int | checkPermission(java.lang.String permission)Get the status of the specified permission.
If no API on the device defines the specific permission
requested then it must be reported as denied.
If the status of the permission is not known because it might
require a user interaction then it should be reported as unknown.
return getMIDletSuite().checkPermission(permission);
|
static javax.microedition.midlet.MIDlet | createMIDlet(java.lang.String classname)Create a MIDlet without throwing a security exception.
Class midletClass;
Object midlet;
synchronized (createMIDletLock) {
try {
allowedToCreateMIDlet = true;
midletClass = Class.forName(classname);
midlet = midletClass.newInstance();
if (midlet instanceof MIDlet) {
return (MIDlet)midlet;
}
throw new InstantiationException("Class not a MIDlet");
} finally {
allowedToCreateMIDlet = false;
}
}
|
protected abstract void | destroyApp(boolean unconditional)Signals the MIDlet to terminate and enter the
DESTROYED state.
In the destroyed state the MIDlet must release
all resources and save any persistent state. This method may
be called from the PAUSED or
ACTIVE states.
MIDlet s should
perform any operations required before being terminated, such as
releasing resources or saving preferences or
state.
NOTE: The MIDlet can request that it not enter
the DESTROYED
state by throwing an MIDletStateChangeException . This
is only a valid response if the unconditional
flag is set to false . If it is true
the MIDlet is assumed to be in the DESTROYED
state regardless of how this method terminates. If it is not an
unconditional request, the MIDlet can signify that it
wishes
to stay in its current state by throwing the
MIDletStateChangeException .
This request may be honored and the destroy()
method called again at a later time.
|
public javax.microedition.lcdui.Display | getDisplay()Get the Display for this MIDlet.
return display;
|
public javax.microedition.midlet.MIDlet | getMIDlet()Get the MIDlet for which this holds the state.
return midlet;
|
public final MIDletSuite | getMIDletSuite()Provides a MIDlet with a mechanism to retrieve
MIDletSuite for this MIDlet.
return scheduler.getMIDletSuite();
|
int | getState()Get the state.
synchronized (mutex) {
return state;
}
|
public static void | initSecurityToken(com.sun.midp.security.SecurityToken token)Initializes the security token for this class, so it can
perform actions that a normal MIDlet Suite cannot.
if (classSecurityToken != null) {
return;
}
classSecurityToken = token;
|
public final void | notifyDestroyed()Used by a MIDlet to notify the application management
software that it has entered into the
DESTROYED state. The application management software will not
call the MIDlet's destroyApp method, and all resources
held by the MIDlet will be considered eligible for
reclamation.
The MIDlet must have performed the same operations
(clean up, releasing of resources etc.) it would have if the
MIDlet.destroyApp() had been called.
synchronized (mutex) {
state = DESTROYED;
mutex.notify();
}
|
public final void | notifyPaused()Used by a MIDlet to notify the application management
software that it has entered into the PAUSED state.
Invoking this method will
have no effect if the MIDlet is destroyed,
or if it has not yet been started.
It may be invoked by the MIDlet when it is in the
ACTIVE state.
If a MIDlet calls notifyPaused() , in the
future its startApp() method may be called make
it active again, or its destroyApp() method may be
called to request it to destroy itself.
int oldState;
synchronized (mutex) {
oldState = state;
// do not notify the scheduler, since there is nothing to do
setStateWithoutNotify(PAUSED);
}
// do work outside of the mutex
if (oldState == ACTIVE) {
displayManager.deactivate(getMIDlet());
}
|
protected abstract void | pauseApp()Signals the MIDlet to stop and enter the PAUSED
state.
In the PAUSED state the MIDlet must release shared
resources
and become quiescent. This method will only be called
called when the MIDlet is in the ACTIVE state.
|
public final native boolean | platformRequest(java.lang.String URL)Requests that the device handle (e.g. display or install)
the indicated URL.
If the platform has the appropriate capabilities and
resources available, it SHOULD bring the appropriate
application to the foreground and let the user interact with
the content, while keeping the MIDlet suite running in the
background. If the platform does not have appropriate
capabilities or resources available, it MAY wait to handle the
URL request until after the MIDlet suite exits. In this case,
when the requesting MIDlet suite exits, the platform MUST then
bring the appropriate application to the foreground to let the
user interact with the content.
This is a non-blocking method. In addition, this method does
NOT queue multiple requests. On platforms where the MIDlet
suite must exit before the request is handled, the platform
MUST handle only the last request made. On platforms where the
MIDlet suite and the request can be handled concurrently, each
request that the MIDlet suite makes MUST be passed to the
platform software for handling in a timely fashion.
If the URL specified refers to a MIDlet suite (either an
Application Descriptor or a JAR file), the request is
interpreted as a request to install the named package. In this
case, the platform's normal MIDlet suite installation process
SHOULD be used, and the user MUST be allowed to control the
process (including cancelling the download and/or
installation). If the MIDlet suite being installed is an
update of the currently running MIDlet suite, the
platform MUST first stop the currently running MIDlet suite
before performing the update. On some platforms, the currently
running MIDlet suite MAY need to be stopped before any
installations can occur.
If the URL specified is of the form
tel:<number> , as specified in RFC2806, then the
platform MUST interpret this as a request to initiate a voice
call. The request MUST be passed to the "phone"
application to handle if one is present in the platform.
Devices MAY choose to support additional URL schemes beyond
the requirements listed above.
Many of the ways this method will be used could have a
financial impact to the user (e.g. transferring data through a
wireless network, or initiating a voice call). Therefore the
platform MUST ask the user to explicitly acknowlege each
request before the action is taken. Implementation freedoms are
possible so that a pleasant user experience is retained. For
example, some platforms may put up a dialog for each request
asking the user for permission, while other platforms may
launch the appropriate application and populate the URL or
phone number fields, but not take the action until the user
explicitly clicks the load or dial buttons.
|
public final void | resumeRequest()Used by a MIDlet to notify the application management
software that it is
interested in entering the ACTIVE state. Calls to
this method can be used by the application management software to
determine which applications to move to the ACTIVE state.
When the application management software decides to activate this
application it will call the startApp method.
The application is generally in the PAUSED state when this is
called. Even in the paused state the application may handle
asynchronous events such as timers or callbacks.
setState(PAUSED_RESUME);
|
void | setState(int newState)Change the state and notify.
Check to make sure the new state makes sense.
Changes to the status are protected by the mutex.
Any change to the state notifies the mutex.
synchronized (mutex) {
setStateWithoutNotify(newState);
mutex.notify();
}
|
void | setStateWithoutNotify(int newState)Change the state without notifing the scheduler.
Check to make sure the new state makes sense.
To be called only by the scheduler or MIDletState while holding
the scheduler mutex.
switch (state) {
case DESTROYED:
// can't set any thing else
return;
case DESTROY_PENDING:
if (newState != DESTROYED) {
// can only set DESTROYED
return;
}
break;
case PAUSED:
if (newState == PAUSE_PENDING) {
// already paused by app
return;
}
break;
case ACTIVE:
if (newState == PAUSED_RESUME || newState == ACTIVE_PENDING) {
// already active
return;
}
}
state = newState;
|
protected abstract void | startApp()Signals the MIDlet to start and enter the ACTIVE
state.
In the ACTIVE state the MIDlet may hold resources.
The method will only be called when
the MIDlet is in the PAUSED state.
Two kinds of failures can prevent the service from starting,
transient and non-transient. For transient failures the
MIDletStateChangeException exception should be thrown.
For non-transient failures the notifyDestroyed
method should be called.
|