Quellcode durchsuchen

<修改APP异常处理及APP重启>

weizhengliang vor 4 Jahren
Ursprung
Commit
aa16b6dc34

+ 13 - 0
app/src/main/java/com/wdkl/callingbed/MyApplication.java

@@ -1,5 +1,6 @@
 package com.wdkl.callingbed;
 
+import android.app.Activity;
 import android.app.Application;
 import android.content.ComponentName;
 import android.content.Context;
@@ -14,6 +15,8 @@ import com.wdkl.callingbed.util.anrfcutil.AnrFcExceptionUtil;
 import com.wdkl.callingbed.util.ethernetwifiwithsipconnectstatus.WifiBindSipStatusConnector;
 import com.zhy.http.okhttp.OkHttpUtils;
 
+import java.util.ArrayList;
+import java.util.List;
 import java.util.concurrent.TimeUnit;
 
 import okhttp3.ConnectionPool;
@@ -46,6 +49,16 @@ public class MyApplication extends Application {
 //        return refWatcher;
 //    }
 
+    public static List<Activity> activities = new ArrayList<>();
+
+    public static void addActivity(Activity activity) {
+        activities.add(activity);
+    }
+
+    public static void removeActivity(Activity activity) {
+        activities.remove(activity);
+    }
+
 
     public MyApplication() {
         sAppContext = getAppContext();

+ 5 - 0
app/src/main/java/com/wdkl/callingbed/ui/CallingBedActivity.java

@@ -64,6 +64,7 @@ import com.wdkl.callingbed.entity.UdpEntity;
 import com.wdkl.callingbed.receive.AlarmReceiver;
 import com.wdkl.callingbed.receive.NetworkConnectChangedReceiver;
 import com.wdkl.callingbed.service.SoundPoolManager;
+import com.wdkl.callingbed.util.AutoRebootUtil;
 import com.wdkl.callingbed.util.BitmapUtils;
 import com.wdkl.callingbed.util.DateUtil;
 import com.wdkl.callingbed.util.DensityUtils;
@@ -568,6 +569,8 @@ public class CallingBedActivity extends BaseActivity implements ISerialPortBedOn
 
         //20190415 waderson  测试
         ScreenManagerUtil.setScreenBrightness(context, 210);
+
+        MyApplication.addActivity(CallingBedActivity.this);
     }
 
     @Override
@@ -1909,6 +1912,8 @@ public class CallingBedActivity extends BaseActivity implements ISerialPortBedOn
                     AlarmManager mgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
                     mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 2000, mPendingIntent);
                     System.exit(0);
+
+                    AutoRebootUtil.restartApp();
                 }
             }, 2000);
         }

+ 35 - 0
app/src/main/java/com/wdkl/callingbed/util/AutoRebootUtil.java

@@ -1,9 +1,16 @@
 package com.wdkl.callingbed.util;
 
+import android.annotation.SuppressLint;
+import android.app.Activity;
+import android.app.AlarmManager;
+import android.app.PendingIntent;
 import android.content.Context;
 import android.content.Intent;
 import android.os.SystemProperties;
 
+import com.wdkl.callingbed.MyApplication;
+import com.wdkl.callingbed.common.Constants;
+
 import java.util.Calendar;
 
 import static com.wdkl.callingbed.common.Constants.NET_ERROR_FIVE_AFTER_TOAST;
@@ -140,4 +147,32 @@ public class AutoRebootUtil {
             return "网络自检启动:系统将在" + countDownMinute + "分钟后重新启动";
         } else return "";
     }
+
+
+    private static boolean restart = false;
+    public static void restartApp() {
+        if (!restart) {
+            try {
+                Intent intent = new Intent(MyApplication.getAppContext(), Constants.ANR_FC);
+                @SuppressLint("WrongConstant") PendingIntent mPendingIntent = PendingIntent.getActivity(
+                        MyApplication.getAppContext(), 0, intent,
+                        Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
+                AlarmManager mgr = (AlarmManager) MyApplication.getAppContext().getSystemService(Context.ALARM_SERVICE);
+                mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 2000, mPendingIntent);
+
+                for (Activity activity : MyApplication.activities) {
+                    if (activity != null) {
+                        activity.finish();
+                    }
+                }
+                MyApplication.activities.clear();
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+
+            restart = true;
+            android.os.Process.killProcess(android.os.Process.myPid());
+            System.exit(0);
+        }
+    }
 }

+ 10 - 5
app/src/main/java/com/wdkl/callingbed/util/anrfcutil/AnrFcExceptionUtil.java

@@ -13,6 +13,7 @@ import com.github.anrwatchdog.ANRError;
 import com.github.anrwatchdog.ANRWatchDog;
 import com.wdkl.callingbed.MyApplication;
 import com.wdkl.callingbed.common.Constants;
+import com.wdkl.callingbed.util.AutoRebootUtil;
 import com.wdkl.callingbed.util.LogUtil;
 
 import java.io.File;
@@ -72,7 +73,7 @@ public class AnrFcExceptionUtil implements Thread.UncaughtExceptionHandler {
             } catch (InterruptedException e) {
                 Log.e(TAG, "error : ", e);
             }
-            Intent intent = new Intent(application.getApplicationContext(), Constants.ANR_FC);
+            /*Intent intent = new Intent(application.getApplicationContext(), Constants.ANR_FC);
             @SuppressLint("WrongConstant") PendingIntent restartIntent = PendingIntent.getActivity(
                     application.getApplicationContext(), 0, intent,
                     Intent.FLAG_ACTIVITY_NEW_TASK);
@@ -81,7 +82,9 @@ public class AnrFcExceptionUtil implements Thread.UncaughtExceptionHandler {
             mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 1000,
                     restartIntent); // 1秒钟后重启应用
             //杀死该应用进程
-            android.os.Process.killProcess(android.os.Process.myPid());
+            android.os.Process.killProcess(android.os.Process.myPid());*/
+
+            AutoRebootUtil.restartApp();
         }
     }
 
@@ -163,7 +166,7 @@ public class AnrFcExceptionUtil implements Thread.UncaughtExceptionHandler {
         //设置该CrashHandler为程序的默认处理器
         AnrFcExceptionUtil catchExcep = AnrFcExceptionUtil.getInstance(application);
         Thread.setDefaultUncaughtExceptionHandler(catchExcep);
-        mANRWatchDog = new ANRWatchDog(5000);
+        mANRWatchDog = new ANRWatchDog(8000);
         mANRWatchDog.setInterruptionListener(new ANRWatchDog.InterruptionListener() {
             @Override
             public void onInterrupted(InterruptedException exception) {
@@ -171,12 +174,14 @@ public class AnrFcExceptionUtil implements Thread.UncaughtExceptionHandler {
         }).setIgnoreDebugger(true).setANRListener(new ANRWatchDog.ANRListener() {
             @Override
             public void onAppNotResponding(ANRError error) {
-                Intent mStartActivity = new Intent(application.getApplicationContext(), Constants.ANR_FC);
+                /*Intent mStartActivity = new Intent(application.getApplicationContext(), Constants.ANR_FC);
                 int mPendingIntentId = 123456;
                 PendingIntent mPendingIntent = PendingIntent.getActivity(application.getApplicationContext(), mPendingIntentId, mStartActivity, PendingIntent.FLAG_CANCEL_CURRENT);
                 AlarmManager mgr = (AlarmManager) application.getApplicationContext().getSystemService(Context.ALARM_SERVICE);
                 mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 1500, mPendingIntent);
-                android.os.Process.killProcess(android.os.Process.myPid());
+                android.os.Process.killProcess(android.os.Process.myPid());*/
+
+                AutoRebootUtil.restartApp();
             }
         }).start();