三.快速创建"非绑定式"服务

前言

作为“非绑定式”服务,也可以称作是本地服务,在Android开发中经常会用到。为了快速,方便的创建一个“非绑定式”服务,我封装了两个帮助类:

  • ServiceHelper
  • LocalServiceHelper

下面就来讲讲他们的具体使用吧。
今天涉及的内容:

  1. ServiceHelper介绍
  2. LocalServiceHelper介绍
  3. 创建“非绑定式”服务
  4. 在MainActivity中的使用
  5. 效果图和项目结构图
  6. ServiceHelper 及 LocalServiceHelper 源码

先来波效果图


三.快速创建
1.gif

log

一.ServiceHelper介绍

ServiceHelper作为一个服务帮助类,里面主要是一些用于开启和关闭前台服务的方法。目的是为了最大限度的保持创建的服务不在app生命周期内“意外死亡”。
初始化ServiceHelper,你可以像下面这样:

ServiceHelper mServiceHelper=new ServiceHelper();

开启前台服务,必须结合通知栏使用,若你需要快速开启一个含简易通知栏的前台服务,你可以在你创建的“非绑定式”service中调用以下方法:

    /**
     * 开启前台运行模式(简易通知栏模式)
     * @param drawableId 设置小图标,一般设置app的icon,样式如:R.mipmap.ic_launcher
     */
    public void startForeService(Service service,int drawableId,Context context)

