android绑定服务到活动

时间:2012-03-26 13:36:37

标签: android service bind

我在这里看到了几个类似的例子,但似乎无法让我的服务与活动绑定。

我收到错误

  

“android.os.binderproxy无法转换为IC_CommissaryService”。

我的服务如下:

public class IC_CommissaryService extends Service 
{
    @Override
    public IBinder onBind(Intent intent) 
    {
        return mBinder;
    }

    private final IBinder mBinder = new LocalBinder();          

    public class LocalBinder extends Binder 
    {       
        IC_CommissaryService getService() 
        {
            return IC_CommissaryService.this;
        }
    }

    public int onStartCommand(Intent intent, int flags, int startId)
    {
    }

    private boolean SendOrderToServer(int orderID)
    {
        /* do stuff*/
    }

}

我的活动如下:

public class SubmitOrders extends Activity 
{
    IC_CommissaryService ICservice;

    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        Intent serviceintent = new Intent(this, IC_CommissaryService.class);
        serviceintent.putExtra("binded", true);
        bindService(serviceintent, mConnection, Context.BIND_AUTO_CREATE);
    }

    private ServiceConnection mConnection = new ServiceConnection() 
    {
        @Override
        public void onServiceConnected(ComponentName className, IBinder service) 
        {
            Log.e("TEST", "SERVICE CONNECTED");
            try
            {
                ICservice =(IC_CommissaryService.LocalBinder)service).getService();
                for(int i = 0; i < Submitorders.size(); i++)
                {
                    ICservice.SendOrderToServer(Submitorders.get(i).intValue());                                                
                }
            }
            catch(Exception ex)
            {
                Log.e("Error", "Error connecting service: " + ex.getMessage());
            } 
        }

        @Override
        public void onServiceDisconnected(ComponentName className) 
        {           
        }
    };
}

我在ICservice =(IC_CommissaryService.LocalBinder)service).getService();

行的活动中收到错误

我想我已经和其他帖子中已经提到过的人一样,所以请帮忙吗?

感谢

3 个答案:

答案 0 :(得分:1)

我遇到了同样的问题。我今天才弄明白。请查看以下<<=====注释的部分。我希望它有所帮助。

public class PracticeServiceBindingActivity extends ListActivity {
       private MyService.MyBinder service;   <<====
       ....

       private ServiceConnection connection = new ServiceConnection( ){

               public void onServiceConnected (ComponentName name, IBinder service) {
                      setService(MyService.MyBinder) service;  <<====
               ....
               }
       }

       public void onCreate(....) {

               ...
               public MyService.MyBinder getService(){     <<=====
                      return service;
               }
               public void setService(MyService.MyBinder service) {   <<=====
                      this.service = service;
               }
       }

}

答案 1 :(得分:0)

来自约束服务documentation的引用:

  

如果您的服务是您自己的应用程序的私有服务并且在该服务中运行   与客户端(这是常见的)相同的过程,你应该创建你的   接口通过扩展Binder类并返回一个实例   来自onBind()。

删除AndroidManifest.ml中的android:process属性,使服务在同一进程中运行。我今天也遇到了同样的问题。

答案 2 :(得分:0)

这些是我用来解决这个问题的抽象类: https://gist.github.com/frenchie4111/6086c6e4327d7936364a

只需使用您的服务和活动扩展这两个类(您可以轻松地将片段从片段更改为活动)。并确保在您的service / fragment onCreate中设置serviceClass,如下所示:

public void onCreate( Bundle savedInstance ) {
    super.onCreate( savedInstance );
    this.serviceClass = IC_CommissaryService.class;
}