android-Service服务

今天学习service,其法有二。一曰start,二曰bind。

一、startService

(一)、xml
在这里插入图片描述

(二)、创建一个service,重写oncreate,onStartCommand,onDestroy三个方法。为了效果,我来个计时

package com.yangpeilin.servicedemo;

import android.app.Service;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.util.Log;

public class MyService extends Service {
    private static final String TAG = "MyService";
    private Handler handler;
    int a = 0;
    private Runnable runnable;

    public MyService() {
    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        throw new UnsupportedOperationException("Not yet implemented");
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Log.e(TAG, "onCreate: " );
    }

//    start
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.e(TAG, "onStartCommand: ");
        handler = new Handler();
        runnable = new Runnable() {
            @Override
            public void run() {
                Log.e(TAG, "下载中——>> "+a+"%" );
                a++;
                handler.postDelayed(this,1000);
            }
        };
        handler.post(runnable);
        return super.onStartCommand(intent, flags, startId);
    }
    //    start
    @Override
    public void onDestroy() {
        Log.e(TAG, "onDestroy: " );
        handler.removeCallbacks(runnable);
        super.onDestroy();
    }
}

(三)、activity中为按钮设置点击事件,通过start/stop来启动和停止service

   @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.btn_startService:
                intent = new Intent(this,MyService.class);
                startService(intent);
                break;
            case R.id.btn_stopService:
                intent = new Intent(this,MyService.class);
                stopService(intent);
                break;
        }
    }

(四)、结果如下
在这里插入图片描述

二、bindService

(一)、xml
在这里插入图片描述
(二)、在服务中重写onCreate,onStartCommand,onBind,onUnbind,onDestroy方法。然后我们再来一个内部类继承于binder用于onbind的返回。后面可通过该类进行服务内部方法的调用

package com.yangpeilin.servicedemo;

import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.Handler;
import android.os.IBinder;
import android.util.Log;

public class MyService extends Service {
    private static final String TAG = "MyService";
    private Handler handler;
    int a = 0;
    private Runnable runnable;

    public MyService() {
    }

    public class MyBind extends Binder{
        public void MyBind(){
            Log.e(TAG, "MyBind: " );
        }
    }
    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        Log.e(TAG, "onBind: " );
       return new MyBind();
    }


    @Override
    public void onCreate() {
        super.onCreate();
        Log.e(TAG, "onCreate: " );
    }

    @Override
    public boolean onUnbind(Intent intent) {
        Log.e(TAG, "onUnbind: " );
        return super.onUnbind(intent);
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.e(TAG, "onStartCommand: ");

        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        Log.e(TAG, "onDestroy: " );
        super.onDestroy();
    }

    //    //    start
//    @Override
//    public int onStartCommand(Intent intent, int flags, int startId) {
//        Log.e(TAG, "onStartCommand: ");
//        handler = new Handler();
//        runnable = new Runnable() {
//            @Override
//            public void run() {
//                Log.e(TAG, "下载中——>> "+a+"%" );
//                a++;
//                handler.postDelayed(this,1000);
//            }
//        };
//        handler.post(runnable);
//        return super.onStartCommand(intent, flags, startId);
//    }
//    //    start
//    @Override
//    public void onDestroy() {
//        Log.e(TAG, "onDestroy: " );
//        handler.removeCallbacks(runnable);
//        super.onDestroy();
//    }
}

(三)、activity中按钮的点击事件
bindservice需要三个参数,第一个为intent。

第二个需要connection ,我们实例化一个,并实现两个方法。第一个onServiceConnected是绑定成功时,我们让我们服务中的自写的类等于service

第三个我们设为自动创建BIND_AUTO_CREATE

取消绑定时我们判断connection 不为空并且service绑定(宾德service的返回值)着的情况下通过UNbind解绑

case R.id.btn_bindService:
                intent = new Intent(this,MyService.class);
                connection = new ServiceConnection() {
                    @Override
                    public void onServiceConnected(ComponentName name, IBinder service) {
//                        绑定成功
                        MyService.MyBind myBind = (MyService.MyBind) service;
                        Log.e(TAG, "onServiceConnected: " );
                    }

                    @Override
                    public void onServiceDisconnected(ComponentName name) {
//                        取消绑定
                        Log.e(TAG, "onServiceDisconnected: " );
                    }
                };
                bind = bindService(intent, connection, BIND_AUTO_CREATE);
                break;
            case R.id.btn_unbindService:
                if (connection!=null&&bind) {
                    unbindService(connection);
                }
                break;

(四)、结果
在这里插入图片描述
(五)、添加一个按钮实现服务内部方法调用
(1)、在服务中我们写的类中写一个方法

在这里插入图片描述
(2)、在服务销毁的声明周期停止该方法
(3)、在绑定成功时将我们的对象声明为全局变量
在这里插入图片描述
(4)、在点击事件中通过该对象调用方法。
在这里插入图片描述
(5)结果
在这里插入图片描述
注意!!!
通过绑定的方法,在不解绑的情况下直接退出应用会报错。
所以我们可以在activity的生命周期中做相对应的处理
在这里插入图片描述

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值