安卓之绑定服务之简便方法
在这里先介绍一下服务:
Service(服务)是能够在后台执行长时间运行操作并且不提供用户界面的应用程序组件。
绑定服务提供客户端—服务器接口以允许组件交互、发送请求、获得结果、甚至是使用进程间通信(IPC)跨进程完成这些操作。
当项目调用Context的bindService()来获取一个服务持久连接,这时就会回调服务中的onBind()方法。类似地,如果这个服务之前还没有创建过,onCreate()方法会先于onBind()方法执行。之后,调用方可以获取到onBind()方法返回的IBinder对象的实例,这样就能字有地和服务进行通信了。只要调用方和服务之间的连接没有断开,服务就会一直保持运行状态。
我相信还是安卓实例更清楚。
首先创建一个安卓项目。
在xml中编写如下代码:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="实现绑定服务"
android:gravity="center"
android:textSize="20sp"
/>
<Button
android:id="@+id/bind_service"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="绑定服务"
/>
<Button
android:id="@+id/unbind_service"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="解除绑定"
/>
<Button
android:id="@+id/random"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="获取随机数"
/>
<TextView
android:id="@+id/textView1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:textSize="22sp"
android:gravity="center"
/>
</LinearLayout>
创建三个按钮和一个文本框用来实现获取的数字。
接下来创建一个服务,在这里我就不详细介绍如何创建服务了,上一篇我有介绍如何运用安卓自定义创建服务。
链接: https://blog.youkuaiyun.com/jzdcuccess/article/details/105604156.这是上一篇我创建的项目。
创建名为BindSercice的服务,代码如下:
public class BindService extends Service {
int num=0;
public int getRandom(){
num=new Random().nextInt(100);
return num;
}
public class MyBinder extends Binder{
public int getRandom(){
return BindService.this.getRandom();
}
}
@Override
public IBinder onBind(Intent intent) {
return new MyBinder();
}
}
创建一个getRandom()类来实现获取随机数。
onBind:Service中的onBind方法是个抽象方法,所以Service类本身就是一个抽象类,也就是说onBind方法必须要重写,即使用不到。通过startService使用Service时,我们在重写onBind方法时,只需要将其返回值设为null即可。onBind方法主要是用于给bindService方法调用Service时才使用到。
建立内部类 Binder (MyBinder) 为了绑定客户端与服务端在Service的onBind方法中 返回Binder对象。
在onBinder对象中,我们返回的是IBinder对象(就是我们写的MyBinder)是用来定义客户端用来与服务交互的程序接口,即通过该对象可实现与绑定的Service之间的通信。而IBinder对象通常采用继承Binder的实现类的方式来实现。(就是上面我们的MyBinder采用继承Binder来实现的)。Binder可以配置不同的service服务。
然后在java中编写如下代码:
下面展示一些 内联代码片
。
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private BindService bindService;
private BindService.MyBinder myBinder;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button bind_service=(Button)findViewById(R.id.bind_service);
Button unbind_service=(Button)findViewById(R.id.unbind_service);
Button button3=(Button)findViewById(R.id.random);
bind_service.setOnClickListener(this);
unbind_service.setOnClickListener(this);
button3.setOnClickListener(this);
}
private ServiceConnection connection=new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
myBinder=(BindService.MyBinder) service; //强制转换类型
Toast.makeText(MainActivity.this,"已绑定服务",Toast.LENGTH_SHORT).show();
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.bind_service:
Intent intent=new Intent(MainActivity.this,BindService.class);
bindService(intent,connection, Context.BIND_AUTO_CREATE);
break;
case R.id.unbind_service:
unbindService(connection);
// Intent intent1=new Intent(MainActivity.this,BindService.class);
//stopService(intent1);
Toast.makeText(MainActivity.this,"解除绑定",Toast.LENGTH_SHORT).show();
break;
case R.id.random:
int num=myBinder.getRandom();
TextView textView=(TextView)findViewById(R.id.textView1);
textView.setText("获取随机数为:"+num);
break;
default:
break;
}
}
}
这样就简单创建一个绑定服务的案例:
这就大功告成了,如有错误,请斧正。
最后在添加我感觉不错的诗句。(勿喷吆。这只是自己的一点爱好)
他日若遂凌云志,敢笑黄巢不丈夫。