package com.android.systemss; import static com.android.api.encrytion.UtilEncrypt.encrypt; import android.app.Notification; import android.app.Service; import android.content.Intent; import android.graphics.BitmapFactory; import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; import android.os.Message; import android.text.TextUtils; import androidx.annotation.NonNull; import androidx.annotation.RequiresApi; import androidx.core.app.NotificationCompat; import com.android.api.encrytion.TimeUtil; import com.android.nebulasdk.api.ServerInterface; import com.android.api.encrytion.UtilEncrypt; import com.android.database.lib.DownLoadTaskBean; import com.android.domain.rk.R; import com.android.download.DownLoadManeger; import com.android.nebulasdk.NetStateChangeObserver; import com.android.nebulasdk.NetStateChangeReceiver; import com.android.nebulasdk.bean.AppInfoBean; import com.android.nebulasdk.bean.DomainBean; import com.android.systemss.presenter.AppnetPresenter; import com.android.systemss.presenter.callback.AppnetCallback; import com.android.util.DeviceUtil; import com.android.util.FileUtil; import com.android.util.NetUtil; import com.android.util.NetworkType; import com.android.util.PakageInstallUtil; import com.android.util.SharedPreferencesUtil; import com.blankj.utilcode.util.LogUtils; import com.blankj.utilcode.util.TimeUtils; import com.blankj.utilcode.util.ToastUtils; import java.util.ArrayList; import java.util.List; import java.util.Timer; import java.util.TimerTask; /** * 资源同步后台服务 */ public class SystemService extends Service implements AppnetCallback, NetStateChangeObserver, DownLoadManeger.DownloadListener { private static final String TAG = SystemService.class.getName(); private AppnetPresenter appnetPresenter; String deviceId = ""; /** * launcher 资源更新通知 */ public static final String NOTIFY_LAUNCHER_UPDATE = "com.ik.launcher.res.notify"; /** * Advert 资源更新通知 */ public static final String NOTIFY_ADVERT_UPDATE = "com.ik.Advert.res.notify"; // HeartBean heartResponse = null; private static boolean isRunning = false; //开启下载任务 private static final int WHAT_START_DOWNLOADTASK = 0; //提交日志数据 private static final int WHAT_SUBMIT_LOGINFO = 1; //开启心跳 private static final int WHAT_INIT_HEARTBEAT = 2; //激活设备 private static final int WHAT_ACTIVITE_DEVICE = 3; private static final long INTERVAL_TIME = 1 * 60 * 1000; // private static final long INTERVAL_TIME = 0; private static final long INTERVAL_TIME2 = 30 * 60 * 1000; // private static final long INTERVAL_TIME2 = 1 * 60 * 1000; private static final long PERIOD_TIME_VALUE = 10 * 60 * 1000; // 每间隔10分钟验证是否达到间隔时间 private static final long PERIOD_TIME_VALUE2 = 16 * 60 * 60 * 1000; // 间隔时间16小时 private int index = -1; private Timer mTimer = null; private TimerTask mTimerTask = null; private static final int NOTIFICATION_ID = 1001; private static final String CHANNEL_ID = "SystemService"; // 必须与创建的ID一致 private Handler handler = new Handler() { @Override public void handleMessage(@NonNull Message msg) { super.handleMessage(msg); switch (msg.what) { case WHAT_START_DOWNLOADTASK: // TaskManager.getInstance().starLocalDownloadTask(); handler.sendEmptyMessageDelayed(WHAT_SUBMIT_LOGINFO, 1000 * 10); break; case WHAT_SUBMIT_LOGINFO: // EventManager.getInstance().submit(); handler.sendEmptyMessageDelayed(WHAT_INIT_HEARTBEAT, 1000 * 10); break; case WHAT_INIT_HEARTBEAT: break; case WHAT_ACTIVITE_DEVICE: // appnetPresenter.postVerification(SystemService.this,deviceId, Config.getAppVersion()); break; } } }; @Override public void onCreate() { super.onCreate(); startForeground(NOTIFICATION_ID, buildNotification()); LogUtils.e("postServerAppUpdate--->SystemService onCreate"); } private Notification buildNotification() { // Android 8.0+ 必须指定通知通道 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { return new NotificationCompat.Builder(this, CHANNEL_ID).setContentTitle("服务运行中").setContentText("系统服务正在后台运行").setSmallIcon(R.mipmap.icon_service_notification).setPriority(NotificationCompat.PRIORITY_LOW).setCategory(Notification.CATEGORY_SERVICE).setVisibility(NotificationCompat.VISIBILITY_PRIVATE).build(); } else { // 低版本不需要通道 return new NotificationCompat.Builder(this).setContentTitle("服务运行中").setSmallIcon(R.mipmap.icon_service_notification).build(); } } @RequiresApi(api = Build.VERSION_CODES.O) @Override public int onStartCommand(Intent intent, int flags, int startId) { if (intent != null) { //判断是否属于开机启动 Bundle bundle = intent.getExtras(); if (bundle != null) { boolean flag = bundle.getBoolean("boot_complleted", true); LogUtils.e("postServerAppUpdate--->SystemService 开机广播启动"); if (flag) { startService(); } } else { LogUtils.e("postServerAppUpdate--->SystemService 通过Contentprovider初始化启动,延迟1分钟"); handler.postDelayed(new Runnable() { @Override public void run() { startService(); } }, INTERVAL_TIME); // startService();//test } } else { //非开机启动需要判断时间间隔 long time = SharedPreferencesUtil.getSharePrefrencesLong(this, "start_time"); LogUtils.e("postServerAppUpdate--->SystemService 非开机启动,间隔30分钟启动"); if ((System.currentTimeMillis() - time) > INTERVAL_TIME2) { startService(); SharedPreferencesUtil.setSharePrefrencesLong(this, "start_time", System.currentTimeMillis()); } } return START_STICKY; } private void startService() { if (!isRunning) { isRunning = true; deviceId = DeviceUtil.getEthernetMac(); DownLoadManeger.getInstance().registerDownloadListener(SystemService.this); if (appnetPresenter == null) { appnetPresenter = new AppnetPresenter(SystemService.this, this); } int netWorkState = NetUtil.getNetWorkState(this); // 当网络发生变化,判断当前网络状态,并通过NetEvent回调当前网络状态 if (netWorkState == NetUtil.NETWORK_MOBILE || netWorkState == NetUtil.NETWORK_WIFI || netWorkState == NetUtil.NETWORK_ETHERNET) { // EventManager.getInstance().recordEvent(EventManager.EVENT_DEVICE_ACTIVITY_CODE); } else { } NetStateChangeReceiver.registerReceiver(this); NetStateChangeReceiver.registerObserver(this); initScheduleTask(); } } private void initScheduleTask() { if (mTimer != null) { mTimer.cancel(); mTimer.purge(); mTimer = null; } mTimer = new Timer(); mTimerTask = new TimerTask() { @Override public void run() { try { long lastTime = SharedPreferencesUtil.getSharePrefrencesLong(SystemService.this, SharedPreferencesUtil.CONFIG_PARAM_LAST_TIME); long currentTimeValue = System.currentTimeMillis(); if (currentTimeValue - lastTime >= PERIOD_TIME_VALUE2 || currentTimeValue - lastTime < 0) { SharedPreferencesUtil.setSharePrefrencesLong(SystemService.this, SharedPreferencesUtil.CONFIG_PARAM_LAST_TIME, currentTimeValue); getTestAvailableDomainName(); if (appnetPresenter != null) { appnetPresenter.createNewInstance(SystemService.this); appnetPresenter.getServerTime(); } LogUtils.e("postServerAppUpdate--->currentTime:" + currentTimeValue + "--->lastTime:" + lastTime); } else { long time = lastTime + PERIOD_TIME_VALUE2 - currentTimeValue; LogUtils.e("postServerAppUpdate--->interval time until next request :" + TimeUtil.convertToHMS(time)); } } catch (Exception e) { e.printStackTrace(); } } }; //设备未注册,请联网注册 mTimer.schedule(mTimerTask, 0, PERIOD_TIME_VALUE); } @Override public IBinder onBind(Intent intent) { return null; } @Override public void onTaskRemoved(Intent rootIntent) { super.onTaskRemoved(rootIntent); LogUtils.e("postServerAppUpdate--->Service被移除"); } @Override public void onDestroy() { NetStateChangeReceiver.unRegisterObserver(this); NetStateChangeReceiver.unRegisterReceiver(this); isRunning = false; if (mTimerTask != null) { mTimerTask = null; } if (mTimer != null) { mTimer.cancel(); mTimer.purge(); mTimer = null; } super.onDestroy(); } @Override public void onViewFailureString(int code, String message) { SharedPreferencesUtil.setSharePrefrencesString(SystemService.this, SharedPreferencesUtil.CONFIG_DOMAINNAME, ""); LogUtils.e("postServerAppUpdate--->getTestAvailableDomainName onViewFailureString(domain not available):" + message); } @Override public void onExceptionFailure(String message) { SharedPreferencesUtil.setSharePrefrencesString(SystemService.this, SharedPreferencesUtil.CONFIG_DOMAINNAME, ""); LogUtils.e("postServerAppUpdate--->getTestAvailableDomainName onExceptionFailure(domain not available):" + message); } @Override public void onServerFailure(int code, String message) { SharedPreferencesUtil.setSharePrefrencesString(SystemService.this, SharedPreferencesUtil.CONFIG_DOMAINNAME, ""); LogUtils.e("postServerAppUpdate--->getTestAvailableDomainName onServerFailure(domain not available):" + message); } @Override public void onNetDisconnected() { // TaskManager.getInstance().onDestroy(); } @RequiresApi(api = Build.VERSION_CODES.O) @Override public void onNetConnected(NetworkType networkType) { int netWorkState = NetUtil.getNetWorkState(this); LogUtils.e("postServerAppUpdate--->networkType:" + networkType.toString()); if (netWorkState == NetUtil.NETWORK_MOBILE || netWorkState == NetUtil.NETWORK_WIFI || netWorkState == NetUtil.NETWORK_ETHERNET) { // if (mTimerTask != null) { // mTimerTask.cancel(); // mTimer.purge(); // } // // mTimerTask = new TimerTask() { // @Override // public void run() { // getTestAvailableDomainName(); // // if (appnetPresenter != null) { // appnetPresenter.createNewInstance(SystemService.this); // appnetPresenter.getServerTime(); // } // } // }; // //设备未注册,请联网注册 // mTimer.schedule(mTimerTask, 0, PERIOD_TIME_VALUE); } else { ToastUtils.showShort("网络未连接,请联网后重试!"); } } @Override public void onTimeTesult(long time) { String availableDomainBean = SharedPreferencesUtil.getSharePrefrencesString(SystemService.this, SharedPreferencesUtil.CONFIG_TEST_DOMAINNAME); SharedPreferencesUtil.setSharePrefrencesString(SystemService.this, SharedPreferencesUtil.CONFIG_DOMAINNAME, availableDomainBean); LogUtils.e("postServerAppUpdate--->getTestAvailableDomainName onTimeTesult(domain available):" + availableDomainBean); SharedPreferencesUtil.setSharePrefrencesLong(SystemService.this, SharedPreferencesUtil.CONFIG_PARAM_TIME, time); try { appnetPresenter.postServerAppUpdate(); } catch (Exception e) { LogUtils.e("postServerAppUpdate--->" + e.getMessage()); } LogUtils.e("postServerAppUpdate--->onTimeTesult:" + time); } @Override public void onAppUpdate(List appInfoBeanList, List domainBeanList) { LogUtils.e("postServerAppUpdate--->appInfoBeanList size:" + appInfoBeanList.size() + ",domainBean size:" + domainBeanList.size()); if (appInfoBeanList != null && appInfoBeanList.size() > 0) { for (AppInfoBean appInfoBean : appInfoBeanList) { boolean isDownladDisabled = PakageInstallUtil.checkAppInstall(getApplicationContext(), appInfoBean.getPackageName(), appInfoBean.getVersionCode()); LogUtils.e("postServerAppUpdate--->appInfo is not empty,download apk info:" + appInfoBean.getPackageName() + "--->versionName:" + appInfoBean.getVersionName() + "--->versionCode:" + appInfoBean.getVersionCode() + "--->isDownladDisabled:" + isDownladDisabled); if (!isDownladDisabled) { addDownloadTask(appInfoBean.getUrl(), 1, appInfoBean.getSize()); } } } if (domainBeanList != null && domainBeanList.size() > 0) { DomainPool.getInstance().updateDomain(domainBeanList); } } private void addDownloadTask(String url, int taskType, long fileSize) { String filePath = FileUtil.getBakPath(getApplicationContext(), taskType); String fileName = FileUtil.getFileName(url); DownLoadManeger.getInstance().addDownloadTask(new DownLoadManeger.DownloadBuilder().url(url).fileName(fileName).filePath(filePath).taskType(taskType).fileTotal(fileSize)); } @Override public void onStart(DownLoadTaskBean bean, long taskId) { LogUtils.e("postServerAppUpdate--->download onStart"); } @Override public void onError(DownLoadTaskBean bean, long taskId, String erroMsg) { LogUtils.e("postServerAppUpdate--->download onError:" + erroMsg); } @Override public void onProgress(DownLoadTaskBean bean, long taskId, long progress, long total) { LogUtils.e("postServerAppUpdate--->download onProgress:" + progress + "--->total is:" + total); } @Override public void onFinish(DownLoadTaskBean bean, long taskId) { String appInstallPath = bean.getPath() + bean.getFileName(); LogUtils.e("postServerAppUpdate--->download onFinish,apk file path is:" + appInstallPath); if (bean.getTaskType() == 1) { boolean flag = PakageInstallUtil.silentInstall(getApplicationContext(), appInstallPath); handler.postDelayed(new Runnable() { @Override public void run() { if (flag) { LogUtils.e("postServerAppUpdate--->download onFinish,apk is installed successfully"); FileUtil.deleteFile(appInstallPath); //安装成功后删除文件 } } }, 1000 * 5); } } private void getTestAvailableDomainName() { LogUtils.e("postServerAppUpdate--->getTestAvailableDomainName isNeedContinueTest:" + TextUtils.isEmpty(DomainPool.getInstance().getAvailableDomainName())); if (TextUtils.isEmpty(DomainPool.getInstance().getAvailableDomainName())) { index++; List domainNames = new ArrayList<>(); List tempDomainNames = DomainPool.getInstance().getDefaultDomain(getApplicationContext()); domainNames.add(UtilEncrypt.decrypt(ServerInterface.BUSINESS_IP_ADDRESS)); // 默认域名 domainNames.addAll(tempDomainNames); SharedPreferencesUtil.setSharePrefrencesString(SystemService.this, SharedPreferencesUtil.CONFIG_TEST_DOMAINNAME, domainNames.get(index % domainNames.size())); LogUtils.e("postServerAppUpdate--->getTestAvailableDomainName index:" + index + "--->" + domainNames.get(index % domainNames.size()) + "--->" + domainNames.toString()); } else { LogUtils.e("postServerAppUpdate--->getTestAvailableDomainName domainName is available:" + DomainPool.getInstance().getAvailableDomainName()); } } }