服务的基本用法-2

来源:互联网 发布:mmdriver.inf修复软件 编辑:程序博客网 时间:2024/06/05 10:49

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

@Overridepublic 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