Java/J2ME/Basics
Содержание
Basic MIDlet Shell
import javax.microedition.midlet.MIDlet;
public class BasicMIDletShell extends MIDlet {
public void startApp() {
System.out.println(getAppProperty("Model-Version"));
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}
}
Example jad file
MIDlet-Name: Hello World
MIDlet-Version: 1.0
MIDlet-Vendor: Jim
MIDlet-Description: My First MIDlet suite
MIDlet-1: HelloWorld, /greeting/myLogo.png, greeting.HelloWorld
MIDlet-Jar-URL: HelloWorld.jar
MIDlet-Jar-Size: 1428
Example MIDlet
/*
J2ME in a Nutshell
By Kim Topley
ISBN: 0-596-00253-X
*/
import java.util.Timer;
import java.util.TimerTask;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
public class ExampleMIDlet extends MIDlet {
// Flag to indicate first call to startApp
private boolean started = false;
// Background thread
private Thread thread;
// Timer interval
private int timerInterval;
// Timer
private Timer timer;
// Task to run via the timer
private TimerTask task;
// Required public constructor. Can be
// omitted if nothing to do and no other
// constructors are created.
public ExampleMIDlet() {
System.out.println("Constructor executed");
// Get the timer interval from the
// manifest or JAD file.
String interval = getAppProperty("Timer-Interval");
timerInterval = Integer.parseInt(interval);
System.out.println("Timer interval is " + interval);
}
protected void startApp() throws MIDletStateChangeException {
if (!started) {
// First invocation. Create and start
// a timer.
started = true;
System.out.println("startApp called for the first time");
startTimer();
} else {
// Resumed after pausing.
System.out.println("startApp called following pause");
}
// In all cases, start a background thread.
synchronized (this) {
if (thread == null) {
thread = new Thread() {
public void run() {
System.out.println("Thread running");
while (thread == this) {
try {
Thread.sleep(1000);
System.out.println("Thread still active");
} catch (InterruptedException ex) {
}
}
System.out.println("Thread terminating");
}
};
}
}
thread.start();
}
protected void pauseApp() {
// Called from the timer task to
// do whatever is necessary to
// pause the MIDlet.
// Tell the background thread to stop.
System.out.println("pauseApp called.");
synchronized (this) {
if (thread != null) {
thread = null;
}
}
}
protected void destroyApp(boolean unconditional)
throws MIDletStateChangeException {
// Called to destroy the MIDlet.
System.out.println("destroyApp called - unconditional = "
+ unconditional);
if (thread != null) {
Thread bgThread = thread;
thread = null; // Signal thread to die
try {
bgThread.join();
} catch (InterruptedException ex) {
}
}
stopTimer();
}
// Starts a timer to run a simple task
private void startTimer() {
// Create a task to be run
task = new TimerTask() {
private boolean isPaused;
private int count;
public void run() {
// Pause or resume the MIDlet.
System.out.println("Timer scheduled");
if (count++ == 4) {
// Terminate the MIDlet
try {
ExampleMIDlet.this.destroyApp(true);
} catch (MIDletStateChangeException ex) {
// Ignore pleas for mercy!
}
ExampleMIDlet.this.notifyDestroyed();
return;
}
if (isPaused) {
System.out.println(">> Resuming MIDlet");
ExampleMIDlet.this.resumeRequest();
isPaused = false;
} else {
System.out.println(">> Pausing MIDlet");
isPaused = true;
ExampleMIDlet.this.pauseApp();
ExampleMIDlet.this.notifyPaused();
}
}
};
// Create a timer and schedule it to run
timer = new Timer();
timer.schedule(task, timerInterval, timerInterval);
System.out.println("Timer started.");
}
// Stops the timer
private void stopTimer() {
if (timer != null) {
System.out.println("Stopping the timer");
timer.cancel();
}
}
}
Goodbye World
/*
MIDlet-Name: Hello World
MIDlet-Version: 1.0
MIDlet-Vendor: Jim
MIDlet-Description: My First MIDlet suite
MIDlet-1: HelloWorld, /greeting/myLogo.png, greeting.HelloWorld
MIDlet-2: GoodbyeWorld, /greeting/myLogo.png, greeting.GoodbyeWorld
MIDlet-Jar-URL: HelloWorld.jar
MIDlet-Jar-Size: 4048
*/
import javax.microedition.lcdui.rumand;
import javax.microedition.lcdui.rumandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.TextBox;
import javax.microedition.midlet.MIDlet;
public class GoodbyeWorld extends MIDlet implements CommandListener {
private Display display;
private TextBox textBox = new TextBox("Goodbye World", "My second MIDlet", 40, 0);
private Command quitCommand = new Command("Quit", Command.SCREEN, 1);
public void startApp() {
display = Display.getDisplay(this);
textBox.addCommand(quitCommand);
textBox.setCommandListener(this);
display.setCurrent(textBox);
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}
public void commandAction(Command choice, Displayable displayable) {
if (choice == quitCommand) {
destroyApp(false);
notifyDestroyed();
}
}
}
Hello Midlet
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class HelloMidlet extends MIDlet {
// The display for this MIDlet
private Display display;
// TextBox to display text
TextBox box = null;
public HelloMidlet() {
}
public void startApp() {
display = Display.getDisplay(this);
box = new TextBox("Simple Example", "Hello World", 20, 0);
display.setCurrent(box);
}
/**
* Pause is a no-op since there are no background activities or
* record stores that need to be closed.
*/
public void pauseApp() {
}
/**
* Destroy must cleanup everything not handled by the garbage collector.
* In this case there is nothing to cleanup.
*/
public void destroyApp(boolean unconditional) {
}
}
MIDlet lifecycle
/*
*
* Copyright (c) 2000 Sun Microsystems, Inc. All Rights Reserved.
*
* Author: Srikanth Raju
*
* This software is the confidential and proprietary information of Sun
* Microsystems, Inc. ("Confidential Information"). You shall not
* disclose such Confidential Information and shall use it only in
* accordance with the terms of the license agreement you entered into
* with Sun.
*
* SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE
* SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
* IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
* PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR ANY DAMAGES
* SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING
* THIS SOFTWARE OR ITS DERIVATIVES.
*/
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
/**
* An example MIDlet with simple "Hello" text.
* Refer to the startApp, pauseApp, and destroyApp
* methods so see how each handles the requested transition.
*/
public class ConsoleHelloMIDlet extends MIDlet
{
/**
* Start up the Hello MIDlet. Just write some info
*/
public void startApp() {
System.out.println( "\nHello Camp" );
pauseApp();
}
/**
* Pause is a no-op since there are no background activities or
* record stores that need to be closed.
*/
public void pauseApp() {
System.out.println( "In pauseApp... " );
destroyApp( true );
}
/**
* Destroy must cleanup everything not handled by the garbage collector.
* In this case there is nothing to cleanup.
*/
public void destroyApp(boolean unconditional) {
System.out.println( "In destroyApp... " );
}
}
MIDlet State Transitions
/*--------------------------------------------------
* StateTransitions.java
*
* Example from the book: Core J2ME Technology
* Copyright John W. Muchow http://www.CoreJ2ME.ru
* You may use/modify for any non-commercial purpose
*-------------------------------------------------*/
import javax.microedition.midlet.*;
public class StateTransitions extends MIDlet
{
public StateTransitions()
{
System.out.println("Inside constructor()");
}
// Required: called by application manager to start the MIDlet.
public void startApp()
{
System.out.println("Inside startApp()");
}
// Required: called by application manager to pause the MIDlet.
public void pauseApp()
{
System.out.println("Inside pauseApp()");
}
// Required: called by application manager before shutting down the MIDlet.
public void destroyApp(boolean unconditional)
{
System.out.println("Inside destroyApp()");
}
}
Simple Midlet Demo
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class MyMidlet extends MIDlet {
public MyMidlet() { // constructor
}
public void startApp() {
Canvas canvas = new MyCanvas();
Display display = Display.getDisplay(this);
display.setCurrent(canvas);
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}
}
class MyCanvas extends Canvas {
public void paint(Graphics g) {
g.setColor(255, 0, 0);
g.fillRect(0, 0, getWidth(), getHeight());
g.setColor(255, 255, 255);
g.drawString("Hello World!", 0, 0, g.TOP | g.LEFT);
}
}
Welcome Back
/*--------------------------------------------------
* WelcomeBack.java
*
* Example from the book: Core J2ME Technology
* Copyright John W. Muchow http://www.CoreJ2ME.ru
* You may use/modify for any non-commercial purpose
*-------------------------------------------------*/
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class WelcomeBack extends MIDlet implements CommandListener
{
private Display display; // Reference to Display object for this MIDlet
private List lsMain; // A List of items
private Command cmExit; // A Command to exit the MIDlet
public WelcomeBack()
{
display = Display.getDisplay(this);
cmExit = new Command("Exit", Command.SCREEN, 1);
lsMain = new List("Welcome Back", Choice.IMPLICIT);
lsMain.append("Core J2ME", null);
lsMain.addCommand(cmExit);
lsMain.setCommandListener(this);
}
// Called by application manager to start the MIDlet.
public void startApp()
{
display.setCurrent(lsMain);
}
// A required method
public void pauseApp()
{ }
// A required method
public void destroyApp(boolean unconditional)
{ }
// Check to see if our Exit command was selected
public void commandAction(Command c, Displayable s)
{
if (c == cmExit)
{
destroyApp(false);
notifyDestroyed();
}
}
}
Welcome MIDlet
/*--------------------------------------------------
* WelcomeMIDlet.java
*
* Example from the book: Core J2ME Technology
* Copyright John W. Muchow http://www.CoreJ2ME.ru
* You may use/modify for any non-commercial purpose
*-------------------------------------------------*/
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class WelcomeMIDlet extends MIDlet implements CommandListener
{
private Display display; // Reference to Display object for this MIDlet
private TextBox tbMain; // A Textbox to display a message
private Command cmExit; // A Command to exit the MIDlet
public WelcomeMIDlet()
{
display = Display.getDisplay(this);
cmExit = new Command("Exit", Command.SCREEN, 1);
tbMain = new TextBox("Welcome", "Core J2ME", 50, 0);
tbMain.addCommand(cmExit);
tbMain.setCommandListener(this);
}
// Called by application manager to start the MIDlet.
public void startApp()
{
display.setCurrent(tbMain);
}
// A required method
public void pauseApp()
{ }
// A required method
public void destroyApp(boolean unconditional)
{ }
// Check to see if our Exit command was selected
public void commandAction(Command c, Displayable s)
{
if (c == cmExit)
{
destroyApp(false);
notifyDestroyed();
}
}
}