若你要开启一个自定义或者布局比较自由的通知栏 前台服务,你需要自定义一个Notification,然后调用以下方法开启一个服务前台模式:

    /**开启服务前台模式**/
    public void startForeService(Service service, Notification notification){

关于通知栏的快速创建,你可以参考我的另一篇文章
封装一个通知栏工具类 — NotificationHelper
如果你的服务已经开启了前台模式,那么在服务销毁的时候,你需要关闭前台模式:

    /**关闭服务前台模式**/
   stopForeService(Service service)

不过一般我们都不直接用ServiceHelper对象来调用 “开启/关闭 前台模式”的方法,因为对于“非绑定式”服务,它还有另一个神奇的帮助类 — LocalServiceHelper

二.LocalServiceHelper介绍

LocalServiceHelper作为"非绑定式"服务的帮助类,其继承于 ServiceHelper,拥有比 ServiceHelper 更加强大的功能。
初始化LocalServiceHelper对象,你可以这样:

    //声明“非绑定式服务”帮助类对象
    private LocalServiceHelper mLocalServiceHelper;

    //初始化"非绑定式服务"帮助类对象
    mLocalServiceHelper=new LocalServiceHelper();

你可以像下面这样在"非绑定式服务"中开启一个简易通知栏前台模式:

    //开启简易通知栏前台模式
    mLocalServiceHelper.startForeService(MyService.this,R.mipmap.ic_launcher,getApplicationContext());

若你需要开启一个“定制版”通知栏的前台模式,你可以在你自建的“非绑定式服务”中写一个类似下面的方法:

    //声明“非绑定式服务”帮助类对象
    private LocalServiceHelper mLocalServiceHelper;
    //声明通知栏帮助类对象
    private NotificationHelper mNotificationHelper;

        /**前台运行模式**/
    private void initFont(){
        mNotificationHelper=new NotificationHelper();
        //创建builder
        NotificationCompat.Builder builder = mNotificationHelper.init(R.mipmap.ic_launcher)//初始化,设置小图标,必须调用,一般设置app的icon
                .setTitle("")//设置标题
                .setContent("")//设置内容
                .createBuilder(getApplicationContext());//创建builder
        Notification notification = builder.build();

        mLocalServiceHelper=new LocalServiceHelper();
        //设置前台模式
        mLocalServiceHelper.startForeService(MyService.this,notification);
    }

然后在你自建的“非绑定式服务”的onCreate方法中调用以上的initFont方法,更多Notification相关使用,可以参考我的另一篇文章:
封装一个通知栏工具类 — NotificationHelper
在自建的“非绑定式”服务销毁的时候,你需要关闭前台模式:

        //退出前台运行模式
        mLocalServiceHelper.stopForeService(MyService.this);

三.创建“非绑定式”服务

是时候贴出自建的“非绑定式”服务代码了,MyService代码如下:

/**
 * Title:"非绑定式服务"
 * description:
 * autor:pei
 * created on 2019/11/18
 */
public class MyService extends Service {

    //声明“非绑定式服务”帮助类对象
    private LocalServiceHelper mLocalServiceHelper;
//    //声明通知栏帮助类对象
//    private NotificationHelper mNotificationHelper;

    @Override
    public void onCreate() {
        super.onCreate();

        LogUtil.i("========创建非绑定式服务===");

//        initFont();

        //初始化"非绑定式服务"帮助类对象
        mLocalServiceHelper=new LocalServiceHelper();
        //开启简易通知栏前台模式
        mLocalServiceHelper.startForeService(MyService.this,R.mipmap.ic_launcher,getApplicationContext());
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        LogUtil.i("========start非绑定式服务===");

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

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

//    /**前台运行模式**/
//    private void initFont(){
//        mNotificationHelper=new NotificationHelper();
//        //创建builder
//        NotificationCompat.Builder builder = mNotificationHelper.init(R.mipmap.ic_launcher)//初始化,设置小图标,必须调用,一般设置app的icon
//                .setTitle("")//设置标题
//                .setContent("")//设置内容
//                .createBuilder(getApplicationContext());//创建builder
//        Notification notification = builder.build();
//
//        mLocalServiceHelper=new LocalServiceHelper();
//        //设置前台模式
//        mLocalServiceHelper.startForeService(MyService.this,notification);
//    }

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

        //退出前台运行模式
        mLocalServiceHelper.stopForeService(MyService.this);

        LogUtil.i("========退出非绑定式服务===");
    }
}

之后,你需要在manifast.xml中注册你的"非绑定式"服务MyService:

  
  //其他代码省略
  //......
        
            
                
            
        
    

一般我们在action标签中的name属性写你自建“非绑定式服务”的全路径(这里我写的是MyService全路径),用以保证service注册的唯一性。

LocalServiceHelper还具有启动和销毁一个“非绑定式服务”的相关方法。
在MainActivity中启动一个"非绑定式"服务,你可以这样:

    //“非绑定式”服务帮助类
    private LocalServiceHelper mLocalServiceHelper;

   //初始化对象
  mLocalServiceHelper=new LocalServiceHelper();
  //开启一个不传参的 "非绑定式"服务
  mLocalServiceHelper.startLocalService(MainActivity.this,MyService.class,"com.p.ui.MyService");

其中"com.p.ui.MyService"要与MyService在manifast.xml中配置的action标签下的name属性一致。
MainActivity中关闭一个不传参的 "非绑定式"服务,你可以这样:

        //销毁服务
        mLocalServiceHelper.stopLocalService(MainActivity.this);

若你需要在MainActivity中启动一个含参的“非绑定式服务”,你可以像下面这样:

    private Intent mIntent;
    //“非绑定式”服务帮助类
    private LocalServiceHelper mLocalServiceHelper;

    mLocalServiceHelper=new LocalServiceHelper();
    //启动含参的"非绑定式服务"
    mIntent=new Intent();
    mIntent.putExtra("key",1);
    mLocalServiceHelper.startLocalServiceByIntent(MainActivity.this,mIntent,MyService.class,"com.p.ui.MyService");

然后,你就可以在MyService的onStartCommand(Intent intent, int flags, int startId)方法中接收参数处理了。
在MainActivity界面销毁的时候,注销你的含参“非绑定式”服务:

   //注销含参"非绑定式"服务
   mLocalServiceHelper.stopLocalServiceByIntent(MainActivity.this,mIntent);

四.在MainActivity中的使用

现在贴出MainActivity代码:

public class MainActivity extends AppActivity {

    @BindView(R.id.tv)
    TextView mTv;
    @BindView(R.id.btn1)
    Button mBtn1;

    private Intent mIntent;
    //“非绑定式”服务帮助类
    private LocalServiceHelper mLocalServiceHelper;

    @Override
    public int getContentViewId() {
        return R.layout.activity_main;
    }

    @Override
    public void initData() {
        LogUtil.setDebug(true);

        mLocalServiceHelper=new LocalServiceHelper();
    }

    @Override
    public void setListener() {
        mBtn1.setOnClickListener(this);

    }

    @Override
    public void onClick(View v) {
        super.onClick(v);
        switch (v.getId()) {
            case R.id.btn1:
                test();
                break;
            default:
                break;
        }
    }

    private void test(){
        //启动"非绑定式"服务
        mLocalServiceHelper.startLocalService(MainActivity.this,MyService.class,"com.p.ui.MyService");

//        //启动含参的"非绑定式服务"
//        mIntent=new Intent();
//        mIntent.putExtra("key",1);
//        mLocalServiceHelper.startLocalServiceByIntent(MainActivity.this,mIntent,MyService.class,"com.p.ui.MyService");

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();

        //销毁服务
        mLocalServiceHelper.stopLocalService(MainActivity.this);

//        //注销含参"非绑定式"服务
//        mLocalServiceHelper.stopLocalServiceByIntent(MainActivity.this,mIntent);
    }
}

五.效果图和项目结构图

效果图


三.快速创建
1.gif

log

项目结构图


三.快速创建
image.png

六.ServiceHelper 及 LocalServiceHelper 源码

下面贴出ServiceHelper源码:

你可能感兴趣的:(三.快速创建"非绑定式"服务)