安卓服务不能独立运行

标签 android android-service

<分区>

Possible Duplicate:
Android Service makes Activity not responding

我使用服务在数据库和 View 之间同步数据。但是服务不能正常工作,每当我使用服务来处理长任务时, View 停止响应(我不能在 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();
    }

}

我尝试在客户端 Activity 中绑定(bind)此服务

//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);

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

最佳答案

虽然其他人给出了一些回应,但我不知道是否强调了重点: 虽然 Service 听起来像是会在后台自动运行的东西,但它不是。它只是一段代码,可以在不维护 UI 的情况下对 Intent 使用react。但是,UI 线程仍然为 Service 做处理。

相比之下,它看起来像您想要的,是位于后台并在后台线程中执行一些工作的Service。您将使用 Service 类来生成一个新线程,这通常是在响应某些您可以定义的 Intent 时完成的(通常在您的 onStart() 或类似的东西中).您可能会启动一个新线程,该线程实际执行更新数据库等工作,并使用您的主服务来协调该线程。

看起来您想与该服务通信,您将必须实现适当的MessengerHandler 对以保持跟踪您在 UI 和服务之间传递的消息(协调后台线程),以及(可能)某种方式(也可能是信使)在服务和后台线程之间进行协调。

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

关于安卓服务不能独立运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10647146/

相关文章:

android - 前台服务在 Android O 的打瞌睡模式下不接收位置更新

java - 如何创建一个简单/空的 Java 库项目来编译为 Unity 的 Android 服务?

android - 绑定(bind)到服务(如果存在)

android - 示例 : Communication between Activity and Service using Messaging

android - 如何注册自定义语音识别服务?

android - ProGuard 读库目录

Android Oreo WebView 在第二次加载后呈现布局太小

android - Mac 操作系统 : Android Studio quit unexpectedly on first time startup

java - 我如何每次都创建一个新文件,这样什么都不会被覆盖?

javascript - 默认 Android 浏览器上的图像 alpha