【问题标题】:Android bind service to own classAndroid将服务绑定到自己的类
【发布时间】:2011-10-23 12:34:59
【问题描述】:

我想我更像是一个设计问题,而不是“如何绑定服务”问题。我想要做的是让服务在处理蓝牙通信的单独进程中运行。此外,我有几个选项卡,在每个活动中。每个活动的处理和 UI 事件会产生简单的命令,这些命令必须通过蓝牙传递,例如“上”、“下”、“左”或“右”。由于每个选项卡活动中的结果都是相同的,我不想将每个选项卡与服务连接,并使用相同的消息处理程序。所以我创建了自己的 Handler 对象和一个“连接器”对象。但是,我不确定如何将此连接器对象与我的服务连接起来,因为它需要上下文。简单地将应用程序上下文传递给我的连接器对象并以这种方式绑定它是否有意义???

我愿意接受任何建议或提示

【问题讨论】:

    标签: android service bind handler message


    【解决方案1】:

    我建议不要在这种情况下使用绑定。实际上,我建议在大多数用例中不要绑定。尝试仅使用意图来处理您的活动和在另一个线程中运行的服务之间的所有通信。

    这意味着: 通过 .startActivity() 方法从 Activity 向服务发送命令,在 Intent 的 extras 中传递实际命令的详细信息。

    通过动态注册的广播接收器在您的活动中接收来自服务的事件和结果。您在 onResume() 中注册一个侦听器并在 Activity 中的 onPause() 中取消注册它。该服务仅通过广播发送内容 (sendBroadcast())。

    我更喜欢这种架构。它是松散耦合的,你可以跳过烦人的部分,你想知道你的每一个活动是否在他们不使用它时都正确地与你的服务解除绑定。此外,您可以避免使用 IPC 的痛苦,我认为这是一个巨大的优势。

    【讨论】:

    • 嘿 Zsombor,听起来很有趣,到目前为止我从未使用过广播接收器,尽管有 API,你有一些阅读提示吗?
    • BroadcastReceivers 的官方文档应该够用了,其实用起来也很简单。您只需告诉系统您的接收器应该接收的意图类型,然后为您的接收器编写回调 (onReceive()) 来处理这些意图,很简单。
    • 我在使用 BroadcastReceiver 时遇到的一个缺点是它不允许绑定到服务(我认为甚至不建议调用绑定的服务方法)。它只有 10 秒才能完成运行。
    • 确实,这种方法并非在所有情况下都可行。
    【解决方案2】:

    你在这里,我的例子..会让你清楚那个 LOL

    // My MyServiceInterface.aidl
    package com.mad.exam;
    interface MyServiceInterface{
         int getNumber();
    }
    
    //MyService 
    public class MyService extends Service {
    
    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        Toast.makeText(this, "Service OnBind()", Toast.LENGTH_LONG).show();
        return mBinder;
    }
    
    @Override
    public void onCreate() {
        // TODO Auto-generated method stub
        super.onCreate();
        Toast.makeText(this, "Service Created", Toast.LENGTH_SHORT).show();
    }
    
    @Override
    public void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        Toast.makeText(this, "Service Destroyed ", Toast.LENGTH_SHORT).show();
    }
    
    @Override
    public void onStart(Intent intent, int startId) {
        // TODO Auto-generated method stub
        super.onStart(intent, startId);
        Toast.makeText(this, "Service Started ", Toast.LENGTH_SHORT).show();
    }
    
    @Override
    public boolean onUnbind(Intent intent) {
        // TODO Auto-generated method stub
        return super.onUnbind(intent);
    }
    
    private final MyServiceInterface.Stub mBinder = new MyServiceInterface.Stub() {
        public int getNumber() {
            return new Random().nextInt(100);
        }
    };
    }
    
    
    //My Activity 
    public class ServiceDemo extends Activity implements OnClickListener {
    MyServiceInterface mService;
    ServiceConnection mConnection;
    Button retreive;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.service);
        retreive = (Button) findViewById(R.id.retreive);
        retreive.setOnClickListener(this);
    
        mConnection = new ServiceConnection() {
    
            public void onServiceDisconnected(ComponentName name) {
                // TODO Auto-generated method stub
    
            }
    
            public void onServiceConnected(ComponentName name, IBinder service) {
                // TODO Auto-generated method stub
    
                mService = MyServiceInterface.Stub.asInterface(service);
    
                try {
                    int i;
                    i = mService.getNumber();
                    Toast.makeText(ServiceDemo.this, "The service value is: " + String.valueOf(i),
                            Toast.LENGTH_SHORT).show();
                } catch (RemoteException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        };
    
    }
    
    public void onClick(View v) {
        // TODO Auto-generated method stub
        Log.i("My Tag", "Clicked");
        Button btn = (Button) v;
        Intent callService = new Intent(this, MyService.class);
        bindService(callService, mConnection, Context.BIND_AUTO_CREATE);
    }
    
    @Override
    protected void onStart() {
        // TODO Auto-generated method stub
        super.onStart();
        Intent callService = new Intent(this, MyService.class);
        bindService(callService, mConnection, Context.BIND_AUTO_CREATE);
    
    }
    

    }

    【讨论】:

    • 欢迎来到 Stack Overflow!在发布多个问题的复制和粘贴样板/逐字答案时要小心,这些往往被社区标记为“垃圾邮件”。例如:stackoverflow.com/questions/6399274/…
    猜你喜欢
    • 2010-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-17
    • 2017-10-16
    • 1970-01-01
    • 2016-10-11
    • 1970-01-01
    相关资源
    最近更新 更多