Alright, I wrote my service as per the discussion, but somehow it is not
running. Here is my piece of code:

public class BootCompletedIntentReceiver extends IntentReceiver {
  /* the intent source*/
  static final String ACTION = "android.intent.action.BOOT_COMPLETED";
  private static final String LOG_TAG = "BootCompletedIntentReceiver";
  @Override
  public void onReceiveIntent(Context context, Intent intent) {
    if (intent.getAction().equals(ACTION))
    {
      Intent i = new Intent();
      i.setClassName("com.jaikishan.smartaddress",
"com.jaikishan.smartaddress.AddressLoggerIntent");
      // We want the alarm to go off 5 seconds from now.. //Ideally it will
be 30 minutes or so.
      long firstTime = SystemClock.elapsedRealtime();
      // Schedule the alarm!
      AlarmManager am = (AlarmManager)context.getSystemService("alarm");
      am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
                      firstTime, 5*1000, intent);

      Log.v(LOG_TAG,"AddressLoggerIntent Sent");

    }
  }
}


public class AddressLoggerIntent extends IntentReceiver
{
    private static final String LOG_TAG = "AddressLoggerIntent";
    @Override
    public void onReceiveIntent(Context context, Intent intent)
    {
        // Start up the service.  Note that if the service is taking too
long
        // to complete -- longer than our alarm's repeat rate -- then this
will
        // just leave the current service running, skipping this alarm.  For
        // most situations this is probably a reasonable thing to do.
        context.startService(new Intent(context,
AddressLoggerService.class),
                null);
        Log.v(LOG_TAG,"AddressLoggerService Sent");
    }
}

public class AddressLoggerService extends Service {
   private static final String LOG_TAG = "AddressLoggerService";
  @Override
  protected void onStart(int startId, Bundle arguments) {
    super.onStart( startId, arguments );
    Log.v(LOG_TAG, "AddressLogger Service Started");
    // Do the processing
    }
  }

  @Override
  public IBinder onBind(Intent intent) {
    return null;
  }
}

>From my BootIntentReceiver, I set the alarm Manager. Since Alarm Manager can
only send broadcast, I have an intent receiver for it. The intent receiver
calls a service that will run the business logic. However, when I observe
the Logcat, I see "AddressLoggerIntent Sent" message keeps getting printed
infinite times and nothing else happens. Other Log messages are never
printed. This shows that my service is not getting called at all ! (ideally
it should be called periodically). My AndroidManifest.xml file looks life:

        <application>
           <receiver android:name=".BootCompletedIntentReceiver">
            <intent-filter>
                 <action android:name="android.intent.action.BOOT_COMPLETED"
/>
                 <category android:name="android.intent.category.LAUNCHER"
/>
            </intent-filter>
        </receiver>
        <service android:name=".AddressLoggerService"/>
        <receiver android:name=".AddressLoggerIntent" />
    </application>

Any help will be greatly appreciated.

On Mon, Jul 14, 2008 at 8:00 AM, hackbod <[EMAIL PROTECTED]> wrote:

