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
-~----------~----~----~----~------~----~------~--~---