非android工程师,单纯个人临时有需要,赶时间借鉴很多文章做出来的,单纯记录备忘下。原帖之一如下:
1、新建一个Receiver,继承BroadcastRecevier类,用于开机广播,启动service服务。
java
/**
* 接收开机广播来启动service
*/
public class BootReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
Intent serviceIntent = new Intent(context, WebSocketService.class);
// 判断版本
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (Settings.canDrawOverlays(context)) {
// 有悬浮框权限
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
context.startForegroundService(serviceIntent);
} else {
context.startService(serviceIntent);
}
} else {
//没有悬浮框权限 要去索要悬浮框权限
System.out.println("没有悬浮框权限 要去索要悬浮框权限");
}
} else {
//低版本不需要悬浮框权限 直接显示
context.startService(serviceIntent);
System.out.println("低版本不需要悬浮框权限 直接显示");
}
}
}
}
2、在AndroidManifest.xml中配置如下:
java
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /><!-- 接收广播 -->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /><!-- 悬浮窗权限 -->
<uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW" />
java
<!-- 广播 -->
<receiver
android:name=".Receiver.BootReceiver"
android:exported="true">
<intent-filter android:priority="1000">
<action android:name="android.intent.action.BOOT_COMPLETED" />
<category android:name="android.intent.category.HOME" />
</intent-filter>
</receiver>
3、在service中的oncreated和onDestroy中添加如下:
java
@Override
public void onCreate() {
super.onCreate();
startForeground();
}
//关闭长连接
@Override
public void onDestroy() {
super.onDestroy();
stopForeground(true);
}
/**
* 启动前台服务
*/
private void startForeground() {
String channelId = null;
// 8.0 以上需要特殊处理
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
channelId = createNotificationChannel("kim.hsl", "ForegroundService");
} else {
channelId = "";
}
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, channelId);
Notification notification = builder.setOngoing(true)
.setSmallIcon(R.mipmap.ic_launcher)
.setPriority(PRIORITY_MIN)
.setCategory(Notification.CATEGORY_SERVICE)
.build();
startForeground(1, notification);
}
/**
* 创建通知通道
* @param channelId
* @param channelName
* @return
*/
@RequiresApi(Build.VERSION_CODES.O)
private String createNotificationChannel(String channelId, String channelName){
NotificationChannel chan = new NotificationChannel(channelId,
channelName, NotificationManager.IMPORTANCE_NONE);
chan.setLightColor(Color.BLUE);
chan.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE);
NotificationManager service = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
service.createNotificationChannel(chan);
return channelId;
}