服务的基本用法-2

之前我们学习了启动服务和停止服务的方法,但是不知道你有没有发现,服务是在活动里启动的,但在启动了服务之后,活动与服务两者之间基本就没有什么关系了。确实如此,我们来分析一下。我们在活动里调用了startService()方法来启动MyService服务,然后MyService的onCreate()和onStartCommand()方法就会得到执行,之后服务就一直处于运行状态,具体运行的是什么逻辑,活动就不能控制了。那我们有没有什么办法可以把服务和活动给联系起来呢?当然可以,这就需要用到前面在创建MyService服务时,里面的onBind()方法了。

@Override
public IBinder onBind(Intent intent) {
    throw new UnsupportedOperationException("Not yet implemented");
}
 
比如说,我们希望在MyService服务里面提供一个下载的功能,然后在活动中可以决定何时开始下载,以及随时来查看下载的进度。实现这个功能的思路是创建一个专门的Binder对象来对下载功能进行管理。接下来我们来编辑MyService服务中的代码:
 
public class MyService extends Service {

    private DownloadBinder mBinder = new DownloadBinder();

    class DownloadBinder extends Binder {
        //创建一个DownloadBinder类,来继承Binder类,对下载进行管理
        public void startDownload(){
            Log.d("MyService","startDownload executed");
        }

        public int getProgress(){
            Log.d("MyService","getProgress executed");
            return 0;
        }
    }

    @Override
    public IBinder onBind(Intent intent) {
        return mBinder;
    }
在这里,我们新建了一个DownloadBinder类,并继承自Binder类。然后在内部提供了两个模拟的开始下载和查看下载进度的方法。并分别加了一条监控日志。
之后在MyService中创建了DownloadBinder的实例,最后在onBind()方法中返回了这个实例。这样MyService服务中的工作就全部完成了。
现在我们再来编辑一下activity_main.xml布局文件中的代码:
<Button
    android:id="@+id/bind_service"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Bind Service"
    android:textAllCaps="false" />

<Button
    android:id="@+id/unbind_service"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Unbind Service"
    android:textAllCaps="false" />
很简单,在原来的基础上,加了两个按钮,一个用于绑定活动和服务,一个用于取消绑定活动和服务。当一个活动和服务绑定了之后,就可以调用该服务里的Binder提供的方法了。现在我们再来编辑一下MainActivity中的代码逻辑:
 
首先再onCreate()方法中,我们获取了按钮的实例,并且为其添加了点击的事件。
 
public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    private MyService.DownloadBinder downloadBinder;

    private ServiceConnection connection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            downloadBinder = (MyService.DownloadBinder) service;
            downloadBinder.startDownload();
            downloadBinder.getProgress();
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    };
 
接着,我们创建了一个匿名类ServiceConnection,里面重现了两个方法,这两个方法就是用来绑定和解除绑定服务和活动的。再onServiceConnected()方法中,我们通过下转型来获得DownloadBinder的实例,然后调用了里面开始下载和查看下载进度的两个方法。现在我们就可以在活动中来调用DownloadBinder中的任何public方法了。
 
 
最后,我们在onClick()方法中,来进行绑定和解绑。这个功能是在bindService按钮的点击事件里完成的。还是构建一个Intent对象,然后调用bindService()方法来进行绑定。同样的道理来进行解绑。现在我们来运行一下程序,点击bindService按钮看一下发生了什么。
 
 
 
 
我们看到了,首先,创建服务时,onCreate()方法得到了执行。然后startDownload()和getProgress()方法都执行了。说明我们确实已经将服务和活动进行了绑定。这样,我们就成功的将活动和服务进行了绑定。
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值