package com.hdl.photovoltaic.services; import android.annotation.SuppressLint; import android.annotation.TargetApi; import android.app.Notification; import android.app.NotificationChannel; import android.app.NotificationManager; import android.app.PendingIntent; import android.app.Service; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.graphics.BitmapFactory; import android.graphics.Color; import android.os.Build; import android.os.IBinder; import android.text.TextUtils; import android.util.Log; import static android.app.Notification.VISIBILITY_SECRET; import androidx.core.app.NotificationCompat; import com.hdl.photovoltaic.R; /*** * @Description: 前台服务 * channelId必须要一致,否则会报 android.app.RemoteServiceException: Bad notification for startForeground 错误 * 8.0之上一定要使用 NotificationChannel 适配下才行 * 步骤 * 1.通过 “通知服务” 创建 NotificationChannel * 2.通过 Notification.Builder 构造器 创建 Notification * 3.通过 startForeground 开启服务 * 4.高于9.0的版本 manifest需要增加 * * 在onCreate中创建一个广播接收器,试试能不能接收到 开单或者预约结束后的通知 */ public class ForeService extends Service { final String TAG=ForeService.class.getName(); @Override public IBinder onBind(Intent intent) { return null; } @SuppressLint("ForegroundServiceType") @Override public void onCreate() { super.onCreate(); Log.d(TAG, "ForeService onCreate() 进程Id:"+android.os.Process.myPid() ); startForeground(1, getNotification(getString(R.string.app_name), "Running")); } @Override public int onStartCommand(Intent intent, int flags, int startId) { return START_STICKY; } @Override public void onDestroy() { super.onDestroy(); //停止的时候销毁前台服务 stopForeground(true); } private Notification getNotification(String title, String message) { createNotificationChannel(); //创建一个通知消息的构造器 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, "f_channel_id"); } builder.setAutoCancel(true)//设置是否允许自动清除 .setSmallIcon(R.drawable.logo)//设置状态栏里的小图标 .setContentTitle(title)//设置通知栏里面的标题文本 .setContentText(message);//设置通知栏里面的内容文本 //根据消息构造器创建一个通知对象 if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN) { return builder.build(); } return null; } @TargetApi(Build.VERSION_CODES.O) private void createNotificationChannel() { NotificationChannel channel = new NotificationChannel("f_channel_id", "CHANNEL_NAME", NotificationManager.IMPORTANCE_HIGH); //是否绕过请勿打扰模式 channel.canBypassDnd(); //闪光灯 channel.enableLights(true); //锁屏显示通知 channel.setLockscreenVisibility(VISIBILITY_SECRET); //闪关灯的灯光颜色 channel.setLightColor(Color.RED); //桌面launcher的消息角标 channel.canShowBadge(); //是否允许震动 channel.enableVibration(false); //获取系统通知响铃声音的配置 channel.getAudioAttributes(); //获取通知取到组 channel.getGroup(); //设置可绕过 请勿打扰模式 channel.setBypassDnd(true); //设置震动模式 channel.setVibrationPattern(new long[]{100, 100, 200}); //是否会有灯光 channel.shouldShowLights(); getManager().createNotificationChannel(channel); } private NotificationManager mManager; private NotificationManager getManager() { if (mManager == null) { mManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); } return mManager; } }