wjc
2025-04-30 f91ef956cf482ed4ce0885dc47794b783c20c415
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
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.content.pm.ServiceInfo;
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需要增加  <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
 *
 * 在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());
//        try {
//            // Kotlin 示例
//            if (Build.VERSION.SDK_INT >= 34) {
//                startForeground(1, getNotification(getString(R.string.app_name), "Running"), ServiceInfo.FOREGROUND_SERVICE_TYPE_MEDIA_PLAYBACK);
//            } else {
//                startForeground(1, getNotification(getString(R.string.app_name), "Running"));
//            }
//        } catch (Exception e) {
//        }
    }
 
    @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;
    }
}