前言
作为“非绑定式”服务,也可以称作是本地服务,在Android开发中经常会用到。为了快速,方便的创建一个“非绑定式”服务,我封装了两个帮助类:
- ServiceHelper
- LocalServiceHelper
下面就来讲讲他们的具体使用吧。
今天涉及的内容:
- ServiceHelper介绍
- LocalServiceHelper介绍
- 创建“非绑定式”服务
- 在MainActivity中的使用
- 效果图和项目结构图
- ServiceHelper 及 LocalServiceHelper 源码
先来波效果图
一.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);
}
}
五.效果图和项目结构图
效果图
项目结构图
六.ServiceHelper 及 LocalServiceHelper 源码
下面贴出ServiceHelper源码: