当活动在onStart上再次销毁时调用服务

时间:2012-11-21 13:36:07

标签: android android-intent android-service

我有一个Android服务,在onStart方法中我从Intent活动中获取了许多字符串,然后执行AsynTask从Internet下载文件。

当活动正在运行时,这可以正常工作,但是当我停止活动时,这会重新启动onStart方法,但是obiusly意图为null,导致我返回nullPointerException。

我可以做什么服务不要在onStart上输入,并继续第一个asyntask来下载所有文件?

这是我的代码

    @Override
    public void onStart(Intent intent, int startId) {
        desde = intent.getIntExtra("desde", 0);
        hasta = intent.getIntExtra("hasta", 1);
        email = intent.getStringExtra("email");
        password = intent.getStringExtra("password");

        new DescargaFotos().execute();

    }

@Override
    public IBinder onBind(Intent intent) {

        return null;
    }

和Inicio.java(UI活动)

Intent iService = new Intent(contexto,


    ServiceDownloader.class);
                            iService.putExtra("desde", 0);
                            iService.putExtra("hasta", 5);
                            iService.putExtra("email", email);
                            iService.putExtra("password", password);
                            startService(iService);     

修改

新问题:

我正在使用IntentService,我绑定了这样的服务:

Intent iService = new Intent(contexto,
                                ServiceDownloader.class);

                        ServiceConnection serviceConector = new ServiceConnection() {

                            @Override
                            public void onServiceDisconnected(ComponentName name) {
                                Log.i("INFO", "Service bound ");
                            }

                            @Override
                            public void onServiceConnected(ComponentName name,
                                    IBinder service) {
                                Log.i("INFO", "Service Unbound ");
                            }
                        };

                        iService.putExtra("desde", 0);
                        iService.putExtra("hasta", 50);
                        iService.putExtra("email", email);
                        iService.putExtra("password", password);
                        startService(iService);
                        bindService(iService, serviceConector,
                                Context.BIND_AUTO_CREATE);

现在我的问题是,在我的Galaxy nexus中,如果我进入app运行时列表,并销毁我的应用程序,服务停止,并停止下载,停止发送通知等?我该如何绑定服务来解决这个问题?

3 个答案:

答案 0 :(得分:2)

使用IntentService。 IntentService专门设计用于执行您想要的操作。您不必实现onStart,onStartCommand等。该工作在后台线程上运行。一旦工作完成,线程就会被破坏。

无论活动的状态如何,IntentService都将继续运行。

您可能遇到的一个问题是您在“活动”中的错误位置发送了您的意图,或者您没有检查操作是否完整。在发送Intent之前,请检查SharedPreferences中的标志(如果该标志不存在,则表示您是第一次启动)。发送Intent时,在SharedPreferences中存储一个标志以指示您发送了它。当您的IntentService收到Intent时,让它更新标志以表明它已收到它。在IntentService完成之前,让它再次更新标志。等等。

答案 1 :(得分:1)

我没有评论你的问题的声誉,所以我会写一个答案:)

首先,在我看来,如果您的服务只是这样做,从互联网上获取一些字符串和下载文件,您就不需要该服务。 AsyncTaks足以解决您的问题,并且实现起来更简单。这样做可以避免意图问题。

From Android API:

  

AsyncTask可以正确,轻松地使用UI线程。该类允许执行后台操作并在UI线程上发布结果,而无需操纵线程和/或处理程序。

但是,如果您决定继续使用某项服务,那么我就知道您的活动中何时调用了startService。

如果您对何时使用AsyncTask,Service,IntentService和Thread有疑问, link 可以为您提供帮助。

答案 2 :(得分:0)

这是我的建议......

在服务中使用线程而不是AsyncTask,因为AsynTask应该只用于小任务。检查AsyncTask javadoc的以下声明:

  

AsyncTask旨在成为围绕ThreadHandler的帮助程序类   并不构成通用的线程框架。 AsyncTasks   理想情况下应该用于短期操作(几秒钟的时间)   大多数。)如果你需要保持线程长时间运行,   强烈建议您使用提供的各种API   java.util.concurrent pacakge,例如ExecutorThreadPoolExecutor和   FutureTask

所以从你开始检查你的线程的状态,如果它正在运行然后不做任何事情,如果它没有运行然后启动将下载你的图像的线程......