一提到前台服务,有经验的同学都会想到保活问题。现在其实有很多保活库可以供大家使用,不过这里还是对这种最传统的方式做一下记录。同时,类似音乐播放的软件我们也是需要用到前台服务的。
最关键的便是我们的Service类
public class MyService extends Service {
private int one;
private int count;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
startForeground(100,getNotification("标题","内容"));
new Thread(new Runnable() {
@Override
public void run() {
while (true){
try {
Log.i("infomationHaha",one+"");
one++;
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return START_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
}
private Notification getNotification(String title,String message){
count++;
//创建一个跳转到活动页面的意图
Intent clickIntent = new Intent(this,MainActivity.class);
clickIntent.putExtra("flag",count);
//创建一个用于页面跳转的延迟意图
PendingIntent contentIntent = PendingIntent.getActivity(this,count,clickIntent
,PendingIntent.FLAG_UPDATE_CURRENT);
//创建一个通知消息的构造器
Notification.Builder builder = new Notification.Builder(this);
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
//Android8.0开始必须给每个通知分配对应的渠道
builder = new Notification.Builder(this,"channel_id");
}
builder.setContentIntent(contentIntent)//设置内容的点击意图
.setAutoCancel(true)//设置是否允许自动清除
.setSmallIcon(R.mipmap.ic_launcher)//设置状态栏里的小图标
.setTicker("提示消息来啦")//设置状态栏里面的提示文本
.setWhen(System.currentTimeMillis())//设置推送时间,格式为"小时:分钟"
.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher))//设置通知栏里面的大图标
.setContentTitle(title)//设置通知栏里面的标题文本
.setContentText(message);//设置通知栏里面的内容文本
//根据消息构造器创建一个通知对象
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN) {
Notification notify = builder.build();
return notify;
}
return null;
}
}
onCreate方法中的startForeground方法是核心,只要调用了这个方法,就可以实现前台服务,提高应用的优先级。
另外,高于Android 9.0的版本需要添加一个前台服务的权限。
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
启动Service和清单文件注册与普通的Service使用是一样的。不会的同学可以参考我之前的文章。