绑定本地Service并与之通信
来源:互联网 发布:sql入门到精通 编辑:程序博客网 时间:2024/05/01 16:48
当程序通过startService()和stopService()启动、关闭Service时,Service与访问者之间基本上不存在太多的关联,一次Service和访问者之间无法进行通信和数据传递。
如果Service和访问者之间需要进行方法调用或数据传递,则使用bindService()和unbindService()方法启动、关闭服务。
Context的bindService()方法的完整方法签名为:
bindService(Intent service, ServiceConnection conn, int flags)
三个参数用法如下:
1.service:通过Intent指定要启动的Service。
2.conn:该参数是一个ServiceConnection对象,用于监听访问者与Service之间的连接情况。连接成功时,将回调该对象的onServiceConnected(ComponentName name, IBinder service)方法;当断开连接时,回调该对象的onServiceDisconnected(ComponentName name)方法。
3.flags:指定绑定时是否自动创建Service(如果Service还未创建)。0为不自动创建,BIND_AUTO_CREATE为自动创建。
注意到ServiceConnection对象的onServiceConnected方法中有一个IBinder对象,该对象实现与被绑定Service之间的通信。
下面给出一个实例:
工程结构:
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.leidong.bindservice"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <service android:name=".BindService"> </service> </application></manifest>
main.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#2b2b2b"> <!--bind按钮--> <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginLeft="5pt" android:layout_marginRight="5pt" android:layout_marginTop="10pt" android:text="B I N D" android:textColor="#ffffff" android:textStyle="bold" android:background="#696969" android:id="@+id/bindButton" android:layout_gravity="center_horizontal" /> <!--unbind按钮--> <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginLeft="5pt" android:layout_marginRight="5pt" android:layout_marginTop="10pt" android:text="U N B I N D" android:textColor="#ffffff" android:textStyle="bold" android:background="#696969" android:id="@+id/unbindButton" android:layout_gravity="center_horizontal" /> <!--getServiceStatus按钮--> <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginLeft="5pt" android:layout_marginRight="5pt" android:layout_marginTop="10pt" android:text="G E T S E R V I C E S T A T U S" android:textColor="#ffffff" android:textStyle="bold" android:background="#696969" android:id="@+id/getServiceStatusButton" android:layout_gravity="center_horizontal" /></LinearLayout>
MainActivity.java
package com.example.leidong.bindservice;import android.app.Activity;import android.content.ComponentName;import android.content.Intent;import android.content.ServiceConnection;import android.os.Bundle;import android.os.IBinder;import android.view.View;import android.widget.Button;import android.widget.Toast;/** * Created by Lei Dong on 2016/9/5. */public class MainActivity extends Activity { //声明按钮 Button bind; Button unbind; Button getServiceStatus; //保持所启动的Service的IBinder对象 BindService.MyBinder myBinder; //定义一个ServiceConnection对象 private ServiceConnection connection = new ServiceConnection() { //连接成功时 @Override public void onServiceConnected(ComponentName componentName, IBinder iBinder) { System.out.println("~~~~~Connected~~~~~"); //获取Service的onBind方法返回的MyBinder对象 myBinder = (BindService.MyBinder) iBinder; } //连接失败时 @Override public void onServiceDisconnected(ComponentName componentName) { System.out.println("~~~~~Disconnected~~~~~"); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //获取程序界面中的bind、unbind、getServiceStatus按钮 bind = (Button)findViewById(R.id.bindButton); unbind = (Button)findViewById(R.id.unbindButton); getServiceStatus = (Button)findViewById(R.id.getServiceStatusButton); //创建启动Service的Intent final Intent intent = new Intent(MainActivity.this, BindService.class); //监听bind按钮点击 bind.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //绑定指定Service bindService(intent, connection, BIND_AUTO_CREATE); } }); //监听unbind按钮点击 unbind.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //解除绑定Service unbindService(connection); } }); //监听getServiceStatus按钮点击 getServiceStatus.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //获取并显示Service的count值 Toast.makeText(MainActivity.this, "Service的count值为:" + myBinder.getCount(), Toast.LENGTH_SHORT).show(); } }); }}
BindService.java
package com.example.leidong.bindservice;import android.app.Service;import android.content.Intent;import android.os.Binder;import android.os.IBinder;import android.support.annotation.Nullable;/** * Created by Lei Dong on 2016/9/5. */public class BindService extends Service { private int count; private boolean quitFlag; //定义onBinder方法所返回的对象 private MyBinder myBinder = new MyBinder(); //通过继承Binder来实现IBinder类 public class MyBinder extends Binder { public int getCount(){ //获取Service的运行状态 return count; } } @Nullable @Override public IBinder onBind(Intent intent) { System.out.println("~~~~~Service is binded~~~~~"); //返回IBinder对象 return myBinder; } @Override public void onCreate(){ super.onCreate(); System.out.println("~~~~~Service is created~~~~~"); //启动一条线程,动态地修改count状态值 new Thread(){ @Override public void run(){ while(!quitFlag){ try{ Thread.sleep(1000); }catch (InterruptedException e) { } count++; } } }.start(); } //Service被断开连接时回调该方法 @Override public boolean onUnbind(Intent intent){ System.out.println("~~~~~Service is unbinded~~~~~"); return true; } //Service被关闭之前回调 @Override public void onDestroy(){ super.onDestroy(); this.quitFlag = true; System.out.println("~~~~~Service is destroyed~~~~~"); }}
AVD效果:
点击BIND按钮,LogCat效果:
点击UNBIND按钮,LogCat效果:
点击GET SERVICE STATUS按钮,LogCat效果:
- 绑定本地Service并与之通信
- 绑定本地Service并与之通信
- 绑定本地Service并与之通信
- 绑定本地service并与之通信
- 绑定本地Service并与之通信
- 绑定本地Service并与之通信
- 绑定Service并与之通信
- 初学Android,绑定本地Service并与之通信(五十九)
- Android---42---绑定本地Service并与之通信
- 安卓绑定本地服务Service并与之通信
- Android基础——Service的使用(绑定本地Service并与之通信)
- Android笔记二十八.Service组件入门(二).绑定本地Service并与之通信
- Service学习之路(03)之绑定本地Service并与之通信
- Android笔记二十八.Service组件入门(二).绑定本地Service并与之通信
- Service学习之路(03)之绑定本地Service并与之通信
- Android菜鸟的成长笔记(18)——绑定本地Service并与之通信
- Android菜鸟的成长笔记(18)——绑定本地Service并与之通信
- android学习之绑定Service并与之通信
- Atitit. null错误的设计 使用Optional来处理null
- 海量数据处理问题
- 树之赫夫曼树
- sss
- 注释转换
- 绑定本地Service并与之通信
- 【ImageLoader】Universal-Image-Loader学习系列(一),下载及简单的使用
- ListView上拉加载加载分页数据
- ld: symbol(s) not found for architecture i386
- Acure学习
- 【ImageLoader】Universal-Image-Loader学习系列(二),ImageLoaderConfiguration的使用
- Java String 字符串
- 菜单栏的创建
- 复数类