>
> In M5 the alarm manager could only send a broadcast, so you will need
> to have a receiver for that (could be the same one, checking the
> Intent action) which then starts the service.  In a future SDK you
> will be able to directly start a service.
>
> Also I would highly recommend going through the ApiDemos -- there are
> examples of services, alarms, and using the two together.
>
> On Jul 13, 2:07 pm, "Jaikishan Jalan" <[EMAIL PROTECTED]> wrote:
> > So, is this the correct way ?
> >
> > // My intent receiver which will listen for BOOT_COMPLETED Signal
> > public class AddressLogIntent extends IntentReceiver{
> >    static final String ACTION = "android.intent.action.BOOT_COMPLETED";
> >    @Override
> >    public void onReceiveIntent(Context context, Intent intent) {
> >      if (intent.getAction().equals(ACTION))
> >      {
> >          Intent AddressIntent = new
> > Intent(AddressLogIntent.this,AddressLogService.class);
> >        // We want the alarm to go off 15 seconds from now.
> >        long firstTime = SystemClock.elapsedRealtime();
> >
> >        // Schedule the alarm!
> >        AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);
> >        am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, firstTime,
> > 15*1000, intent);
> >      }
> >    }
> >
> > }
> >
> > public class AddressLogService extends Service
> > {
> >     @Override
> >     protected void onCreate()
> >     {
> >        //Simply do my processing
> >     }
> >
> > }
> >
> > Is this the correct way to invoke a background process that runs after
> every
> > 15 seconds after the BOOT event is completed? I created an intentreceiver
> > for the BOOT event and then create an Alarm Manager and schedule it after
> > every 15 seconds. This alarm manager will call a service that will do my
> > processing. I expect this alarm to run infinitely until the emulator is
> > closed.
> >
> > Thanks,
> > Jaikishan
> >
> > -----Original Message-----
> > From: [email protected]
> >
> > [mailto:[EMAIL PROTECTED] On Behalf Of hackbod
> > Sent: Sunday, July 13, 2008 12:06 PM
> > To: Android Developers
> > Subject: [android-developers] Re: Running Background Process
> >
> > Yeah it is almost certainly due to the process being killed to reclaim
> > memory.  In the situation where you just have a receiver that starts a
> > thread, the process will be run as a foreground process (oom_adj=0)
> > for the time it is in onReceiveIntent(), but upon returning from that
> > the system does not consider there to be any active objects running in
> > the process so it is lowered to an empty process (oom_adj=15).
> >
> > Empty processes are killed very aggressively by the system's memory
> > management, so it is very likely for your process to be killed as
> > other things go on during boot.  If you look at the logcat output, you
> > will probably see lines in the log about your process starting, and
> > then later dying.  You can also use the command "adb dumpsys activity"
> > to see the current state of the activities and application processes
> > being managed by the system; this includes the current oom_adj values
> > for each process.
> >
> > Fwiw, a lot of memory optimization work has been done since M5 so in
> > future SDKs it is less likely for your process to be killed when
> > empty...  but leaving it in the state where the system thinks it is
> > empty but you still have stuff you want running in it is a bug, and
> > will cause problems sooner or later.
> >
> > On Jul 13, 11:13 am, JBQ <[EMAIL PROTECTED]> wrote:
> > > For a 30-minute interval, I'd recommend an alarm manager. It'll save
> > > some RAM that'll make the device more responsive for foreground
> > > applications, and it'll save you some bookkeeping (tracking a 30-
> > > minute interval through your service getting killed and restarted
> > > isn't as easy as it seems).
> >
> > > As for the apparently random behavior, I don't actually know for sure.
> > > My guess is that the system is running under enough memory pressure
> > > (which is common during boot as there are many things going on) to
> > > cause apparently inactive processes to get killed so quickly that your
> > > thread never gets a chance to run at all.
> >
> > > JBQ
> >
> > > On Jul 13, 10:43 am, "Jaikishan Jalan" <[EMAIL PROTECTED]> wrote:
> >
> > > > Thanks Mark and JBQ for your reply. Ok, ideally when the application
> > will be
> > > > released, my application will make a network request after every 30
> > minutes.
> > > > So what do you recommend? - Service or Alarm Manager? My second
> question
> > is
> > > > why the random behavior? Is there any reason behind why the thread
> > sometime
> > > > runs and sometime it does not.
> >
> > > > -Jaikishan
> >
> > > > -----Original Message-----
> > > > From: [email protected]
> >
> > > > [mailto:[EMAIL PROTECTED] On Behalf Of JBQ
> > > > Sent: Sunday, July 13, 2008 10:39 AM
> > > > To: Android Developers
> > > > Subject: [android-developers] Re: Running Background Process
> >
> > > > First, I'm not entirely sure what you're trying to achieve, but
> making
> > > > your code wake up every 15 seconds might cost your users a lot of
> > > > battery life for little result, when the user isn't actively using
> the
> > > > device. If you do some network activity every 15 seconds over a cell
> > > > network, you'll only have a few hours of battery life.
> >
> > > > You really have two options here:
> >
> > > > -if you really want to have a process stick around, you need to have
> a
> > > > Service in that process, so that the system can make the appropriate
> > > > decisions when it tries to make space for other applications. When
> the
> > > > process that hosts your service is killed, it'll eventually get
> > > > restarted automatically, so you can restart whatever you were doing
> in
> > > > the service's onCreate function. In that case, you'll find that using
> > > > a Handler is a much better idea than using Thread.sleep.
> >
> > > > -if you can work without necessarily having a process stay up all the
> > > > time, you should look at the AlarmManager, which will allow the
> system
> > > > to free the memory associated with your process between ticks.
> >
> > > > JBQ
> >
> > > > On Jul 13, 7:50 am, "Jaikishan Jalan" <[EMAIL PROTECTED]> wrote:
> > > > > Hello,
> >
> > > > > I have written an intentreceiver which gets launched when the boot
> has
> > > > > completed. In this, I run a thread in the background process which
> do
> > > > > certain task periodically. Here is my piece of code:
> >
> > > > > public class AddressLogService extends IntentReceiver{
> > > > >   /* the intent source*/
> > > > >   static final String ACTION =
> > > > > "android.intent.action.BOOT_COMPLETED";
> > > > >   @Override
> > > > >   public void onReceiveIntent(Context context, Intent intent) {
> > > > >     if (intent.getAction().equals(ACTION))
> > > > >     {
> > > > >       NewRunnable AddressLog = new NewRunnable(context);
> > > > >       Thread tr = new Thread(null,AddressLog,"Address Logger");
> > > > >       tr.start();
> > > > >     }
> > > > >   }
> >
> > > > >   private class NewRunnable implements Runnable {
> > > > >     private Context context;
> > > > >     // Initializing the Runnable Class
> > > > >     public NewRunnable(Context c){
> > > > >       context = c;
> > > > >     }
> > > > >     public void run(){
> > > > >       while(true){
> > > > >          isServerUp = true;
> > > > >          if(isServerUp ){
> > > > >             // Do some processing
> > > > >             Thread.sleep(15 * 1000);
> > > > >           }
> > > > >         }catch(Exception e){}
> > > > >       }
> > > > >     }
> > > > >   }
> >
> > > > > }
> >
> > > > > I have included the required receiver details and permission in
> > > > > AndroidManifest.xml
> > > > > The problem is when I launch my emulator, this thread sometimes run
> > and
> > > > > sometime it does not run. I have to try launching the emulator
> certain
> > > > times
> > > > > before I get this thread running. I check this by checking the
> server
> > log.
> > > > I
> > > > > am not sure why this is happening. Can any point me out why this is
> > > > > happening? Or is anyone can suggest there is any other better way
> to
> > > > > approach this task.
> >
> > > > > Thanks,
> > > > > Jaikishan
> >
>


-- 
Thanks,
Jaikishan

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[EMAIL PROTECTED]
Announcing the new M5 SDK!
http://android-developers.blogspot.com/2008/02/android-sdk-m5-rc14-now-available.html
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to