【问题标题】:Android java - how to make Activity wait until Service is binded?Android java - 如何让 Activity 等到服务绑定?
【发布时间】:2013-07-23 08:36:47
【问题描述】:

每个示例都有服务绑定 onStart() 并在一段时间内从服务调用方法(如 onClick 之后)。直到确定绑定了 onClick 服务。

我遇到的问题是服务需要一段时间才能被绑定并且它是异步绑定的。 因此,如果我启动需要立即从 Service 获取一些数据的 Activity - 它会崩溃,因为它尚未绑定。所以我需要让我的活动等待它的连接完成。我该怎么做?

【问题讨论】:

    标签: java android service binding


    【解决方案1】:

    您可以利用 pendingList 变量来处理这种情况:

    private ICoreService mService;
    private boolean mConnected = false;
    private boolean mConnecting = false;
    private List<Something> mPendingTasks = new ArrayList<Something>;
    
    private void bindService() {     
            try {
                Intent service = new Intent();
                service.setClassName(Constants.THE_SERVICE_PACKAGE_NAME, Constants.THE_SERVICE_FULL_NAME);
                mContext.bindService(service, mServiceConnection, Context.BIND_AUTO_CREATE);
                mConnecting = true;
            } catch (Exception e) {
                  //handle exception
            }        
    }
    
    public void serviceDoSomething(Something task) {
        try {
            if (mService == null) {
                synchronized (mPendingTasks) {
                    mPendingTasks.add(task);
                }
            } else {
                mService.doSomething(task);
            }
        } catch (Exception e) {
           //handle exception
        }
    }
    
    private ServiceConnection mServiceConnection = new ServiceConnection() {
    
        @Override
        public void onServiceDisconnected(ComponentName name) {
            mConnected = false;
            mConnecting = false;
            mService = null;
        }
    
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            mConnected = true;
            mConnecting = false;
            mService = ICoreService.Stub.asInterface(service);
            drainPendingTasks();
        }
    };
    
    private void drainPendingTasks() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (mPendingTasks) {
                    try {
                        if (!mPendingTasks.isEmpty()) {
                            for (Something task : mPendingTasks) {
                                mService.doSomething(task);
                            }
                            mPendingTasks.clear();
                        }
                    } catch (Exception e) {
                        //handle exception
                    }
                }
            }
        }).start();
    }
    

    【讨论】:

      【解决方案2】:

      我想你想要那个:http://developer.android.com/guide/components/bound-services.html

      在此页面上您可以找到:

      /** Defines callbacks for service binding, passed to bindService() */
      private ServiceConnection mConnection = new ServiceConnection() {
      
          @Override
          public void onServiceConnected(ComponentName className,
                  IBinder service) {
              // We've bound to LocalService, cast the IBinder and get LocalService instance
              LocalBinder binder = (LocalBinder) service;
              mService = binder.getService();
              mBound = true;
          }
      
          @Override
          public void onServiceDisconnected(ComponentName arg0) {
              mBound = false;
          }
      };
      

      onServiceConnected 方法在服务准备就绪时调用,您可以在里面进行操作(或使用 mBound 属性)。

      要绑定到您的服务,请使用:

          // Bind to LocalService
          Intent intent = new Intent(this, LocalService.class);
          bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
      

      【讨论】:

      • 是的,我知道。但是如果你尝试做类似 localService.myMethod(); - 你的活动将崩溃,因为绑定不会立即发生,如果你问 mBound 是真还是假 - 它肯定是假的。当 mBound 为真时,我需要某种监听器,以便 Activity 可以继续
      • 然后您可以将您的代码直接放入onServiceConnected。这有什么问题?
      • 太棒了!现在这就是我正在寻找的答案!)我刚刚将所有活动移到那里
      • 好吧,我接受了,但答案不在我的问题上。我的问题是关于如何让活动等待绑定
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多