diff --git a/appbase/build.properties b/appbase/build.properties index a3eae15..b0d2bf9 100644 --- a/appbase/build.properties +++ b/appbase/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Wed Jun 03 06:52:38 HKT 2026 -stageCount=26 +#Wed Jun 03 20:17:02 HKT 2026 +stageCount=27 libraryProject=libappbase baseVersion=15.20 -publishVersion=15.20.25 +publishVersion=15.20.26 buildCount=0 -baseBetaVersion=15.20.26 +baseBetaVersion=15.20.27 diff --git a/appbase/src/main/java/cc/winboll/studio/appbase/App.java b/appbase/src/main/java/cc/winboll/studio/appbase/App.java index 4666ea9..cfd440d 100644 --- a/appbase/src/main/java/cc/winboll/studio/appbase/App.java +++ b/appbase/src/main/java/cc/winboll/studio/appbase/App.java @@ -1,6 +1,6 @@ package cc.winboll.studio.appbase; -import cc.winboll.studio.libappbase.CrashHandler; +import cc.winboll.studio.libappbase.CrashActivity; import cc.winboll.studio.libappbase.GlobalApplication; import cc.winboll.studio.libappbase.ToastUtils; import cc.winboll.studio.libappbase.utils.CrashHandleNotifyUtils; @@ -39,7 +39,7 @@ public class App extends GlobalApplication { this, getPackageName(), stackTraceStr, - CrashHandler.CrashActivity.class + CrashActivity.class ); } } diff --git a/libappbase/build.properties b/libappbase/build.properties index a3eae15..b0d2bf9 100644 --- a/libappbase/build.properties +++ b/libappbase/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Wed Jun 03 06:52:38 HKT 2026 -stageCount=26 +#Wed Jun 03 20:17:02 HKT 2026 +stageCount=27 libraryProject=libappbase baseVersion=15.20 -publishVersion=15.20.25 +publishVersion=15.20.26 buildCount=0 -baseBetaVersion=15.20.26 +baseBetaVersion=15.20.27 diff --git a/libappbase/src/main/AndroidManifest.xml b/libappbase/src/main/AndroidManifest.xml index da1cde4..db23a44 100644 --- a/libappbase/src/main/AndroidManifest.xml +++ b/libappbase/src/main/AndroidManifest.xml @@ -8,7 +8,7 @@ android:networkSecurityConfig="@xml/network_security_config"> diff --git a/libappbase/src/main/java/cc/winboll/studio/libappbase/CrashActivity.java b/libappbase/src/main/java/cc/winboll/studio/libappbase/CrashActivity.java new file mode 100644 index 0000000..552f706 --- /dev/null +++ b/libappbase/src/main/java/cc/winboll/studio/libappbase/CrashActivity.java @@ -0,0 +1,109 @@ +package cc.winboll.studio.libappbase; + +import android.app.Activity; +import android.content.ClipData; +import android.content.ClipboardManager; +import android.content.Context; +import android.content.Intent; +import android.content.res.Resources; +import android.os.Bundle; +import android.view.Menu; +import android.view.MenuItem; +import android.view.ViewGroup; +import android.widget.HorizontalScrollView; +import android.widget.ScrollView; +import android.widget.TextView; +import android.widget.Toast; + +public final class CrashActivity extends Activity implements MenuItem.OnMenuItemClickListener { + private static final int MENUITEM_COPY = 0; + private static final int MENUITEM_RESTART = 1; + + private String mLog; + + @Override + protected void onCreate(final Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + AppCrashSafetyWire.getInstance().postResumeCrashSafetyWireHandler(getApplicationContext()); + mLog = getIntent().getStringExtra(CrashHandler.EXTRA_CRASH_LOG); + setTheme(android.R.style.Theme_DeviceDefault_Light_DarkActionBar); + initLayout(); + } + + private void initLayout() { + ScrollView contentView = new ScrollView(this); + contentView.setFillViewport(true); + + HorizontalScrollView hw = new HorizontalScrollView(this); + hw.setBackgroundColor(0xFFF5F5F5); + + TextView message = new TextView(this); + final int padding = dp2px(16); + message.setPadding(padding, padding, padding, padding); + message.setText(mLog); + message.setTextColor(0xFF000000); + message.setTextIsSelectable(true); + + hw.addView(message); + contentView.addView(hw, ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.MATCH_PARENT); + setContentView(contentView); + + getActionBar().setTitle(CrashHandler.TITTLE); + getActionBar().setSubtitle(GlobalApplication.getAppName(getApplicationContext()) + " Error"); + } + + @Override + public void onBackPressed() { + restartApp(); + } + + private void restartApp() { + final Intent intent = getPackageManager() + .getLaunchIntentForPackage(getPackageName()); + if (intent != null) { + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK + | Intent.FLAG_ACTIVITY_CLEAR_TOP + | Intent.FLAG_ACTIVITY_CLEAR_TASK); + startActivity(intent); + } + finish(); + android.os.Process.killProcess(android.os.Process.myPid()); + System.exit(0); + } + + private int dp2px(final float dpValue) { + final float scale = Resources.getSystem().getDisplayMetrics().density; + return (int) (dpValue * scale + 0.5f); + } + + @Override + public boolean onCreateOptionsMenu(final Menu menu) { + menu.add(0, MENUITEM_COPY, 0, "Copy") + .setOnMenuItemClickListener(this) + .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); + + menu.add(0, MENUITEM_RESTART, 0, "Restart") + .setOnMenuItemClickListener(this) + .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); + return true; + } + + @Override + public boolean onMenuItemClick(final MenuItem item) { + switch (item.getItemId()) { + case MENUITEM_COPY: + ClipboardManager cm = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); + cm.setPrimaryClip(ClipData.newPlainText(getPackageName(), mLog)); + Toast.makeText(getApplication(), "The text is copied.", Toast.LENGTH_SHORT).show(); + break; + case MENUITEM_RESTART: + AppCrashSafetyWire.getInstance().resumeToMaximumImmediately(); + restartApp(); + break; + default: + break; + } + return false; + } +} diff --git a/libappbase/src/main/java/cc/winboll/studio/libappbase/CrashHandler.java b/libappbase/src/main/java/cc/winboll/studio/libappbase/CrashHandler.java index dcd0aa9..2631f70 100644 --- a/libappbase/src/main/java/cc/winboll/studio/libappbase/CrashHandler.java +++ b/libappbase/src/main/java/cc/winboll/studio/libappbase/CrashHandler.java @@ -1,27 +1,13 @@ package cc.winboll.studio.libappbase; -import android.app.Activity; import android.app.Application; import android.content.ActivityNotFoundException; -import android.content.ClipData; -import android.content.ClipboardManager; import android.content.Context; import android.content.Intent; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; -import android.content.res.Resources; import android.os.Build; -import android.os.Bundle; -import android.os.Handler; -import android.os.Looper; import android.text.TextUtils; -import android.view.Menu; -import android.view.MenuItem; -import android.view.ViewGroup; -import android.widget.HorizontalScrollView; -import android.widget.ScrollView; -import android.widget.TextView; -import android.widget.Toast; import cc.winboll.studio.libappbase.utils.CrashHandleNotifyUtils; @@ -220,111 +206,5 @@ public final class CrashHandler { } } - // ====================== 内部Activity页面 ====================== - /** - * 基础极简崩溃页面 - * 保险丝熔断时启动,避免复杂布局二次崩溃 - */ - public static final class CrashActivity extends Activity implements MenuItem.OnMenuItemClickListener { - private static final int MENUITEM_COPY = 0; - private static final int MENUITEM_RESTART = 1; - - private String mLog; - - @Override - protected void onCreate(final Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - AppCrashSafetyWire.getInstance().postResumeCrashSafetyWireHandler(getApplicationContext()); - mLog = getIntent().getStringExtra(EXTRA_CRASH_LOG); - setTheme(android.R.style.Theme_DeviceDefault_Light_DarkActionBar); - initLayout(); - } - - /** - * 动态初始化布局 - */ - private void initLayout() { - ScrollView contentView = new ScrollView(this); - contentView.setFillViewport(true); - - HorizontalScrollView hw = new HorizontalScrollView(this); - hw.setBackgroundColor(0xFFF5F5F5); - - TextView message = new TextView(this); - final int padding = dp2px(16); - message.setPadding(padding, padding, padding, padding); - message.setText(mLog); - message.setTextColor(0xFF000000); - message.setTextIsSelectable(true); - - hw.addView(message); - contentView.addView(hw, ViewGroup.LayoutParams.MATCH_PARENT, - ViewGroup.LayoutParams.MATCH_PARENT); - setContentView(contentView); - - getActionBar().setTitle(TITTLE); - getActionBar().setSubtitle(GlobalApplication.getAppName(getApplicationContext()) + " Error"); - } - - @Override - public void onBackPressed() { - restartApp(); - } - - /** - * 重启应用 - */ - private void restartApp() { - final Intent intent = getPackageManager() - .getLaunchIntentForPackage(getPackageName()); - if (intent != null) { - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK - | Intent.FLAG_ACTIVITY_CLEAR_TOP - | Intent.FLAG_ACTIVITY_CLEAR_TASK); - startActivity(intent); - } - finish(); - android.os.Process.killProcess(android.os.Process.myPid()); - System.exit(0); - } - - /** - * dp转px - */ - private int dp2px(final float dpValue) { - final float scale = Resources.getSystem().getDisplayMetrics().density; - return (int) (dpValue * scale + 0.5f); - } - - @Override - public boolean onCreateOptionsMenu(final Menu menu) { - menu.add(0, MENUITEM_COPY, 0, "Copy") - .setOnMenuItemClickListener(this) - .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); - - menu.add(0, MENUITEM_RESTART, 0, "Restart") - .setOnMenuItemClickListener(this) - .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); - return true; - } - - @Override - public boolean onMenuItemClick(final MenuItem item) { - switch (item.getItemId()) { - case MENUITEM_COPY: - ClipboardManager cm = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); - cm.setPrimaryClip(ClipData.newPlainText(getPackageName(), mLog)); - Toast.makeText(getApplication(), "The text is copied.", Toast.LENGTH_SHORT).show(); - break; - case MENUITEM_RESTART: - AppCrashSafetyWire.getInstance().resumeToMaximumImmediately(); - restartApp(); - break; - default: - break; - } - return false; - } - } } diff --git a/libappbase/src/main/java/cc/winboll/studio/libappbase/GlobalApplication.java b/libappbase/src/main/java/cc/winboll/studio/libappbase/GlobalApplication.java index 05df241..0ae5999 100644 --- a/libappbase/src/main/java/cc/winboll/studio/libappbase/GlobalApplication.java +++ b/libappbase/src/main/java/cc/winboll/studio/libappbase/GlobalApplication.java @@ -152,7 +152,7 @@ public class GlobalApplication extends Application { this, getPackageName(), stackTraceStr, - CrashHandler.CrashActivity.class + CrashActivity.class ); } } diff --git a/libappbase/src/main/java/cc/winboll/studio/libappbase/GlobalCrashActivity.java b/libappbase/src/main/java/cc/winboll/studio/libappbase/GlobalCrashActivity.java index 1b185fd..9095167 100644 --- a/libappbase/src/main/java/cc/winboll/studio/libappbase/GlobalCrashActivity.java +++ b/libappbase/src/main/java/cc/winboll/studio/libappbase/GlobalCrashActivity.java @@ -66,7 +66,7 @@ public final class GlobalCrashActivity extends Activity implements MenuItem.OnMe mCrashLog = getIntent().getStringExtra(CrashHandler.EXTRA_CRASH_LOG); final Intent intent = new Intent(); intent.putExtra(CrashHandler.EXTRA_CRASH_LOG, mCrashLog); - CrashHandleNotifyUtils.handleUncaughtException(GlobalApplication.getInstance(), intent, CrashHandler.CrashActivity.class); + CrashHandleNotifyUtils.handleUncaughtException(GlobalApplication.getInstance(), intent, CrashActivity.class); StackTraceElement[] stackElements = Thread.currentThread().getStackTrace(); StringBuilder sb = new StringBuilder("GlobalCrashActivity onCreate StackTrace");