ANDROID: inside Service class, executing a method for Toast (or Status Bar notification) from schedu

Posted by Peter SHINe ??? on Stack Overflow See other posts from Stack Overflow or by Peter SHINe ???
Published on 2010-04-30T03:58:14Z Indexed on 2010/04/30 4:07 UTC
Read the original article Hit count: 182

Filed under:
|

I am trying to execute a {public void} method in Service, from scheduled TimerTask which is periodically executing.

This TimerTask periodically checks a condition. If it's true, it calls method via {className}.{methodName};

However, as Java requires, the method needs to be {pubic static} method, if I want to use {className} with {.dot}

The problem is this method is for notification using Toast(Android pop-up notification) and Status Bar To use these notifications, one must use

Context context = getApplicationContext();

But for this to work, the method must not have {static} modifier and resides in Service class.

So, basically, I want background Service to evaluate condition from scheduled TimerTask, and execute a method in Service class.

Can anyone help me what's the right way to use Service, invoking a method when certain condition is satisfied while looping evaluation?

Here are the actually lines of codes:

The TimerTask class (WatchClipboard.java) :

public class WatchClipboard extends TimerTask {

    //DECLARATION
    private static GetDefinition getDefinition = new GetDefinition();

    @Override
    public void run() {
        if (WordUp.clipboard.hasText()) {
            WordUp.newCopied = WordUp.clipboard.getText().toString().trim().toLowerCase();
            if (!(WordUp.currentCopied.equals(WordUp.newCopied))) {
                WordUp.currentCopied = WordUp.newCopied;    Log.v(WordUp.TAG, WordUp.currentCopied);

                getDefinition.apiCall_Wordnik();

                FetchService.instantNotification();   //it requires this method to have {static} modifier, if I want call in this way.
            }
        }       
    }
}

And the Service class (FetchService.java) : If I change the modifier to static, {Context} related problems occur

public class FetchService extends Service {
    public static final String TAG = "WordUp";  //for Logcat filtering


    //DECLARATION
    private static Timer runningTimer;
    private static final boolean THIS_IS_DAEMON = true;

    private static WatchClipboard watchClipboard;
    private static final long DELAY = 0;
    private static final long PERIOD = 100;

    @Override
    public IBinder onBind(Intent arg0) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void onCreate() {    Log.v(WordUp.TAG, "FetchService.onCreate()");
        super.onCreate();

        //TESTING SERVICE RUNNING
        watchClipboard = new WatchClipboard();
        runningTimer = new Timer("runningTimer", THIS_IS_DAEMON);
        runningTimer.schedule(watchClipboard, DELAY, PERIOD);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();

        runningTimer.cancel();

        stopSelf(); Log.v(WordUp.TAG, "FetchService.onCreate().stopSelf()");
    }

    public void instantNotification() {   //If I change the modifier to static, {Context} related problems occur
        Context context = getApplicationContext();  // application Context

        //use Toast notification: Need to accept user interaction, and change the duration of show
        Toast toast = Toast.makeText(context, WordUp.newCopied+": "+WordUp.newDefinition, Toast.LENGTH_LONG);
        toast.show();

        //use Status notification: need to automatically expand to show lines of definitions
        NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

        int icon = R.drawable.icon;        // icon from resources
        CharSequence tickerText = WordUp.newCopied; // ticker-text
        long when = System.currentTimeMillis(); // notification time
        CharSequence contentTitle = WordUp.newCopied;   //expanded message title
        CharSequence contentText = WordUp.newDefinition;    //expanded message text

        Intent notificationIntent = new Intent(this, WordUp.class);
        PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);

        // the next two lines initialize the Notification, using the configurations above
        Notification notification = new Notification(icon, tickerText, when);
        notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);

        mNotificationManager.notify(WordUp.WORDUP_STATUS, notification);
    }
}

© Stack Overflow or respective owner

Related posts about android

Related posts about java