From fa72983f543622b21e8d2ffc3dc29d27f878fbeb Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Sat, 10 May 2025 11:17:04 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BC=96=E8=AF=91=E8=B0=83=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- appbase/build.properties | 4 +- .../winboll/studio/appbase/MainActivity.java | 26 +- .../appbase/activities/New2Activity.java | 5 +- .../appbase/activities/NewActivity.java | 5 +- .../appbase/activities/WinBoLLActivity.java | 24 ++ .../appbase/receivers/MainReceiver.java | 18 +- .../studio/appbase/services/MainService.java | 11 +- .../appbase/services/TestDemoBindService.java | 7 +- .../appbase/services/TestDemoService.java | 1 - .../studio/appbase/widgets/APPNewsWidget.java | 15 +- appbase/src/main/res/layout/activity_main.xml | 5 + libappbase/build.properties | 4 +- .../studio/libappbase/GlobalApplication.java | 18 +- .../APPModel.java} | 16 +- .../WinBoLLModel.java} | 25 +- .../libappbase/models/WinBoLLNewsBean.java | 70 +++++ .../libappbase/winboll/IWinBoLLActivity.java | 17 ++ .../studio/libappbase/winboll/WinBoLL.java | 40 +++ .../winboll/WinBoLLActivityManager.java | 282 ++++++++++++++++++ 19 files changed, 520 insertions(+), 73 deletions(-) create mode 100644 appbase/src/main/java/cc/winboll/studio/appbase/activities/WinBoLLActivity.java rename libappbase/src/main/java/cc/winboll/studio/libappbase/{APPBaseModel.java => models/APPModel.java} (83%) rename libappbase/src/main/java/cc/winboll/studio/libappbase/{sos/APPModel.java => models/WinBoLLModel.java} (81%) create mode 100644 libappbase/src/main/java/cc/winboll/studio/libappbase/models/WinBoLLNewsBean.java create mode 100644 libappbase/src/main/java/cc/winboll/studio/libappbase/winboll/IWinBoLLActivity.java create mode 100644 libappbase/src/main/java/cc/winboll/studio/libappbase/winboll/WinBoLL.java create mode 100644 libappbase/src/main/java/cc/winboll/studio/libappbase/winboll/WinBoLLActivityManager.java diff --git a/appbase/build.properties b/appbase/build.properties index 4fd2269..5041006 100644 --- a/appbase/build.properties +++ b/appbase/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Sat May 10 01:15:51 GMT 2025 +#Sat May 10 03:16:10 GMT 2025 stageCount=7 libraryProject=libappbase baseVersion=15.7 publishVersion=15.7.6 -buildCount=4 +buildCount=7 baseBetaVersion=15.7.7 diff --git a/appbase/src/main/java/cc/winboll/studio/appbase/MainActivity.java b/appbase/src/main/java/cc/winboll/studio/appbase/MainActivity.java index 4001ad4..4ed4da2 100644 --- a/appbase/src/main/java/cc/winboll/studio/appbase/MainActivity.java +++ b/appbase/src/main/java/cc/winboll/studio/appbase/MainActivity.java @@ -11,6 +11,7 @@ import android.widget.CheckBox; import android.widget.Toolbar; import cc.winboll.studio.appbase.R; import cc.winboll.studio.appbase.activities.NewActivity; +import cc.winboll.studio.appbase.activities.WinBoLLActivity; import cc.winboll.studio.appbase.services.MainService; import cc.winboll.studio.appbase.services.TestDemoBindService; import cc.winboll.studio.appbase.services.TestDemoService; @@ -18,12 +19,13 @@ import cc.winboll.studio.libappbase.CrashHandler; import cc.winboll.studio.libappbase.GlobalApplication; import cc.winboll.studio.libappbase.GlobalCrashActivity; import cc.winboll.studio.libappbase.LogUtils; +import cc.winboll.studio.libappbase.LogView; import cc.winboll.studio.libappbase.sos.SOS; import cc.winboll.studio.libappbase.utils.ToastUtils; import cc.winboll.studio.libappbase.widgets.StatusWidget; import cc.winboll.studio.libappbase.winboll.IWinBoLLActivity; -public class MainActivity extends WinBoLLActivityBase implements IWinBoLLActivity { +public class MainActivity extends WinBoLLActivity implements IWinBoLLActivity { public static final String TAG = "MainActivity"; @@ -38,7 +40,7 @@ public class MainActivity extends WinBoLLActivityBase implements IWinBoLLActivit } Toolbar mToolbar; - //LogView mLogView; + LogView mLogView; @Override protected void onCreate(Bundle savedInstanceState) { @@ -51,12 +53,8 @@ public class MainActivity extends WinBoLLActivityBase implements IWinBoLLActivit CheckBox cbIsDebugMode = findViewById(R.id.activitymainCheckBox1); cbIsDebugMode.setChecked(GlobalApplication.isDebuging()); - //mLogView = findViewById(R.id.activitymainLogView1); - -// if (GlobalApplication.isDebuging()) { -// mLogView.start(); -// ToastUtils.show("LogView start."); -// } + mLogView = findViewById(R.id.logview); + mLogView.start(); } @Override @@ -72,8 +70,6 @@ public class MainActivity extends WinBoLLActivityBase implements IWinBoLLActivit return super.onOptionsItemSelected(item); } - - @Override protected void onDestroy() { super.onDestroy(); @@ -87,7 +83,7 @@ public class MainActivity extends WinBoLLActivityBase implements IWinBoLLActivit GlobalApplication.setIsDebuging(isDebuging); GlobalApplication.saveDebugStatus(); } - + public void onPreviewGlobalCrashActivity(View view) { Intent intent = new Intent(this, GlobalCrashActivity.class); intent.putExtra(CrashHandler.EXTRA_CRASH_INFO, "Demo log..."); @@ -137,8 +133,6 @@ public class MainActivity extends WinBoLLActivityBase implements IWinBoLLActivit startService(intent); } - - public void onStopTestDemoService(View view) { Intent intent = new Intent(this, TestDemoService.class); @@ -179,5 +173,11 @@ public class MainActivity extends WinBoLLActivityBase implements IWinBoLLActivit GlobalApplication.getWinBoLLActivityManager().startWinBoLLActivity(this, NewActivity.class); } + @Override + protected void onResume() { + super.onResume(); + mLogView.start(); + } + } diff --git a/appbase/src/main/java/cc/winboll/studio/appbase/activities/New2Activity.java b/appbase/src/main/java/cc/winboll/studio/appbase/activities/New2Activity.java index 875f243..b1872e8 100644 --- a/appbase/src/main/java/cc/winboll/studio/appbase/activities/New2Activity.java +++ b/appbase/src/main/java/cc/winboll/studio/appbase/activities/New2Activity.java @@ -12,11 +12,10 @@ import android.view.MenuItem; import android.view.View; import android.widget.Toolbar; import cc.winboll.studio.appbase.R; -import cc.winboll.studio.appbase.WinBoLLActivityBase; import cc.winboll.studio.libappbase.GlobalApplication; import cc.winboll.studio.libappbase.winboll.IWinBoLLActivity; -public class New2Activity extends WinBoLLActivityBase implements IWinBoLLActivity { +public class New2Activity extends WinBoLLActivity implements IWinBoLLActivity { public static final String TAG = "New2Activity"; @@ -74,7 +73,7 @@ public class New2Activity extends WinBoLLActivityBase implements IWinBoLLActivit @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == cc.winboll.studio.appbase.R.id.item_log) { - GlobalApplication.getWinBoLLActivityManager().startLogActivity(this); + //GlobalApplication.getWinBoLLActivityManager().startLogActivity(this); return true; } // 在switch语句中处理每个ID,并在处理完后返回true,未处理的情况返回false。 diff --git a/appbase/src/main/java/cc/winboll/studio/appbase/activities/NewActivity.java b/appbase/src/main/java/cc/winboll/studio/appbase/activities/NewActivity.java index 5ae1207..7cedbe6 100644 --- a/appbase/src/main/java/cc/winboll/studio/appbase/activities/NewActivity.java +++ b/appbase/src/main/java/cc/winboll/studio/appbase/activities/NewActivity.java @@ -11,11 +11,10 @@ import android.view.MenuItem; import android.view.View; import android.widget.Toolbar; import cc.winboll.studio.appbase.R; -import cc.winboll.studio.appbase.WinBoLLActivityBase; import cc.winboll.studio.libappbase.GlobalApplication; import cc.winboll.studio.libappbase.winboll.IWinBoLLActivity; -public class NewActivity extends WinBoLLActivityBase implements IWinBoLLActivity { +public class NewActivity extends WinBoLLActivity implements IWinBoLLActivity { public static final String TAG = "NewActivity"; @@ -72,7 +71,7 @@ public class NewActivity extends WinBoLLActivityBase implements IWinBoLLActivity @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == cc.winboll.studio.appbase.R.id.item_log) { - GlobalApplication.getWinBoLLActivityManager().startLogActivity(this); + //GlobalApplication.getWinBoLLActivityManager().startLogActivity(this); return true; } // 在switch语句中处理每个ID,并在处理完后返回true,未处理的情况返回false。 diff --git a/appbase/src/main/java/cc/winboll/studio/appbase/activities/WinBoLLActivity.java b/appbase/src/main/java/cc/winboll/studio/appbase/activities/WinBoLLActivity.java new file mode 100644 index 0000000..3071f98 --- /dev/null +++ b/appbase/src/main/java/cc/winboll/studio/appbase/activities/WinBoLLActivity.java @@ -0,0 +1,24 @@ +package cc.winboll.studio.appbase.activities; + +/** + * @Author ZhanGSKen + * @Date 2025/05/10 09:48 + * @Describe WinBoLL 窗口基础类 + */ +import android.app.Activity; +import cc.winboll.studio.libappbase.winboll.IWinBoLLActivity; + +public class WinBoLLActivity extends Activity implements IWinBoLLActivity { + + public static final String TAG = "WinBoLLActivity"; + + @Override + public Activity getActivity() { + return this; + } + + @Override + public String getTag() { + return TAG; + } +} diff --git a/appbase/src/main/java/cc/winboll/studio/appbase/receivers/MainReceiver.java b/appbase/src/main/java/cc/winboll/studio/appbase/receivers/MainReceiver.java index f687ed6..ef02d5f 100644 --- a/appbase/src/main/java/cc/winboll/studio/appbase/receivers/MainReceiver.java +++ b/appbase/src/main/java/cc/winboll/studio/appbase/receivers/MainReceiver.java @@ -14,10 +14,14 @@ import cc.winboll.studio.appbase.services.MainService; import cc.winboll.studio.appbase.widgets.APPNewsWidget; import cc.winboll.studio.libappbase.AppUtils; import cc.winboll.studio.libappbase.LogUtils; -import cc.winboll.studio.libappbase.sos.APPModel; +import cc.winboll.studio.libappbase.models.APPModel; +import cc.winboll.studio.libappbase.models.WinBoLLModel; +import cc.winboll.studio.libappbase.models.WinBoLLNewsBean; import cc.winboll.studio.libappbase.sos.SOS; import cc.winboll.studio.libappbase.sos.SOSObject; import cc.winboll.studio.libappbase.utils.ToastUtils; +import cc.winboll.studio.libappbase.winboll.IWinBoLLActivity; +import cc.winboll.studio.libappbase.winboll.WinBoLL; import java.io.IOException; import java.lang.ref.WeakReference; import java.text.SimpleDateFormat; @@ -40,21 +44,21 @@ public class MainReceiver extends BroadcastReceiver { String szAction = intent.getAction(); if (szAction.equals(ACTION_BOOT_COMPLETED)) { ToastUtils.show("ACTION_BOOT_COMPLETED"); - } else if (szAction.equals(WinBoLL.ACTION_BIND)) { + } else if (szAction.equals(IWinBoLLActivity.ACTION_BIND)) { LogUtils.d(TAG, "ACTION_BIND"); LogUtils.d(TAG, String.format("context.getPackageName() %s", context.getPackageName())); LogUtils.d(TAG, String.format("intent.getAction() %s", intent.getAction())); - String szAPPModel = intent.getStringExtra(WinBoLL.EXTRA_APPMODEL); - LogUtils.d(TAG, String.format("szAPPModel %s", szAPPModel)); - if (szAPPModel != null && !szAPPModel.equals("")) { + String szWinBoLLModel = intent.getStringExtra(WinBoLL.EXTRA_WINBOLLMODEL); + LogUtils.d(TAG, String.format("szAPPModel %s", szWinBoLLModel)); + if (szWinBoLLModel != null && !szWinBoLLModel.equals("")) { try { - APPModel bean = APPModel.parseStringToBean(szAPPModel, APPModel.class); + WinBoLLModel bean = WinBoLLModel.parseStringToBean(szWinBoLLModel, WinBoLLModel.class); if (bean != null) { String szAppPackageName = bean.getAppPackageName(); LogUtils.d(TAG, String.format("szAppPackageName %s", szAppPackageName)); String szAppMainServiveName = bean.getAppMainServiveName(); LogUtils.d(TAG, String.format("szAppMainServiveName %s", szAppMainServiveName)); - mwrService.get().bindAPPModelConnection(bean); + mwrService.get().bindWinBoLLModelConnection(bean); } } catch (IOException e) { LogUtils.d(TAG, e, Thread.currentThread().getStackTrace()); diff --git a/appbase/src/main/java/cc/winboll/studio/appbase/services/MainService.java b/appbase/src/main/java/cc/winboll/studio/appbase/services/MainService.java index a14e3ef..b3dd1d4 100644 --- a/appbase/src/main/java/cc/winboll/studio/appbase/services/MainService.java +++ b/appbase/src/main/java/cc/winboll/studio/appbase/services/MainService.java @@ -18,15 +18,16 @@ import android.content.ServiceConnection; import android.os.Binder; import android.os.IBinder; import cc.winboll.studio.appbase.MyTileService; -import cc.winboll.studio.appbase.models.MainServiceBean; import cc.winboll.studio.appbase.handlers.MainServiceHandler; +import cc.winboll.studio.appbase.models.MainServiceBean; import cc.winboll.studio.appbase.receivers.MainReceiver; import cc.winboll.studio.appbase.services.AssistantService; import cc.winboll.studio.appbase.threads.MainServiceThread; import cc.winboll.studio.appbase.widgets.APPNewsWidget; import cc.winboll.studio.libappbase.LogUtils; +import cc.winboll.studio.libappbase.models.APPModel; +import cc.winboll.studio.libappbase.models.WinBoLLModel; import java.util.ArrayList; -import cc.winboll.studio.libappbase.sos.APPModel; public class MainService extends Service { @@ -182,7 +183,7 @@ public class MainService extends Service { } } - public void bindAPPModelConnection(APPModel bean) { + public void bindWinBoLLModelConnection(WinBoLLModel bean) { LogUtils.d(TAG, "bindAPPModelConnection(...)"); // 清理旧的绑定链接 for (int i = mAPPModelConnectionList.size() - 1; i > -1; i--) { @@ -203,7 +204,7 @@ public class MainService extends Service { Intent intentWidget = new Intent(this, APPNewsWidget.class); intentWidget.setAction(APPNewsWidget.ACTION_WAKEUP_SERVICE); - APPModel appSOSBean = new APPModel(bean.getAppPackageName(), bean.getAppMainServiveName()); + WinBoLLModel appSOSBean = new WinBoLLModel(bean.getAppPackageName(), bean.getAppMainServiveName()); intentWidget.putExtra("APPSOSBean", appSOSBean.toString()); sendBroadcast(intentWidget); } @@ -212,7 +213,7 @@ public class MainService extends Service { ComponentName mComponentName; - boolean isBindToAPP(APPModel bean) { + boolean isBindToAPP(WinBoLLModel bean) { return mComponentName != null && mComponentName.getClassName().equals(bean.getAppMainServiveName()) && mComponentName.getPackageName().equals(bean.getAppPackageName()); diff --git a/appbase/src/main/java/cc/winboll/studio/appbase/services/TestDemoBindService.java b/appbase/src/main/java/cc/winboll/studio/appbase/services/TestDemoBindService.java index fc40488..1359e5e 100644 --- a/appbase/src/main/java/cc/winboll/studio/appbase/services/TestDemoBindService.java +++ b/appbase/src/main/java/cc/winboll/studio/appbase/services/TestDemoBindService.java @@ -10,11 +10,12 @@ import android.content.Context; import android.content.Intent; import android.os.Binder; import android.os.IBinder; -import cc.winboll.studio.appbase.models.TestDemoBindServiceBean; -import cc.winboll.studio.libappbase.LogUtils; -import cc.winboll.studio.libappbase.sos.WinBoLL; import cc.winboll.studio.appbase.App; +import cc.winboll.studio.appbase.models.TestDemoBindServiceBean; +import cc.winboll.studio.appbase.services.TestDemoBindService; +import cc.winboll.studio.libappbase.LogUtils; import cc.winboll.studio.libappbase.sos.SOS; +import cc.winboll.studio.libappbase.winboll.WinBoLL; public class TestDemoBindService extends Service { diff --git a/appbase/src/main/java/cc/winboll/studio/appbase/services/TestDemoService.java b/appbase/src/main/java/cc/winboll/studio/appbase/services/TestDemoService.java index 4fc5d83..4902f5f 100644 --- a/appbase/src/main/java/cc/winboll/studio/appbase/services/TestDemoService.java +++ b/appbase/src/main/java/cc/winboll/studio/appbase/services/TestDemoService.java @@ -12,7 +12,6 @@ import android.os.Binder; import android.os.IBinder; import cc.winboll.studio.appbase.models.TestDemoServiceBean; import cc.winboll.studio.libappbase.LogUtils; -import cc.winboll.studio.libappbase.sos.WinBoLL; public class TestDemoService extends Service { diff --git a/appbase/src/main/java/cc/winboll/studio/appbase/widgets/APPNewsWidget.java b/appbase/src/main/java/cc/winboll/studio/appbase/widgets/APPNewsWidget.java index 8e0faa9..56822c7 100644 --- a/appbase/src/main/java/cc/winboll/studio/appbase/widgets/APPNewsWidget.java +++ b/appbase/src/main/java/cc/winboll/studio/appbase/widgets/APPNewsWidget.java @@ -12,16 +12,17 @@ import android.content.Context; import android.content.Intent; import android.widget.RemoteViews; import cc.winboll.studio.appbase.R; -import cc.winboll.studio.appbase.models.WinBoLLNewsBean; import cc.winboll.studio.appbase.receivers.APPNewsWidgetClickListener; import cc.winboll.studio.libappbase.AppUtils; import cc.winboll.studio.libappbase.LogUtils; -import cc.winboll.studio.libappbase.sos.APPModel; -import cc.winboll.studio.libappbase.sos.WinBoLL; +import cc.winboll.studio.libappbase.models.APPModel; +import cc.winboll.studio.libappbase.models.WinBoLLNewsBean; +import cc.winboll.studio.libappbase.winboll.WinBoLL; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; +import cc.winboll.studio.libappbase.models.WinBoLLModel; public class APPNewsWidget extends AppWidgetProvider { @@ -57,11 +58,11 @@ public class APPNewsWidget extends AppWidgetProvider { } }else if (intent.getAction().equals(ACTION_WAKEUP_SERVICE)) { LogUtils.d(TAG, "ACTION_WAKEUP_SERVICE"); - String szAPPModel = intent.getStringExtra(WinBoLL.EXTRA_APPMODEL); - LogUtils.d(TAG, String.format("szAPPModel %s", szAPPModel)); - if (szAPPModel != null && !szAPPModel.equals("")) { + String szWinBoLLModel = intent.getStringExtra(WinBoLL.EXTRA_WINBOLLMODEL); + LogUtils.d(TAG, String.format("szWinBoLLModel %s", szWinBoLLModel)); + if (szWinBoLLModel != null && !szWinBoLLModel.equals("")) { try { - APPModel bean = APPModel.parseStringToBean(szAPPModel, APPModel.class); + WinBoLLModel bean = WinBoLLModel.parseStringToBean(szWinBoLLModel, WinBoLLModel.class); if (bean != null) { String szAppPackageName = bean.getAppPackageName(); LogUtils.d(TAG, String.format("szAppPackageName %s", szAppPackageName)); diff --git a/appbase/src/main/res/layout/activity_main.xml b/appbase/src/main/res/layout/activity_main.xml index a0e011f..61a1475 100644 --- a/appbase/src/main/res/layout/activity_main.xml +++ b/appbase/src/main/res/layout/activity_main.xml @@ -212,5 +212,10 @@ + + diff --git a/libappbase/build.properties b/libappbase/build.properties index 18395f7..5041006 100644 --- a/libappbase/build.properties +++ b/libappbase/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Sat May 03 10:32:21 GMT 2025 +#Sat May 10 03:16:10 GMT 2025 stageCount=7 libraryProject=libappbase baseVersion=15.7 publishVersion=15.7.6 -buildCount=4 +buildCount=7 baseBetaVersion=15.7.7 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 59f8554..428dd92 100644 --- a/libappbase/src/main/java/cc/winboll/studio/libappbase/GlobalApplication.java +++ b/libappbase/src/main/java/cc/winboll/studio/libappbase/GlobalApplication.java @@ -9,11 +9,11 @@ import android.app.Application; import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; -import android.os.Handler; -import android.os.Looper; +import cc.winboll.studio.libappbase.GlobalApplication; +import cc.winboll.studio.libappbase.models.APPModel; import cc.winboll.studio.libappbase.utils.ToastUtils; -import cc.winboll.studio.libappbase.winboll.WinBoLLActivityManager; import cc.winboll.studio.libappbase.winboll.MyActivityLifecycleCallbacks; +import cc.winboll.studio.libappbase.winboll.WinBoLLActivityManager; public class GlobalApplication extends Application { @@ -30,7 +30,7 @@ public class GlobalApplication extends Application { public static void saveDebugStatus() { if (_GlobalApplication != null) { - APPBaseModel.saveBeanToFile(getAPPBaseModelFilePath(), new APPBaseModel(GlobalApplication.isDebuging)); + APPModel.saveBeanToFile(getAPPModelFilePath(), new APPModel(GlobalApplication.isDebuging)); } } @@ -38,8 +38,8 @@ public class GlobalApplication extends Application { return _GlobalApplication; } - static String getAPPBaseModelFilePath() { - return _GlobalApplication.getDataDir().getPath() + "/APPBaseModel.json"; + static String getAPPModelFilePath() { + return _GlobalApplication.getDataDir().getPath() + "/APPModel.json"; } public static boolean isDebuging() { @@ -69,12 +69,12 @@ public class GlobalApplication extends Application { ToastUtils.init(this); // 应用保存的调试标志 - APPBaseModel appBaseModel = APPBaseModel.loadBeanFromFile(getAPPBaseModelFilePath(), APPBaseModel.class); - if (appBaseModel == null) { + APPModel appModel = APPModel.loadBeanFromFile(getAPPModelFilePath(), APPModel.class); + if (appModel == null) { setIsDebuging(false); saveDebugStatus(); } else { - setIsDebuging(appBaseModel.isDebuging()); + setIsDebuging(appModel.isDebuging()); } getWinBoLLActivityManager().setWinBoLLUI_TYPE(WinBoLLActivityManager.WinBoLLUI_TYPE.Service); diff --git a/libappbase/src/main/java/cc/winboll/studio/libappbase/APPBaseModel.java b/libappbase/src/main/java/cc/winboll/studio/libappbase/models/APPModel.java similarity index 83% rename from libappbase/src/main/java/cc/winboll/studio/libappbase/APPBaseModel.java rename to libappbase/src/main/java/cc/winboll/studio/libappbase/models/APPModel.java index 0a78cc2..84b93d8 100644 --- a/libappbase/src/main/java/cc/winboll/studio/libappbase/APPBaseModel.java +++ b/libappbase/src/main/java/cc/winboll/studio/libappbase/models/APPModel.java @@ -1,28 +1,28 @@ -package cc.winboll.studio.libappbase; +package cc.winboll.studio.libappbase.models; /** * @Author ZhanGSKen - * @Date 2025/03/25 02:52:46 - * @Describe 基础应用数据模型 + * @Date 2025/03/02 10:28:08 + * @Describe 应用调试模型 */ import android.util.JsonReader; import android.util.JsonWriter; import cc.winboll.studio.libappbase.BaseBean; import java.io.IOException; -public class APPBaseModel extends BaseBean { +public class APPModel extends BaseBean { - public static final String TAG = "APPBaseModel"; + public static final String TAG = "APPModel"; // 应用是否处于正在调试状态 // boolean isDebuging = false; - public APPBaseModel() { + public APPModel() { this.isDebuging = false; } - public APPBaseModel(boolean isDebuging) { + public APPModel(boolean isDebuging) { this.isDebuging = isDebuging; } @@ -36,7 +36,7 @@ public class APPBaseModel extends BaseBean { @Override public String getName() { - return APPBaseModel.class.getName(); + return APPModel.class.getName(); } @Override diff --git a/libappbase/src/main/java/cc/winboll/studio/libappbase/sos/APPModel.java b/libappbase/src/main/java/cc/winboll/studio/libappbase/models/WinBoLLModel.java similarity index 81% rename from libappbase/src/main/java/cc/winboll/studio/libappbase/sos/APPModel.java rename to libappbase/src/main/java/cc/winboll/studio/libappbase/models/WinBoLLModel.java index 260ba99..d5d71b0 100644 --- a/libappbase/src/main/java/cc/winboll/studio/libappbase/sos/APPModel.java +++ b/libappbase/src/main/java/cc/winboll/studio/libappbase/models/WinBoLLModel.java @@ -1,28 +1,33 @@ -package cc.winboll.studio.libappbase.sos; +package cc.winboll.studio.libappbase.models; /** * @Author ZhanGSKen - * @Date 2025/03/02 10:28:08 - * @Describe APPModel + * @Date 2025/05/10 10:16 + * @Describe WinBoLLModel */ import android.util.JsonReader; import android.util.JsonWriter; import cc.winboll.studio.libappbase.BaseBean; import java.io.IOException; -public class APPModel extends BaseBean { - - public static final String TAG = "APPModel"; - +public class WinBoLLModel extends BaseBean { + + public static final String TAG = "WinBoLLModel"; + String appPackageName; String appMainServiveName; - public APPModel() { + public WinBoLLModel() { this.appPackageName = ""; this.appMainServiveName = ""; } - public APPModel(String appPackageName, String appMainServiveName) { + public WinBoLLModel(boolean isDebuging, String appPackageName, String appMainServiveName) { + this.appPackageName = appPackageName; + this.appMainServiveName = appMainServiveName; + } + + public WinBoLLModel(String appPackageName, String appMainServiveName) { this.appPackageName = appPackageName; this.appMainServiveName = appMainServiveName; } @@ -53,7 +58,6 @@ public class APPModel extends BaseBean { super.writeThisToJsonWriter(jsonWriter); jsonWriter.name("appPackageName").value(getAppPackageName()); jsonWriter.name("appMainServiveName").value(getAppMainServiveName()); - } @Override @@ -84,3 +88,4 @@ public class APPModel extends BaseBean { return this; } } + diff --git a/libappbase/src/main/java/cc/winboll/studio/libappbase/models/WinBoLLNewsBean.java b/libappbase/src/main/java/cc/winboll/studio/libappbase/models/WinBoLLNewsBean.java new file mode 100644 index 0000000..56cbd80 --- /dev/null +++ b/libappbase/src/main/java/cc/winboll/studio/libappbase/models/WinBoLLNewsBean.java @@ -0,0 +1,70 @@ +package cc.winboll.studio.libappbase.models; +import android.util.JsonReader; +import android.util.JsonWriter; +import cc.winboll.studio.libappbase.BaseBean; +import java.io.IOException; + +/** + * @Author ZhanGSKen + * @Date 2025/05/10 09:36 + * @Describe WinBoLL 应用消息数据模型 + */ +public class WinBoLLNewsBean extends BaseBean { + + public static final String TAG = "WinBoLLNewsBean"; + + String message; + + public WinBoLLNewsBean() { + this.message = ""; + } + + public WinBoLLNewsBean(String message) { + this.message = message; + } + + public void setMessage(String message) { + this.message = message; + } + + public String getMessage() { + return message; + } + + @Override + public String getName() { + return WinBoLLNewsBean.class.getName(); + } + + @Override + public void writeThisToJsonWriter(JsonWriter jsonWriter) throws IOException { + super.writeThisToJsonWriter(jsonWriter); + jsonWriter.name("message").value(getMessage()); + } + + @Override + public boolean initObjectsFromJsonReader(JsonReader jsonReader, String name) throws IOException { + if (super.initObjectsFromJsonReader(jsonReader, name)) { return true; } else { + if (name.equals("message")) { + setMessage(jsonReader.nextString()); + } else { + return false; + } + } + return true; + } + + @Override + public BaseBean readBeanFromJsonReader(JsonReader jsonReader) throws IOException { + jsonReader.beginObject(); + while (jsonReader.hasNext()) { + String name = jsonReader.nextName(); + if (!initObjectsFromJsonReader(jsonReader, name)) { + jsonReader.skipValue(); + } + } + // 结束 JSON 对象 + jsonReader.endObject(); + return this; + } +} diff --git a/libappbase/src/main/java/cc/winboll/studio/libappbase/winboll/IWinBoLLActivity.java b/libappbase/src/main/java/cc/winboll/studio/libappbase/winboll/IWinBoLLActivity.java new file mode 100644 index 0000000..a1e8c83 --- /dev/null +++ b/libappbase/src/main/java/cc/winboll/studio/libappbase/winboll/IWinBoLLActivity.java @@ -0,0 +1,17 @@ +package cc.winboll.studio.libappbase.winboll; +import android.app.Activity; + +/** + * @Author ZhanGSKen + * @Date 2025/05/10 09:34 + * @Describe WinBoLL 窗口操作接口 + */ +public abstract interface IWinBoLLActivity { + + public static final String TAG = "IWinBoLLActivity"; + + public static final String ACTION_BIND = IWinBoLLActivity.class.getName() + ".ACTION_BIND"; + + public Activity getActivity(); + public String getTag(); +} diff --git a/libappbase/src/main/java/cc/winboll/studio/libappbase/winboll/WinBoLL.java b/libappbase/src/main/java/cc/winboll/studio/libappbase/winboll/WinBoLL.java new file mode 100644 index 0000000..b0ee734 --- /dev/null +++ b/libappbase/src/main/java/cc/winboll/studio/libappbase/winboll/WinBoLL.java @@ -0,0 +1,40 @@ +package cc.winboll.studio.libappbase.winboll; + +/** + * @Author ZhanGSKen + * @Date 2025/05/10 10:13 + * @Describe WinBoLL 系列应用通用管理类 + */ +import android.content.Context; +import android.content.Intent; +import cc.winboll.studio.libappbase.LogUtils; +import cc.winboll.studio.libappbase.models.WinBoLLModel; + +public class WinBoLL { + + public static final String TAG = "WinBoLL"; + + public static final String ACTION_BIND = WinBoLL.class.getName() + ".ACTION_BIND"; + public static final String EXTRA_WINBOLLMODEL = "EXTRA_WINBOLLMODEL"; + + public static void bindToAPPBase(Context context, String appMainService) { + LogUtils.d(TAG, "bindToAPPBase(...)"); + String toPackage = "cc.winboll.studio.appbase"; + startBind(context, toPackage, appMainService); + } + + public static void bindToAPPBaseBeta(Context context, String appMainService) { + LogUtils.d(TAG, "bindToAPPBaseBeta(...)"); + String toPackage = "cc.winboll.studio.appbase.beta"; + startBind(context, toPackage, appMainService); + } + + static void startBind(Context context, String toPackage, String appMainService) { + Intent intent = new Intent(ACTION_BIND); + intent.putExtra(EXTRA_WINBOLLMODEL, (new WinBoLLModel(toPackage, appMainService)).toString()); + intent.setPackage(toPackage); + LogUtils.d(TAG, String.format("ACTION_BIND :\nTo Package : %s\nAPP Main Service : %s", toPackage, appMainService)); + context.sendBroadcast(intent); + } + +} diff --git a/libappbase/src/main/java/cc/winboll/studio/libappbase/winboll/WinBoLLActivityManager.java b/libappbase/src/main/java/cc/winboll/studio/libappbase/winboll/WinBoLLActivityManager.java new file mode 100644 index 0000000..c38b9e1 --- /dev/null +++ b/libappbase/src/main/java/cc/winboll/studio/libappbase/winboll/WinBoLLActivityManager.java @@ -0,0 +1,282 @@ +package cc.winboll.studio.libappbase.winboll; + +/** + * @Author ZhanGSKen + * @Date 2025/05/10 10:02 + * @Describe 应用活动窗口管理器 + * 参考 : + * android 类似微信小程序多任务窗口 及 设置 TaskDescription 修改 icon 和 label + * https://blog.csdn.net/qq_29364417/article/details/109379915?app_version=6.4.2&code=app_1562916241&csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22109379915%22%2C%22source%22%3A%22weixin_38986226%22%7D&uLinkId=usr1mkqgl919blen&utm_source=app + */ +import android.app.Activity; +import android.app.ActivityManager; +import android.app.TaskStackBuilder; +import android.content.Context; +import android.content.Intent; +import cc.winboll.studio.libappbase.GlobalApplication; +import cc.winboll.studio.libappbase.LogUtils; +import cc.winboll.studio.libappbase.utils.ToastUtils; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +public class WinBoLLActivityManager { + + public static final String TAG = "IWinBoLLActivityManager"; + + + public enum WinBoLLUI_TYPE { Aplication, Service } + + Context mContext; + volatile static WinBoLLActivityManager _mIWinBoLLActivityManager; + Map mActivityListMap; + + volatile static WinBoLLUI_TYPE _WinBoLLUI_TYPE = WinBoLLUI_TYPE.Service; + public static void setWinBoLLUI_TYPE(WinBoLLUI_TYPE winBoLLUI_TYPE) { + _WinBoLLUI_TYPE = winBoLLUI_TYPE; + } + + public static WinBoLLUI_TYPE getWinBoLLUI_TYPE() { + return _WinBoLLUI_TYPE; + } + WinBoLLActivityManager(Context context) { + mContext = context; + mActivityListMap = new HashMap(); + } + + public static synchronized WinBoLLActivityManager getInstance(Context context) { + if (_mIWinBoLLActivityManager == null) { + _mIWinBoLLActivityManager = new WinBoLLActivityManager(context); + } + return _mIWinBoLLActivityManager; + } + + /** + * 把Activity添加到管理中 + */ + public void add(T activity) { + if (isActive(activity.getTag())) { + LogUtils.d(TAG, String.format("add(...) %s is active.", activity.getTag())); + } else { + mActivityListMap.put(activity.getTag(), activity); + LogUtils.d(TAG, String.format("Add activity : %s\n_mapActivityList.size() : %d", activity.getTag(), mActivityListMap.size())); + } + } + + // + // activity: 为 null 时, + // intent.putExtra 函数 "tag" 参数为 tag + // activity: 不为 null 时, + // intent.putExtra 函数 "tag" 参数为 activity.getTag() + // + public void startWinBoLLActivity(Context context, Class clazz) { + try { + // 如果窗口已存在就重启窗口 + String tag = clazz.newInstance().getTag(); + if (isActive(tag)) { + resumeActivity(context, tag); + return; + } + + // 新建一个任务窗口 + Intent intent = new Intent(context, clazz); + //打开多任务窗口 flags + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT); + intent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK); + intent.putExtra("tag", tag); + mContext.startActivity(intent); + } catch (InstantiationException | IllegalAccessException e) { + LogUtils.d(TAG, e, Thread.currentThread().getStackTrace()); + } + } + + public void startWinBoLLActivity(Context context, Intent intent, Class clazz) { + try { + // 如果窗口已存在就重启窗口 + String tag = clazz.newInstance().getTag(); + if (isActive(tag)) { + resumeActivity(context, tag); + return; + } + + // 新建一个任务窗口 + //Intent intent = new Intent(context, clazz); + //打开多任务窗口 flags + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT); + intent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK); + intent.putExtra("tag", tag); + mContext.startActivity(intent); + } catch (InstantiationException | IllegalAccessException e) { + LogUtils.d(TAG, e, Thread.currentThread().getStackTrace()); + } + } + + /** + * 判断 tag绑定的 MyActivity是否存在 + */ + public boolean isActive(String tag) { + //printAvtivityListInfo(); + IWinBoLLActivity iWinBoLLActivity = getIWinBoLLActivity(tag); + if (iWinBoLLActivity != null) { + Activity activity = iWinBoLLActivity.getActivity(); + if (activity != null) { + LogUtils.d(TAG, "isActive(...) activity != null tag " + tag); + //ToastUtils.show("activity != null tag " + tag); + //判断是否为 BaseActivity,如果已经销毁,则移除 + if (activity.isFinishing() || activity.isDestroyed()) { + mActivityListMap.remove(iWinBoLLActivity.getTag()); + //_mIWinBoLLActivityList.remove(activity); + LogUtils.d(TAG, String.format("isActive(...) remove activity.\ntag : %s", tag)); + return false; + } else { + LogUtils.d(TAG, String.format("isActive(...) activity is exist.\ntag : %s", tag)); + return true; + } + } + } + return false; + + } + + IWinBoLLActivity getIWinBoLLActivity(String tag) { + return mActivityListMap.get(tag); + } + + /** + * 找到tag 绑定的 BaseActivity ,通过 getTaskId() 移动到前台 + */ + public void resumeActivity(Context context, String tag) { + LogUtils.d(TAG, "resumeActivty"); + T iWinBoLLActivity = (T)getIWinBoLLActivity(tag); + LogUtils.d(TAG, "activity " + iWinBoLLActivity.getTag()); + if (iWinBoLLActivity != null && iWinBoLLActivity.getActivity() != null && !iWinBoLLActivity.getActivity().isFinishing() && !iWinBoLLActivity.getActivity().isDestroyed()) { + resumeActivity(context, iWinBoLLActivity); + } + } + + /** + * 找到tag 绑定的 BaseActivity ,通过 getTaskId() 移动到前台 + */ + public void resumeActivity(Context context, T activity) { + ActivityManager am = (ActivityManager) activity.getActivity().getSystemService(Context.ACTIVITY_SERVICE); + //返回启动它的根任务(home 或者 MainActivity) + Intent intent = new Intent(context, activity.getClass()); + TaskStackBuilder stackBuilder = TaskStackBuilder.create(context); + stackBuilder.addNextIntentWithParentStack(intent); + stackBuilder.startActivities(); + //moveTaskToFront(YourTaskId, 0); + LogUtils.d(TAG, "am.moveTaskToFront"); + //ToastUtils.show("resumeActivity am.moveTaskToFront"); + am.moveTaskToFront(activity.getActivity().getTaskId(), ActivityManager.MOVE_TASK_NO_USER_ACTION); + } + + + /** + * 结束所有 Activity + */ + public void finishAll() { + try { + //ToastUtils.show(String.format("finishAll() size : %d", _mIWinBoLLActivityList.size())); + for (int i = mActivityListMap.size() - 1; i > -1; i--) { + IWinBoLLActivity iWinBoLLActivity = mActivityListMap.get(i); + ToastUtils.show("finishAll() activity"); + if (iWinBoLLActivity != null && iWinBoLLActivity.getActivity() != null && !iWinBoLLActivity.getActivity().isFinishing() && !iWinBoLLActivity.getActivity().isDestroyed()) { + //ToastUtils.show("activity != null ..."); + if (GlobalApplication.getWinBoLLActivityManager().getWinBoLLUI_TYPE() == WinBoLLUI_TYPE.Service) { + // 结束窗口和最近任务栏, 建议前台服务类应用使用,可以方便用户再次调用 UI 操作。 + iWinBoLLActivity.getActivity().finishAndRemoveTask(); + //ToastUtils.show("finishAll() activity.finishAndRemoveTask();"); + } else if (GlobalApplication.getWinBoLLActivityManager().getWinBoLLUI_TYPE() == WinBoLLUI_TYPE.Aplication) { + // 结束窗口保留最近任务栏,建议前台服务类应用使用,可以保持应用的系统自觉性。 + iWinBoLLActivity.getActivity().finish(); + //ToastUtils.show("finishAll() activity.finish();"); + } else { + ToastUtils.show("WinBollApplication.WinBollUI_TYPE error."); + } + } + } + } catch (Exception e) { + LogUtils.d(TAG, e, Thread.currentThread().getStackTrace()); + } + } + + /** + * 结束指定Activity + */ + public void finish(T iWinBoLLActivity) { + try { + if (iWinBoLLActivity != null && iWinBoLLActivity.getActivity() != null && !iWinBoLLActivity.getActivity().isFinishing() && !iWinBoLLActivity.getActivity().isDestroyed()) { + //根据tag 移除 MyActivity + //String tag= activity.getTag(); + //_mIWinBoLLActivityList.remove(tag); + //ToastUtils.show("remove"); + //ToastUtils.show("_mIWinBoLLActivityArrayMap.size() " + Integer.toString(_mIWinBoLLActivityArrayMap.size())); + + // 窗口回调规则: + // [] 当前窗口位置 >> 调度出的窗口位置 + // ★:[0] 1 2 3 4 >> 1 + // ★:0 1 [2] 3 4 >> 1 + // ★:0 1 2 [3] 4 >> 2 + // ★:0 1 2 3 [4] >> 3 + // ★:[0] >> 直接关闭当前窗口 + IWinBoLLActivity preActivity = getPreActivity(iWinBoLLActivity); + iWinBoLLActivity.getActivity().finish(); + if (preActivity != null) { + resumeActivity(mContext, preActivity); + } + } + + } catch (Exception e) { + LogUtils.d(TAG, e, Thread.currentThread().getStackTrace()); + } + } + + IWinBoLLActivity getPreActivity(IWinBoLLActivity iWinBoLLActivity) { + try { + boolean bingo = false; + IWinBoLLActivity preIWinBoLLActivity = null; + for (Map.Entry entity : mActivityListMap.entrySet()) { + if (entity.getKey().equals(iWinBoLLActivity.getTag())) { + bingo = true; + LogUtils.d(TAG, "bingo"); + break; + } + preIWinBoLLActivity = entity.getValue(); + } + + if (bingo) { + return preIWinBoLLActivity; + } + } catch (Exception e) { + LogUtils.d(TAG, e, Thread.currentThread().getStackTrace()); + } + + return null; + } + + public boolean registeRemove(T iWinBoLLActivity) { + IWinBoLLActivity iWinBoLLActivityTest = mActivityListMap.get(iWinBoLLActivity.getTag()); + if (iWinBoLLActivityTest != null) { + mActivityListMap.remove(iWinBoLLActivity.getTag()); + return true; + } + return false; + } + + public void printAvtivityListInfo() { + if (!mActivityListMap.isEmpty()) { + StringBuilder sb = new StringBuilder("Map entries : " + Integer.toString(mActivityListMap.size())); + Iterator> iterator = mActivityListMap.entrySet().iterator(); + while (iterator.hasNext()) { + Map.Entry entry = iterator.next(); + sb.append("\nKey: " + entry.getKey() + ", \nValue: " + entry.getValue().getTag()); + //ToastUtils.show("\nKey: " + entry.getKey() + ", Value: " + entry.getValue().getTag()); + } + sb.append("\nMap entries end."); + LogUtils.d(TAG, sb.toString()); + } else { + LogUtils.d(TAG, "The map is empty."); + } + } +} +