Android如何在不同的线程中运行服务

时间:2014-05-06 11:44:59

标签: android multithreading service

我认为这可能是重复但我无法找到任何可以回答我问题的内容。我知道服务在应用程序的同一个线程中工作。我想从服务中运行一些任务,但是在另一个线程中。 我有几点我必须连续跟踪gps,每当我到达这一点时,我必须做一些其他任务(非常快的)。为此,我使用BroadcastReceiver。一切都很完美,但现在我想把所有这些都放在一个不同的线程中。我怎样才能做到这一点?我的意思是我尝试了但是我一直得到错误"无法在没有调用Looper.prepare()"的线程内创建处理程序。我查找了一些修复,但它们似乎都不适合或者是正确的编程方式(其中很少看起来像修复但是以一种非常糟糕的方式)。 我将发布一些代码,以便您可以将其与您的解决方案集成。提前感谢您的帮助。

public class MyService extends Service {

    private final IBinder mBinder = new MyBinder();

        ...

    @Override
    public void onCreate() {
        ...
    }

    @Override
    public IBinder onBind(Intent arg0) {
        return mBinder;
    }

    public class MyBinder extends Binder {
        MyService getService() {
            return MyService.this;
        }
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        ....
        (my tasks)
        ....
        return(START_REDELIVER_INTENT);
    }

        ............

        (final method that calls stopSelf() after it's done)

        ............

        @Override
    public void onDestroy() {
        Log.i("onDestroy", "Service stop");
        super.onDestroy();
    }
}

3 个答案:

答案 0 :(得分:2)

这样做的简单和最好的方法是使用IntentService和基类而不是Service。

public class MyService extends IntentService {

    public MyService(String name) {
        super("");
    }

    @Override
    protected void onHandleIntent(Intent intent) {

        /*
         * Do Your task here, service will automatically stop as your task
         * complete. And your task will run in worker thread rather main thread.
         * Everything will handled by IntentService.
         */
    }

}

您可以找到完整的IntenetService演示Here

答案 1 :(得分:2)

您可以将服务设为separate process。然后它将在自己的process中运行。为此,只需在process attribute中添加Android Manifest

    <service
        android:name="<serviceName>"
        android:process=":<processName>" />

别忘了在进程名称

之前添加:

答案 2 :(得分:0)

IntentService类提供了一个简单的结构,用于在单个后台线程上运行操作。这使它能够处理长时间运行的操作,而不会影响用户界面的响应能力。此外,IntentService不受大多数​​用户界面生命周期事件的影响,因此它会在关闭AsyncTask的情况下继续运行

IntentService有一些限制:

它无法直接与您的用户界面进行交互。要将结果放在UI中,您必须将它们发送到活动。 工作请求按顺序运行。如果某个操作在IntentService中运行,并且您向其发送另一个请求,则该请求将一直等到第一个操作完成。 在IntentService上运行的操作不能被中断。

有关详细信息和示例,请参阅文档: https://developer.android.com/training/run-background-service/create-service.html

示例src代码:https://developer.android.com/shareables/training/ThreadSample.zip