Android代码心得10-Service之二

上一篇讲到调用Service的第一种方法StartService,非常简单,只要重写OnCreat,OnStartCommand,OnStop三种方法,在MainActivity里Start就行,这里讲的是另一种方法BoundService,这种方法可以实现在MainActivity里调用Service的内部类与方法等,这是StartService做不到的。
新建一个Service文件,第一步要做的是在该Service里新建一个继承自Binder内部类,该类的方法返回这个Service类。创建这个类是为了实例化下面的IBinder对象,IBinder实现Activity与Service的通信,自定义类的自定义方法是返回该Service

public  class MyService extends Service{
    public MyService() {
    }
    public class zidingyilei extends Binder{
    public MyService zidingyifangfa();{
    return MyService.this}
    }

然后在重写的Onbind方法中,就可以直接返回一个上面方法新建的对象。注意这里一定要有返回值,如果返回值为null则该服务不会被调用

    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        return new zidingyilei();
    }

然后想要完成的操作可以通过定义方法来完成,这里演示的是生成随机数,顺便学习一下

public String shengchengsuijishu(){
String num=String.valueOf(new Random().nextint(99));
}
//调用Random方法,nextint是Random子方法,括号内参数为范围

注意重写OnDestroy方法,不然就会出现Service已经停止却一直占用内存的情况

   @Override
    public void onDestroy() {
        super.onDestroy();
    }

到这里Service中的操作已经完成,转到MainActivity
首先是新建一个MyService对象

public MyService myService;

然后创建一个ServiceConnection对象sc,创建该对象时会自动重写两个方法,分别是连接上与断开时的操作。单纯只是想连接上的话,配上下面的Intent已经可以了。但是单纯的连接上是不够的,我们还要调用Service中的方法,所以在连接上时对myService进行了定义。调用自定义类的自定义方法,由上面知道这个自定义方法返回的是Service本身(事实上这里直接myService=new Myservice;就好,这样写纯粹是为了显得高级一点)

   private ServiceConnection sc=new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            myService=((MyService.zidingyilei)service).zidingyifangfa();
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    };

这里还要一步,当Activity开始时就完成与Service的连接,通过重写OnStart方法实现

    @Override
    protected void onStart() {
        super.onStart();
        Intent intent=new Intent(MainActivity.this,MyService.class);
        bindService(intent,sc,BIND_AUTO_CREATE);
        //最后一个参数是表示没有这个Service时自动生成一个,设为0就是不生成

然后就能愉快调用Service中的方法了,OnCreat方法,单击事件监听器,通过myService对象直接调用Service中的生成随机数方法

 button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                editText.setText(myService.shengchengsuijishu());
            }
        });

效果
在这里插入图片描述
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值