在Android 8.0以上对后台service做了限制,需要做特殊处理,否则会抛出 java.lang.IllegalStateException:Not allowed to start service Intent
。
而前台服务是被认为用于已知的正在运行的服务,当系统需要释放内存时不会优先杀掉该进程。前台进程必须发一个 notification
在状态栏中显示,直到进程被杀死。因为前台服务一直消耗一部分资源,但不像一般服务那样会在需要的时候被杀掉,所以为了节约资源,保护电池寿命,一定要在创建前台服务的时候发送 notification
提示用户。
// 启动service
if (Build.VERSION.SDK_INT >= Build.VERSION_CODE.O) {
startForegroundService(intent);
} else {
startService(intent);
}
// 在service中设置通知将service置到前台服务
public class MyService extends Service {
@Override
public void onCreate() {
super.onCreate();
// 调用startForegroundService()后5秒内没有调用startForeground(),会有ANR
if (Build.VERSION.SDK_INT >= Build.VERSION_CODE.O) {
NotificationManager nm = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
nm.createNotificationChannel(
new NotificationChannel(getPackageName(), getPackageName(),
NotificationManager.IMPORTANCE_DEFAULT));
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, getPackageName());
// id不为0即可,该方法表示将将服务设置为前台服务
startForeground(1, builder.build());
}
}
@Override
public void onDestroy() {
stopForeground(true);
super.onDestroy();
}
}
使用 startForegroundService()
方法启动service,还需要添加权限:
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>