打印
[嵌入式linux]

Service本地服务通信的问题

[复制链接]
818|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 JY-DX-JY 于 2015-9-24 19:06 编辑

我在学习安卓,看书,第七章:服务与消息广播
本地服务通信。
新建了一个项目,布局文件里添加了三个按钮,一个启动Service,一个停止Service,一个获取数据。
定义了一个Service3子类,使它继承于Service类,主要代码如下:
public class Service3 extends Service {
        private int counter=0;
        private boolean bRunning=true;
        private mBinder binder=new mBinder();               //定义onBinder返回的对象
        
        public class mBinder extends Binder{                   //通过继承实现Binder类
                public int getCounter(){
                        return counter;
                }
        }
        @Override
        public IBinder onBind(Intent arg0){
               
                return binder;                                                      //返回IBinder对象
        }
        @Override
        public boolean onUnbind(Intent intent) {
                // TODO Auto-generated method stub
                return super.onUnbind(intent);
        }
        
        @Override
        public void onDestroy() {
                // TODO Auto-generated method stub
                super.onDestroy();
                bRunning = false;
        }
        @Override
        public void onCreate() {
                Exception e;
                // TODO Auto-generated method stub
                super.onCreate();
               
                new Thread(new Runnable() {                             //启动线程,修改counter值
                        
                        public void run() {                                             
                                // TODO Auto-generated method stub
                                 while (!bRunning) {
                            try {  
                                Thread.sleep(1000);
                            } catch (Exception e) {}  
                            counter++;
                                 }
                                
                                
                        }
                }) .start();         


        }
        
        
        
}

相关帖子

沙发
JY-DX-JY|  楼主 | 2015-9-24 19:12 | 只看该作者
在Manifest.xml文件中声明Service3,并配置<intent-filter.../>子标签,设置Action属性,代码如下:
<service android:name="Srvice3">
            <intent-filter >
                <action android:name="android.service"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </service>

在MainActivity中声明一个Intent对象用于标识目标Service,声明一个Service3.mIbind对象用于获取数据,声明ServiceConnection并实现其方法,
用于监听访问者与Service之间的连接情况,代码如下:
private Intent intent=new Intent();
        private Service3.mBinder binder;
        private ServiceConnection sConnection=new ServiceConnection(){
                public void onServiceDisconnected(ComponentName name){
                        System.out.println("--ServiceDisconnected--");
                }
                public void onServiceConnected(ComponentName name,IBinder service){
                       
                        System.out.println("--ServiceConnected--");
                binder=(Service3.mBinder)service;
                }
        };


使用特权

评论回复
板凳
JY-DX-JY|  楼主 | 2015-9-24 19:20 | 只看该作者
在MianActivity中,设置Intent所触发的Action字符串,声明3个Button控件并绑定监听,第一个用于启动Service,第二个用于停止Service,
第三个用于获取数据并使用Toast显示信息,代码如下:
setContentView(R.layout.activity_main);
                String ccb;
                intent.setAction("android.service");
               
                ccb=this.getPackageName();
                intent.setPackage(ccb);
                Button button1=(Button)findViewById(R.id.button1);
                button1.setOnClickListener(new OnClickListener(){
                        public void onClick(View v){
                       
                                bindService(intent,sConnection,BIND_AUTO_CREATE);
                               
                        }
                });
                Button button2=(Button)findViewById(R.id.button2);
                button2.setOnClickListener(new OnClickListener(){
                        public void onClick(View v){
                                unbindService(sConnection);
                        }
                });
                Button button3=(Button)findViewById(R.id.button3);
                button3.setOnClickListener(new OnClickListener(){
                        public void onClick(View v){
                                Toast.makeText(MainActivity.this,
                                                "Service的counter值为"+binder.getCounter(),
                                                Toast.LENGTH_LONG).show();
                        }
                });

使用特权

评论回复
地板
JY-DX-JY|  楼主 | 2015-9-24 19:27 | 只看该作者
可是,我运行时点击第一个按钮,出错
请高手指教,怎么解决?谢谢!

使用特权

评论回复
5
ganyy| | 2015-9-25 09:32 | 只看该作者
个人推测是不是 AndroidManifest.xml 里面的 Service标签少了个点号“.”:
<service android:name="Srvice3">
<service android:name=".Srvice3">

使用特权

评论回复
6
JY-DX-JY|  楼主 | 2015-9-25 12:46 | 只看该作者
你很厉害。少了个e
<service android:name="Service3">

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:晴天响霹雳,平地一声雷。

245

主题

3351

帖子

30

粉丝