Explorar el Código

1.新增service保活
2.新增worker保活

JaycePC hace 6 meses
padre
commit
961868c980

+ 9 - 0
app/build.gradle

@@ -31,6 +31,13 @@ android {
     buildFeatures {
         viewBinding true
     }
+
+    applicationVariants.configureEach { variant ->
+        variant.outputs.configureEach { output ->
+            def formattedDate = new Date().format('yyyyMMddHHmm')
+            outputFileName = "xn_xxp_update_${variant.versionName}_${formattedDate}.apk"
+        }
+    }
 }
 
 dependencies {
@@ -62,5 +69,7 @@ dependencies {
     implementation 'com.squareup.okhttp3:okhttp:4.12.0'
     //noinspection UseTomlInstead
     implementation("com.squareup.okhttp3:logging-interceptor:4.12.0")
+    //noinspection UseTomlInstead,GradleDependency
+    implementation "androidx.work:work-runtime:2.9.1"
 
 }

+ 5 - 0
app/src/main/AndroidManifest.xml

@@ -9,6 +9,7 @@
     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
     <uses-permission android:name="android.permission.NOTIFICATION_SERVICE" />
     <uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" />
+    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
 
     <application
         android:name=".app.App"
@@ -32,6 +33,10 @@
             </intent-filter>
         </receiver>
 
+        <service
+            android:name=".service.TaskService"
+            android:exported="true" />
+
         <activity
             android:name=".SettingActivity"
             android:exported="false" />

+ 10 - 4
app/src/main/java/xn/update/MainActivity.java

@@ -1,8 +1,6 @@
 package xn.update;
 
 import android.annotation.SuppressLint;
-import android.content.Intent;
-import android.content.IntentFilter;
 import android.os.Bundle;
 import android.text.TextUtils;
 import android.util.Log;
@@ -15,6 +13,9 @@ import androidx.core.graphics.Insets;
 import androidx.core.util.Pair;
 import androidx.core.view.ViewCompat;
 import androidx.core.view.WindowInsetsCompat;
+import androidx.work.ExistingPeriodicWorkPolicy;
+import androidx.work.PeriodicWorkRequest;
+import androidx.work.WorkManager;
 
 import com.blankj.utilcode.util.ActivityUtils;
 import com.blankj.utilcode.util.AppUtils;
@@ -41,6 +42,7 @@ import java.util.concurrent.TimeUnit;
 import okhttp3.Response;
 import xn.update.databinding.ActivityMainBinding;
 import xn.update.http.HttpTool;
+import xn.update.works.TaskWork;
 
 public class MainActivity extends AppCompatActivity {
     private ActivityMainBinding binding;
@@ -49,8 +51,14 @@ public class MainActivity extends AppCompatActivity {
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
+        // 启动后台任务
+        Tool.INSTANCE.startTaskService();
         // 先启动主应用
         Tool.INSTANCE.startMasterApp();
+        // 启动保活worker
+        PeriodicWorkRequest taskRequest = new PeriodicWorkRequest.Builder(TaskWork.class, 15, TimeUnit.MINUTES).build();
+        WorkManager.getInstance(getApplicationContext()).enqueueUniquePeriodicWork("Task", ExistingPeriodicWorkPolicy.CANCEL_AND_REENQUEUE, taskRequest);
+
         InfoSystemApi.openAdb();
         InfoDisplayApi.setStatusBarEnable(false);
         InfoDisplayApi.setNavigationBarEnable(false);
@@ -85,8 +93,6 @@ public class MainActivity extends AppCompatActivity {
         InfoUtilApi.enableProtection(AppUtils.getAppPackageName(), false);
         InfoSystemApi.setLauncherForced(AppUtils.getAppPackageName());
         requestPermission();
-        // 监听分钟广播
-        registerReceiver(new TimeTickReceiver(), new IntentFilter(Intent.ACTION_TIME_TICK));
     }
 
     private void requestPermission() {

+ 25 - 2
app/src/main/java/xn/update/Tool.java

@@ -1,5 +1,9 @@
 package xn.update;
 
+import android.net.Uri;
+import android.util.Log;
+
+import com.blankj.utilcode.util.ActivityUtils;
 import com.blankj.utilcode.util.AppUtils;
 import com.blankj.utilcode.util.LogUtils;
 import com.blankj.utilcode.util.SPUtils;
@@ -7,6 +11,7 @@ import com.blankj.utilcode.util.ShellUtils;
 import com.hikvision.dmb.system.InfoSystemApi;
 
 import okhttp3.HttpUrl;
+import xn.update.service.TaskService;
 
 public enum Tool {
     INSTANCE;
@@ -40,9 +45,14 @@ public enum Tool {
         openApp(SPUtils.getInstance().getString("masterApp", "com.dlc.xn.eboard"));
     }
 
+    public void startTaskService() {
+        cmd("am startservice -n xn.update/xn.update.service.TaskService");
+    }
+
     public int cmd(String cmd) {
-        LogUtils.d(cmd);
-        return InfoSystemApi.execCommand(cmd);
+        int result = InfoSystemApi.execCommand(cmd);
+        LogUtils.d(cmd, result);
+        return result;
     }
 
     public String getSerialNumber() {
@@ -56,4 +66,17 @@ public enum Tool {
             return HttpUrl.get("http://172.16.0.65/api/");
         }
     }
+
+    public String checkUrl(String url) {
+        try {
+            String uriStr = url;
+            if (!url.matches("https?://.*") && !url.matches("http?://.*")) {
+                uriStr = Uri.parse(getBaseUrl() + url).toString();
+            }
+            return uriStr;
+        } catch (Exception e) {
+            LogUtils.e(Log.getStackTraceString(e));
+            return url;
+        }
+    }
 }

+ 8 - 2
app/src/main/java/xn/update/TimeTickReceiver.java

@@ -1,4 +1,4 @@
-package xn.update;
+package xn.update.broadcast;
 
 import android.annotation.SuppressLint;
 import android.app.DownloadManager;
@@ -29,6 +29,7 @@ import java.io.InputStreamReader;
 import java.util.List;
 
 import okhttp3.Response;
+import xn.update.Tool;
 import xn.update.http.HttpTool;
 import xn.update.http.bean.response.UpdateTask;
 
@@ -44,6 +45,11 @@ public class TimeTickReceiver extends BroadcastReceiver {
 
     @Override
     public void onReceive(Context context, Intent intent) {
+        // 保活用
+        Tool.INSTANCE.startTaskService();
+        Intent newIntent = new Intent("XN_ACTION");
+        intent.putExtra("heartbeat", "heartbeat");
+        context.sendBroadcast(newIntent);
         LogUtils.d("分钟", isRunning, ActivityUtils.getActivityList());
         // 空闲中
         if (!isRunning) {
@@ -112,7 +118,7 @@ public class TimeTickReceiver extends BroadcastReceiver {
                                     if (!AppUtils.getAppPackageName().equals(task.getStartLaunchPackage())) {
                                         SPUtils.getInstance().put("masterApp", task.getStartLaunchPackage());
                                     }
-                                    DownloadManager.Request request = new DownloadManager.Request(Uri.parse(task.getApkUrl()));
+                                    DownloadManager.Request request = new DownloadManager.Request(Uri.parse(Tool.INSTANCE.checkUrl(task.getApkUrl())));
                                     request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "apk/" + apkName);
                                     request.setMimeType("application/vnd.android.package-archive");
                                     request.setVisibleInDownloadsUi(false);

+ 84 - 0
app/src/main/java/xn/update/service/TaskService.java

@@ -0,0 +1,84 @@
+package xn.update.service;
+
+import android.app.Notification;
+import android.app.NotificationChannel;
+import android.app.NotificationManager;
+import android.app.Service;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.Build;
+import android.os.IBinder;
+
+import androidx.annotation.Nullable;
+import androidx.core.app.NotificationCompat;
+
+import com.blankj.utilcode.util.LogUtils;
+
+import xn.update.R;
+import xn.update.broadcast.TimeTickReceiver;
+
+public class TaskService extends Service {
+
+    private TimeTickReceiver timeTickReceiver;
+
+    @Nullable
+    @Override
+    public IBinder onBind(Intent intent) {
+        return null;
+    }
+
+    @Override
+    public void onCreate() {
+        super.onCreate();
+        createNotificationChannel();
+        LogUtils.d(getClass().getName(), "onCreate");
+        timeTickReceiver = new TimeTickReceiver();
+        // 监听分钟广播
+        registerReceiver(timeTickReceiver, new IntentFilter(Intent.ACTION_TIME_TICK));
+    }
+
+    @Override
+    public int onStartCommand(Intent intent, int flags, int startId) {
+        LogUtils.d(getClass().getName(), "onStartCommand");
+        Notification notification = createNotification();
+        startForeground(1, notification);
+        return START_REDELIVER_INTENT;
+    }
+
+    @Override
+    public void onTaskRemoved(Intent rootIntent) {
+        super.onTaskRemoved(rootIntent);
+        LogUtils.d(getClass().getName(), "onTaskRemoved");
+        stopSelf();
+    }
+
+    @Override
+    public void onDestroy() {
+        super.onDestroy();
+        if (null != timeTickReceiver) {
+            unregisterReceiver(timeTickReceiver);
+            timeTickReceiver = null;
+        }
+        LogUtils.d(getClass().getName(), "onDestroy");
+    }
+
+    private void createNotificationChannel() {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+            int importance = NotificationManager.IMPORTANCE_DEFAULT;
+            NotificationChannel channel = new NotificationChannel("task", "task", importance);
+            NotificationManager notificationManager = getSystemService(NotificationManager.class);
+            notificationManager.createNotificationChannel(channel);
+        }
+    }
+
+    private Notification createNotification() {
+        NotificationCompat.Builder builder = new NotificationCompat.Builder(this, "task")
+                .setContentTitle("Task")
+                .setContentText("Task is running")
+                .setSmallIcon(R.mipmap.ic_launcher)
+                .setContentIntent(null)
+                .setSilent(true)
+                .setPriority(NotificationCompat.PRIORITY_DEFAULT);
+        return builder.build();
+    }
+}

+ 25 - 0
app/src/main/java/xn/update/works/TaskWork.java

@@ -0,0 +1,25 @@
+package xn.update.works;
+
+import android.content.Context;
+
+import androidx.annotation.NonNull;
+import androidx.work.Worker;
+import androidx.work.WorkerParameters;
+
+import com.blankj.utilcode.util.LogUtils;
+
+import xn.update.Tool;
+
+public class TaskWork extends Worker {
+    public TaskWork(@NonNull Context context, @NonNull WorkerParameters workerParams) {
+        super(context, workerParams);
+    }
+
+    @NonNull
+    @Override
+    public Result doWork() {
+        LogUtils.d("work保活");
+        Tool.INSTANCE.startTaskService();
+        return Result.success();
+    }
+}