OK, I'm stopping the service in the activity's onStop() method:

@Override
        public void onStop() {
                super.onStop();
                stopService(new Intent(this, cocarClient.getClass()));
                Log.i(TAG, "stopped service!");

        }

Now when I press the back or home buttons, the Log displays the
"stopped service" message but the "service stopped, not receiving
events" message from service onDestroy() isn't.

I think we need to clarify what's going on when the user presses the
respective buttons. What's the difference between the back and home
buttons anyways, which lifecycle methods of the activity and of the
connected service are called when they are pressed? How does the user
exit an application/activity (when she does not intend to return to
the service)?

As for the service itself, I would rather stick to it as new activites
might be added later on - and this way I get to learn about more than
one Android component.

Thanks, Lex



On Jul 1, 6:33 pm, Dianne Hackborn <[email protected]> wrote:
> You should probably stop the service in onStop().  When you press home, the
> activity will be stopped but not destroyed because the user didn't close it.
>
> Also, if you really just want to do work while this particular activity is
> in the foreground, there is no need to use a service.  The only reason to
> use a service is to keep your process running while none of its activities
> are in the foreground.
>
>
>
> On Wed, Jul 1, 2009 at 7:02 AM, Lex <[email protected]> wrote:
>
> > In addition to the posts at
>
> >http://groups.google.com/group/android-developers/browse_thread/threa...
> > I'm posting a new topic as the other one seems to be closed for
> > further discussion.
>
> > OK so I'm receiving traffic messages via UDP and processing them in a
> > new thread that is started in a service. I want to stop the thread
> > when the home or back buttons are pressed as I assume that the user is
> > then definitely closing the application (there is only one Activity).
> > With the current code the thread just doesn't stop - it looks to me as
> > if the service's onDestory() method is never called:
>
> > ********************** ReceiveThread (irrelevant code is omitted in
> > each class)
>
> > public class ReceiveThread extends Thread {
>
> >        private volatile boolean isAlive;
>
> >        private ClientService clientService;
>
> >        public ReceiveThread(ClientService service) {
> >                clientService = service;
> >                isAlive = true;
> >        }
>
> >        public void run() {
>
> >                InetAddress RTIserver;
> >                try {
> >                        RTIserver = InetAddress.getByName(host);
>
> >                        DatagramSocket socket = new DatagramSocket();
>
> >                        byte[] buf = new byte[256];
> >                        DatagramPacket packet = new DatagramPacket(buf,
> > buf.length,
> > RTIserver, port);
> >                        BinaryMessage binaryMsg = null;
>
> >                        // say hello to RTI server
> >                        ByteString hello = new ByteString(COCAR_HELLO);
> >                        packet.setData( hello.getBytes());
> >                        socket.send(packet);
>
> >                        // receive traffic data while this thread is alive
> >                        while(isAlive) {
>
> >                                packet = new DatagramPacket(new byte[256],
> > 256);
> >                                socket.receive(packet);
> >                                System.err.println("received packet!");
> >                                byte[] bytes = packet.getData();
> >                                binaryMsg =
> > BinaryMessage.parseRequest(bytes);
> >                                clientService.receiveMessage(binaryMsg);
>
> >                        }
> >                        System.err.println("while loop stopped");
> >                        socket.close();
>
> >                } catch ...
> >                }
>
> >        }
>
> >        public void kill() {
> >                isAlive = false;
> >        }
>
> > }
>
> > ************************** ClientService
>
> > public class ClientService extends Service {
>
> >        private final String COCAR_POST = "COCAR POST";
>
> >        private ReceiveThread receiveThread;
>
> >       �...@override
> >        public IBinder onBind(Intent arg0) {
> >                // TODO Auto-generated method stub
> >                return null;
> >        }
>
> >       �...@override
> >        public void onCreate() {
> >                super.onCreate();
> >                receiveThread = new ReceiveThread(this);
> >                // debug
> >                Toast.makeText(this, "CoCar Client service created",
> > Toast.LENGTH_LONG).show();
> >        }
>
> >       �...@override
> >        public void onStart(Intent intent, int startId) {
> >                super.onStart(intent, startId);
> >                receiveThread.start();
> >                Toast.makeText(this, "CoCar Client service started,
> > receiving
> > traffic events", Toast.LENGTH_LONG).show();
> >        }
>
> >       �...@override
> >        public void onDestroy() {
> >                super.onDestroy();
> >                receiveThread.kill();
> >                System.err.println("sent kill to receive thread");
> >                Toast.makeText(this, "CoCar Client service stopped, not
> > receiving
> > traffic events", Toast.LENGTH_LONG).show();
> >        }
>
> >        // receives a binary message from the receive thread and acts
> > accordingly
> >        public void receiveMessage(BinaryMessage binaryMsg) {
>
> >                if(
> > (binaryMsg.getCocarDirective().getText().toUpperCase().equals
> > (COCAR_POST))
> >                         ||
>
> > binaryMsg.getCocarDirective().substring(0,10).getText().toUpperCase
> > ().equals(COCAR_POST)) {
> >                                createTrafficMessage(binaryMsg);
> >                                // TODO: add new message to overlay, update
> > map etc
> >                }
>
> >        }
>
> >        // creates a traffic message from a binary one
> >        private TrafficMessage createTrafficMessage(BinaryMessage binaryMsg)
> > {
> >                TrafficMessage trafficMsg =  new TrafficMessage(binaryMsg);
> >                // debug
> >                trafficMsg.printToLog();
> >                return trafficMsg;
> >        }
>
> > }
>
> > *************************** Activity
>
> > public class HelloMapView extends MapActivity implements
> > OnClickListener {
>
> >        /** Called when the activity is first created. */
> >       �...@override
> >        public void onCreate(Bundle savedInstanceState) {
> >                super.onCreate(savedInstanceState);
> >                setContentView(R.layout.main);
>
> >                initMap();
> >                initLocationManager();
> >                createAndShowTrafficMessage();
>
> >                cocarClient = startService(new Intent(this,
> > ClientService.class));
>
> >        }
>
> >       �...@override
> >        public void onPause() {
> >                super.onPause();
> >                locManager.removeUpdates(locListener);
>
> >        }
>
> >       �...@override
> >        // use case: if someone is calling and hangs up, after we get back
> > to
> > our activity,
> >        // gps won't be sending the new signals as the locationListener is
> > still removed
> >        public void onResume() {
> >                super.onResume();
>
> >  locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0,
> > 0, locListener);
>
> >        }
>
> >       �...@override
> >        public void onDestroy() {
> >                super.onDestroy();
> >                stopService(new Intent(this, cocarClient.getClass()));
> >                System.err.println("stopped service!");
> >        }
>
> > }
>
> > Mark Murphy instructed me to use Log instead of Toast, will fix that.
>
> --
> Dianne Hackborn
> Android framework engineer
> [email protected]
>
> Note: please don't send private questions to me, as I don't have time to
> provide private support, and so won't reply to such e-mails.  All such
> questions should be posted on public forums, where I and others can see and
> answer them.
--~--~---------~--~----~------------~-------~--~----~
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]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to