Android服务无法独立运行

时间:2012-05-18 05:26:08

标签: android android-service

  

可能重复:
  Android Service makes Activity not responding

我使用服务来同步数据库和视图之间的数据。但是服务不能正常工作,每当我使用服务来完成长任务时,视图停止响应(我不能在UI中做任何事件)而且我必须等待服务已经完成。这是我的服务:

public class SyncService extends Service{
private static final String TAG = "SyncService";
@Override
public void onCreate()
{       
    super.onCreate();
}

@Override
public void onDestroy()
{
    super.onDestroy();
}

@Override
public IBinder onBind(Intent intent)
{
    Log.d(TAG, "call onBind");
    return new DataManagerBinder();
}

private class DataManagerBinder extends Binder implements IUserDataManager
{
    @Override
    public void doProcess(Activity mView)
    {
        //do some long task (not touch UI thread)
        // this will cause the view not response
        syncDB();
        // update view after process completed
        mView.updateViewOnComplete();
    }

}

我尝试在客户端活动中绑定此服务

//the interface to handle binder 
IUserDataManager  viewManager = null;    
ServiceConnection serviceConnection = new ServiceConnection()
{

    @Override
    public void onServiceDisconnected(ComponentName name)
    {
        Log.i(TAG, "connection closed unexpectedly");
        viewManager = null;
    }

    @Override
    public void onServiceConnected(ComponentName name, IBinder binder)
    {
        Log.d(TAG, "serviceConnection onServiceConnected");
        viewManager = (IUserDataManager) binder;
        viewManager.doProcess(MyActivity.this);
    }
};

    Intent intent = new Intent(MyActivity.this, SyncService.class);
    bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);

请给我解决方案。提前谢谢!

3 个答案:

答案 0 :(得分:1)

阅读有关服务的docs,特别是“什么是服务?”段。该服务在主UI线程上运行。看看AsyncTask,应该解决您的问题。这里的工作是在后台线程中完成的,结果将被发送回UI线程。

答案 1 :(得分:1)

虽然其他人已作出一些回应,但我不知道是否强调了重点:   虽然Service听起来像会在后台自动运行,但不是。它只是一段代码,可以在不维护UI的情况下对意图做出反应。但是,UI线程仍然处理服务。

相比之下,它看起来像你想要的,是坐在背景中的Service,并且在后台线程中有些工作。您将使用 Service类来生成新线程,这通常是在响应某些意图时完成的,您可以定义该意图(通常在您的onStart()或类似内容中)。您可能会启动一个新线程,它实际上会更新数据库等工作,并使用您的主服务来协调该线程。

由于您似乎 希望与服务进行通信,因此您必须实施适当的MessengerHandler对来跟踪您之间传递的消息UI和服务(协调后台线程),以及(可能)某种方式(也许是信使)在服务和后台线程之间进行协调。

正如其他人所说,您还可以使用AsyncTask在UI线程上执行操作,并“无缝地”使用后台线程。

答案 2 :(得分:0)

Android会在一段时间后关闭服务以节省资源。 但是,您可以使用

之类的东西来防止这种情况发生
int onStartCommand(Intent, int, int){
return START_STICKY;
}

ref this