Jelajahi Sumber

<修改launch,概率性出现获取前台任务数据不对导致无限重启APP,改为重启5次>

weizhengliang 4 tahun lalu
induk
melakukan
250453454f

TEMPAT SAMPAH
Wdkllaunch_V1.1_20200804_rk3128.apk


+ 1 - 1
app/build.gradle

@@ -8,7 +8,7 @@ android {
         minSdkVersion 16
         targetSdkVersion 26
         versionCode 1
-        versionName "1.0"
+        versionName "1.1"
         testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
         multiDexEnabled true
     }

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

@@ -12,6 +12,8 @@
     <uses-permission
         android:name="android.permission.FORCE_STOP_PACKAGES"
         tools:ignore="ProtectedPermissions" />
+    <uses-permission android:name="android.permission.PACKAGE_USAGE_STATS"
+        tools:ignore="ProtectedPermissions"/>
     <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
     <uses-permission android:name="android.permission.WAKE_LOCK" />
     <uses-permission android:name="android.permission.GET_TASKS" />

+ 6 - 1
app/src/main/java/com/wdkl/launch/MainActivity.java

@@ -7,6 +7,7 @@ import android.os.Handler;
 import android.os.Message;
 import android.provider.Settings;
 import android.support.v7.app.AppCompatActivity;
+import android.util.Log;
 import android.view.MotionEvent;
 import android.view.View;
 import android.widget.Button;
@@ -62,16 +63,20 @@ public class MainActivity extends Activity implements View.OnTouchListener, View
     }
 
     final int TIME_WHAT = 1000;
+    private static int count = 0;
     public Handler handler = new Handler() {
         public void handleMessage(Message msg) {
             switch (msg.what) {
                 case TIME_WHAT:
                     handler.sendEmptyMessageDelayed(TIME_WHAT, 5000);
                     try {
-                        if (!RunningUtil.isWdklAppRunning(MainActivity.this)) {
+                        if (/*!RunningUtil.isWdklAppRunning(MainActivity.this) &&*/ count < 5) {
                             Launcher.checkApkLaunch(MainActivity.this);
+                            count++;
+                            //Log.d("wzl", "check app launch count: " + count);
                         }
                     } catch (Exception e) {
+                        e.printStackTrace();
                     }
                     break;
             }

+ 53 - 12
app/src/main/java/com/wdkl/launch/runningApp/RunningUtil.java

@@ -1,7 +1,10 @@
 package com.wdkl.launch.runningApp;
 
 import android.app.ActivityManager;
+import android.app.usage.UsageEvents;
+import android.app.usage.UsageStatsManager;
 import android.content.Context;
+import android.os.Build;
 import android.util.Log;
 
 import com.wdkl.launch.ShareData;
@@ -30,23 +33,61 @@ public class RunningUtil {
 
     public static boolean isWdklAppRunning(Context context) {
         ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
-        List<ActivityManager.RunningTaskInfo> list;
         if (am == null) {
             return false;
-        } else {
-            list = am.getRunningTasks(100);
         }
 
-        if (list == null || list.size() <= 0) {
-            return false;
-        }
-        for (ActivityManager.RunningTaskInfo info : list) {
-            Log.d("wzl", "running app name: " + info.baseActivity.getPackageName());
-            if (info.baseActivity.getPackageName().contains("com.wdkl") && !info.baseActivity.getPackageName().equals("com.wdkl.launch")) {
-                Log.d("wzl", "isWdklAppRunning return true");
-                return true;
+        if (Build.VERSION.SDK_INT < 21) {  //android系统小于5.0
+            List<ActivityManager.RunningTaskInfo> list = am.getRunningTasks(20);
+            if (list == null || list.size() <= 0) {
+                return false;
+            }
+            for (ActivityManager.RunningTaskInfo info : list) {
+                //Log.d("wzl", "1111111running app name: " + info.baseActivity.getPackageName());
+                if (info.baseActivity.getPackageName().contains("com.wdkl") && !info.baseActivity.getPackageName().equals("com.wdkl.launch")) {
+                    //Log.d("wzl", "1111111isWdklAppRunning return true");
+                    return true;
+                }
+            }
+        } else if (Build.VERSION.SDK_INT == 21) {  //android系统等于5.0
+            List<ActivityManager.RunningAppProcessInfo> processes = am.getRunningAppProcesses();
+            if (processes == null || processes.size() == 0) {
+                return false;
+            }
+            for (ActivityManager.RunningAppProcessInfo process : processes) {
+                //Log.d("wzl", "2222222running app name: " + process.processName);
+                if (process.processName.contains("com.wdkl") && !process.processName.equals("com.wdkl.launch")) {
+                    //Log.d("wzl", "2222222isWdklAppRunning return true");
+                    return true;
+                }
+            }
+        } else {  //android系统大于5.0
+            final long end = System.currentTimeMillis();
+            final UsageStatsManager usageStatsManager = (UsageStatsManager) context.getSystemService("usagestats");
+            if (null == usageStatsManager) {
+                return false;
+            }
+            final UsageEvents events = usageStatsManager.queryEvents((end - 60 * 1000), end);
+            if (null == events) {
+                return false;
+            }
+            UsageEvents.Event usageEvent = new UsageEvents.Event();
+            UsageEvents.Event lastMoveToFGEvent = null;
+            while (events.hasNextEvent()) {
+                events.getNextEvent(usageEvent);
+                //Log.d("wzl", "3333333running app name: " + usageEvent.getPackageName());
+                if (usageEvent.getEventType() == UsageEvents.Event.MOVE_TO_FOREGROUND) {
+                    lastMoveToFGEvent = usageEvent;
+                }
+            }
+            if (lastMoveToFGEvent != null) {
+                if (lastMoveToFGEvent.getPackageName().contains("com.wdkl") && !lastMoveToFGEvent.getPackageName().equals("com.wdkl.launch")) {
+                    //Log.d("wzl", "3333333isWdklAppRunning return true");
+                    return true;
+                }
             }
         }
+
         return false;
     }
 
@@ -60,7 +101,7 @@ public class RunningUtil {
     public static boolean isAppRunning(Context context, String packageName) {
         ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
         List<ActivityManager.RunningTaskInfo> list = am.getRunningTasks(100);
-        if (list.size() <= 0) {
+        if (list == null || list.size() <= 0) {
             return false;
         }
         for (ActivityManager.RunningTaskInfo info : list) {