编译调试

This commit is contained in:
ZhanGSKen 2025-05-10 11:17:04 +08:00
parent 35825d5ead
commit fa72983f54
19 changed files with 520 additions and 73 deletions

View File

@ -1,8 +1,8 @@
#Created by .winboll/winboll_app_build.gradle #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 stageCount=7
libraryProject=libappbase libraryProject=libappbase
baseVersion=15.7 baseVersion=15.7
publishVersion=15.7.6 publishVersion=15.7.6
buildCount=4 buildCount=7
baseBetaVersion=15.7.7 baseBetaVersion=15.7.7

View File

@ -11,6 +11,7 @@ import android.widget.CheckBox;
import android.widget.Toolbar; import android.widget.Toolbar;
import cc.winboll.studio.appbase.R; import cc.winboll.studio.appbase.R;
import cc.winboll.studio.appbase.activities.NewActivity; 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.MainService;
import cc.winboll.studio.appbase.services.TestDemoBindService; import cc.winboll.studio.appbase.services.TestDemoBindService;
import cc.winboll.studio.appbase.services.TestDemoService; 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.GlobalApplication;
import cc.winboll.studio.libappbase.GlobalCrashActivity; import cc.winboll.studio.libappbase.GlobalCrashActivity;
import cc.winboll.studio.libappbase.LogUtils; import cc.winboll.studio.libappbase.LogUtils;
import cc.winboll.studio.libappbase.LogView;
import cc.winboll.studio.libappbase.sos.SOS; import cc.winboll.studio.libappbase.sos.SOS;
import cc.winboll.studio.libappbase.utils.ToastUtils; import cc.winboll.studio.libappbase.utils.ToastUtils;
import cc.winboll.studio.libappbase.widgets.StatusWidget; import cc.winboll.studio.libappbase.widgets.StatusWidget;
import cc.winboll.studio.libappbase.winboll.IWinBoLLActivity; 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"; public static final String TAG = "MainActivity";
@ -38,7 +40,7 @@ public class MainActivity extends WinBoLLActivityBase implements IWinBoLLActivit
} }
Toolbar mToolbar; Toolbar mToolbar;
//LogView mLogView; LogView mLogView;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
@ -51,12 +53,8 @@ public class MainActivity extends WinBoLLActivityBase implements IWinBoLLActivit
CheckBox cbIsDebugMode = findViewById(R.id.activitymainCheckBox1); CheckBox cbIsDebugMode = findViewById(R.id.activitymainCheckBox1);
cbIsDebugMode.setChecked(GlobalApplication.isDebuging()); cbIsDebugMode.setChecked(GlobalApplication.isDebuging());
//mLogView = findViewById(R.id.activitymainLogView1); mLogView = findViewById(R.id.logview);
mLogView.start();
// if (GlobalApplication.isDebuging()) {
// mLogView.start();
// ToastUtils.show("LogView start.");
// }
} }
@Override @Override
@ -72,8 +70,6 @@ public class MainActivity extends WinBoLLActivityBase implements IWinBoLLActivit
return super.onOptionsItemSelected(item); return super.onOptionsItemSelected(item);
} }
@Override @Override
protected void onDestroy() { protected void onDestroy() {
super.onDestroy(); super.onDestroy();
@ -138,8 +134,6 @@ public class MainActivity extends WinBoLLActivityBase implements IWinBoLLActivit
} }
public void onStopTestDemoService(View view) { public void onStopTestDemoService(View view) {
Intent intent = new Intent(this, TestDemoService.class); Intent intent = new Intent(this, TestDemoService.class);
intent.setAction(TestDemoService.ACTION_DISABLE); intent.setAction(TestDemoService.ACTION_DISABLE);
@ -179,5 +173,11 @@ public class MainActivity extends WinBoLLActivityBase implements IWinBoLLActivit
GlobalApplication.getWinBoLLActivityManager().startWinBoLLActivity(this, NewActivity.class); GlobalApplication.getWinBoLLActivityManager().startWinBoLLActivity(this, NewActivity.class);
} }
@Override
protected void onResume() {
super.onResume();
mLogView.start();
}
} }

View File

@ -12,11 +12,10 @@ import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.widget.Toolbar; import android.widget.Toolbar;
import cc.winboll.studio.appbase.R; import cc.winboll.studio.appbase.R;
import cc.winboll.studio.appbase.WinBoLLActivityBase;
import cc.winboll.studio.libappbase.GlobalApplication; import cc.winboll.studio.libappbase.GlobalApplication;
import cc.winboll.studio.libappbase.winboll.IWinBoLLActivity; 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"; public static final String TAG = "New2Activity";
@ -74,7 +73,7 @@ public class New2Activity extends WinBoLLActivityBase implements IWinBoLLActivit
@Override @Override
public boolean onOptionsItemSelected(MenuItem item) { public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == cc.winboll.studio.appbase.R.id.item_log) { if (item.getItemId() == cc.winboll.studio.appbase.R.id.item_log) {
GlobalApplication.getWinBoLLActivityManager().startLogActivity(this); //GlobalApplication.getWinBoLLActivityManager().startLogActivity(this);
return true; return true;
} }
// 在switch语句中处理每个ID并在处理完后返回true未处理的情况返回false // 在switch语句中处理每个ID并在处理完后返回true未处理的情况返回false

View File

@ -11,11 +11,10 @@ import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.widget.Toolbar; import android.widget.Toolbar;
import cc.winboll.studio.appbase.R; import cc.winboll.studio.appbase.R;
import cc.winboll.studio.appbase.WinBoLLActivityBase;
import cc.winboll.studio.libappbase.GlobalApplication; import cc.winboll.studio.libappbase.GlobalApplication;
import cc.winboll.studio.libappbase.winboll.IWinBoLLActivity; 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"; public static final String TAG = "NewActivity";
@ -72,7 +71,7 @@ public class NewActivity extends WinBoLLActivityBase implements IWinBoLLActivity
@Override @Override
public boolean onOptionsItemSelected(MenuItem item) { public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == cc.winboll.studio.appbase.R.id.item_log) { if (item.getItemId() == cc.winboll.studio.appbase.R.id.item_log) {
GlobalApplication.getWinBoLLActivityManager().startLogActivity(this); //GlobalApplication.getWinBoLLActivityManager().startLogActivity(this);
return true; return true;
} }
// 在switch语句中处理每个ID并在处理完后返回true未处理的情况返回false // 在switch语句中处理每个ID并在处理完后返回true未处理的情况返回false

View File

@ -0,0 +1,24 @@
package cc.winboll.studio.appbase.activities;
/**
* @Author ZhanGSKen<zhangsken@188.com>
* @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;
}
}

View File

@ -14,10 +14,14 @@ import cc.winboll.studio.appbase.services.MainService;
import cc.winboll.studio.appbase.widgets.APPNewsWidget; import cc.winboll.studio.appbase.widgets.APPNewsWidget;
import cc.winboll.studio.libappbase.AppUtils; import cc.winboll.studio.libappbase.AppUtils;
import cc.winboll.studio.libappbase.LogUtils; 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.SOS;
import cc.winboll.studio.libappbase.sos.SOSObject; import cc.winboll.studio.libappbase.sos.SOSObject;
import cc.winboll.studio.libappbase.utils.ToastUtils; 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.io.IOException;
import java.lang.ref.WeakReference; import java.lang.ref.WeakReference;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
@ -40,21 +44,21 @@ public class MainReceiver extends BroadcastReceiver {
String szAction = intent.getAction(); String szAction = intent.getAction();
if (szAction.equals(ACTION_BOOT_COMPLETED)) { if (szAction.equals(ACTION_BOOT_COMPLETED)) {
ToastUtils.show("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, "ACTION_BIND");
LogUtils.d(TAG, String.format("context.getPackageName() %s", context.getPackageName())); LogUtils.d(TAG, String.format("context.getPackageName() %s", context.getPackageName()));
LogUtils.d(TAG, String.format("intent.getAction() %s", intent.getAction())); LogUtils.d(TAG, String.format("intent.getAction() %s", intent.getAction()));
String szAPPModel = intent.getStringExtra(WinBoLL.EXTRA_APPMODEL); String szWinBoLLModel = intent.getStringExtra(WinBoLL.EXTRA_WINBOLLMODEL);
LogUtils.d(TAG, String.format("szAPPModel %s", szAPPModel)); LogUtils.d(TAG, String.format("szAPPModel %s", szWinBoLLModel));
if (szAPPModel != null && !szAPPModel.equals("")) { if (szWinBoLLModel != null && !szWinBoLLModel.equals("")) {
try { try {
APPModel bean = APPModel.parseStringToBean(szAPPModel, APPModel.class); WinBoLLModel bean = WinBoLLModel.parseStringToBean(szWinBoLLModel, WinBoLLModel.class);
if (bean != null) { if (bean != null) {
String szAppPackageName = bean.getAppPackageName(); String szAppPackageName = bean.getAppPackageName();
LogUtils.d(TAG, String.format("szAppPackageName %s", szAppPackageName)); LogUtils.d(TAG, String.format("szAppPackageName %s", szAppPackageName));
String szAppMainServiveName = bean.getAppMainServiveName(); String szAppMainServiveName = bean.getAppMainServiveName();
LogUtils.d(TAG, String.format("szAppMainServiveName %s", szAppMainServiveName)); LogUtils.d(TAG, String.format("szAppMainServiveName %s", szAppMainServiveName));
mwrService.get().bindAPPModelConnection(bean); mwrService.get().bindWinBoLLModelConnection(bean);
} }
} catch (IOException e) { } catch (IOException e) {
LogUtils.d(TAG, e, Thread.currentThread().getStackTrace()); LogUtils.d(TAG, e, Thread.currentThread().getStackTrace());

View File

@ -18,15 +18,16 @@ import android.content.ServiceConnection;
import android.os.Binder; import android.os.Binder;
import android.os.IBinder; import android.os.IBinder;
import cc.winboll.studio.appbase.MyTileService; 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.handlers.MainServiceHandler;
import cc.winboll.studio.appbase.models.MainServiceBean;
import cc.winboll.studio.appbase.receivers.MainReceiver; import cc.winboll.studio.appbase.receivers.MainReceiver;
import cc.winboll.studio.appbase.services.AssistantService; import cc.winboll.studio.appbase.services.AssistantService;
import cc.winboll.studio.appbase.threads.MainServiceThread; import cc.winboll.studio.appbase.threads.MainServiceThread;
import cc.winboll.studio.appbase.widgets.APPNewsWidget; import cc.winboll.studio.appbase.widgets.APPNewsWidget;
import cc.winboll.studio.libappbase.LogUtils; 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 java.util.ArrayList;
import cc.winboll.studio.libappbase.sos.APPModel;
public class MainService extends Service { 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(...)"); LogUtils.d(TAG, "bindAPPModelConnection(...)");
// 清理旧的绑定链接 // 清理旧的绑定链接
for (int i = mAPPModelConnectionList.size() - 1; i > -1; i--) { 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); Intent intentWidget = new Intent(this, APPNewsWidget.class);
intentWidget.setAction(APPNewsWidget.ACTION_WAKEUP_SERVICE); 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()); intentWidget.putExtra("APPSOSBean", appSOSBean.toString());
sendBroadcast(intentWidget); sendBroadcast(intentWidget);
} }
@ -212,7 +213,7 @@ public class MainService extends Service {
ComponentName mComponentName; ComponentName mComponentName;
boolean isBindToAPP(APPModel bean) { boolean isBindToAPP(WinBoLLModel bean) {
return mComponentName != null return mComponentName != null
&& mComponentName.getClassName().equals(bean.getAppMainServiveName()) && mComponentName.getClassName().equals(bean.getAppMainServiveName())
&& mComponentName.getPackageName().equals(bean.getAppPackageName()); && mComponentName.getPackageName().equals(bean.getAppPackageName());

View File

@ -10,11 +10,12 @@ import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.os.Binder; import android.os.Binder;
import android.os.IBinder; 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.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.sos.SOS;
import cc.winboll.studio.libappbase.winboll.WinBoLL;
public class TestDemoBindService extends Service { public class TestDemoBindService extends Service {

View File

@ -12,7 +12,6 @@ import android.os.Binder;
import android.os.IBinder; import android.os.IBinder;
import cc.winboll.studio.appbase.models.TestDemoServiceBean; import cc.winboll.studio.appbase.models.TestDemoServiceBean;
import cc.winboll.studio.libappbase.LogUtils; import cc.winboll.studio.libappbase.LogUtils;
import cc.winboll.studio.libappbase.sos.WinBoLL;
public class TestDemoService extends Service { public class TestDemoService extends Service {

View File

@ -12,16 +12,17 @@ import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.widget.RemoteViews; import android.widget.RemoteViews;
import cc.winboll.studio.appbase.R; import cc.winboll.studio.appbase.R;
import cc.winboll.studio.appbase.models.WinBoLLNewsBean;
import cc.winboll.studio.appbase.receivers.APPNewsWidgetClickListener; import cc.winboll.studio.appbase.receivers.APPNewsWidgetClickListener;
import cc.winboll.studio.libappbase.AppUtils; import cc.winboll.studio.libappbase.AppUtils;
import cc.winboll.studio.libappbase.LogUtils; 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.sos.WinBoLL; import cc.winboll.studio.libappbase.models.WinBoLLNewsBean;
import cc.winboll.studio.libappbase.winboll.WinBoLL;
import java.io.IOException; import java.io.IOException;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import cc.winboll.studio.libappbase.models.WinBoLLModel;
public class APPNewsWidget extends AppWidgetProvider { public class APPNewsWidget extends AppWidgetProvider {
@ -57,11 +58,11 @@ public class APPNewsWidget extends AppWidgetProvider {
} }
}else if (intent.getAction().equals(ACTION_WAKEUP_SERVICE)) { }else if (intent.getAction().equals(ACTION_WAKEUP_SERVICE)) {
LogUtils.d(TAG, "ACTION_WAKEUP_SERVICE"); LogUtils.d(TAG, "ACTION_WAKEUP_SERVICE");
String szAPPModel = intent.getStringExtra(WinBoLL.EXTRA_APPMODEL); String szWinBoLLModel = intent.getStringExtra(WinBoLL.EXTRA_WINBOLLMODEL);
LogUtils.d(TAG, String.format("szAPPModel %s", szAPPModel)); LogUtils.d(TAG, String.format("szWinBoLLModel %s", szWinBoLLModel));
if (szAPPModel != null && !szAPPModel.equals("")) { if (szWinBoLLModel != null && !szWinBoLLModel.equals("")) {
try { try {
APPModel bean = APPModel.parseStringToBean(szAPPModel, APPModel.class); WinBoLLModel bean = WinBoLLModel.parseStringToBean(szWinBoLLModel, WinBoLLModel.class);
if (bean != null) { if (bean != null) {
String szAppPackageName = bean.getAppPackageName(); String szAppPackageName = bean.getAppPackageName();
LogUtils.d(TAG, String.format("szAppPackageName %s", szAppPackageName)); LogUtils.d(TAG, String.format("szAppPackageName %s", szAppPackageName));

View File

@ -212,5 +212,10 @@
</ScrollView> </ScrollView>
<cc.winboll.studio.libappbase.LogView
android:layout_width="match_parent"
android:layout_height="300dp"
android:id="@+id/logview"/>
</LinearLayout> </LinearLayout>

View File

@ -1,8 +1,8 @@
#Created by .winboll/winboll_app_build.gradle #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 stageCount=7
libraryProject=libappbase libraryProject=libappbase
baseVersion=15.7 baseVersion=15.7
publishVersion=15.7.6 publishVersion=15.7.6
buildCount=4 buildCount=7
baseBetaVersion=15.7.7 baseBetaVersion=15.7.7

View File

@ -9,11 +9,11 @@ import android.app.Application;
import android.content.Context; import android.content.Context;
import android.content.pm.ApplicationInfo; import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.os.Handler; import cc.winboll.studio.libappbase.GlobalApplication;
import android.os.Looper; import cc.winboll.studio.libappbase.models.APPModel;
import cc.winboll.studio.libappbase.utils.ToastUtils; 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.MyActivityLifecycleCallbacks;
import cc.winboll.studio.libappbase.winboll.WinBoLLActivityManager;
public class GlobalApplication extends Application { public class GlobalApplication extends Application {
@ -30,7 +30,7 @@ public class GlobalApplication extends Application {
public static void saveDebugStatus() { public static void saveDebugStatus() {
if (_GlobalApplication != null) { 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; return _GlobalApplication;
} }
static String getAPPBaseModelFilePath() { static String getAPPModelFilePath() {
return _GlobalApplication.getDataDir().getPath() + "/APPBaseModel.json"; return _GlobalApplication.getDataDir().getPath() + "/APPModel.json";
} }
public static boolean isDebuging() { public static boolean isDebuging() {
@ -69,12 +69,12 @@ public class GlobalApplication extends Application {
ToastUtils.init(this); ToastUtils.init(this);
// 应用保存的调试标志 // 应用保存的调试标志
APPBaseModel appBaseModel = APPBaseModel.loadBeanFromFile(getAPPBaseModelFilePath(), APPBaseModel.class); APPModel appModel = APPModel.loadBeanFromFile(getAPPModelFilePath(), APPModel.class);
if (appBaseModel == null) { if (appModel == null) {
setIsDebuging(false); setIsDebuging(false);
saveDebugStatus(); saveDebugStatus();
} else { } else {
setIsDebuging(appBaseModel.isDebuging()); setIsDebuging(appModel.isDebuging());
} }
getWinBoLLActivityManager().setWinBoLLUI_TYPE(WinBoLLActivityManager.WinBoLLUI_TYPE.Service); getWinBoLLActivityManager().setWinBoLLUI_TYPE(WinBoLLActivityManager.WinBoLLUI_TYPE.Service);

View File

@ -1,28 +1,28 @@
package cc.winboll.studio.libappbase; package cc.winboll.studio.libappbase.models;
/** /**
* @Author ZhanGSKen<zhangsken@188.com> * @Author ZhanGSKen<zhangsken@188.com>
* @Date 2025/03/25 02:52:46 * @Date 2025/03/02 10:28:08
* @Describe 基础应用数据模型 * @Describe 应用调试模型
*/ */
import android.util.JsonReader; import android.util.JsonReader;
import android.util.JsonWriter; import android.util.JsonWriter;
import cc.winboll.studio.libappbase.BaseBean; import cc.winboll.studio.libappbase.BaseBean;
import java.io.IOException; 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; boolean isDebuging = false;
public APPBaseModel() { public APPModel() {
this.isDebuging = false; this.isDebuging = false;
} }
public APPBaseModel(boolean isDebuging) { public APPModel(boolean isDebuging) {
this.isDebuging = isDebuging; this.isDebuging = isDebuging;
} }
@ -36,7 +36,7 @@ public class APPBaseModel extends BaseBean {
@Override @Override
public String getName() { public String getName() {
return APPBaseModel.class.getName(); return APPModel.class.getName();
} }
@Override @Override

View File

@ -1,28 +1,33 @@
package cc.winboll.studio.libappbase.sos; package cc.winboll.studio.libappbase.models;
/** /**
* @Author ZhanGSKen<zhangsken@188.com> * @Author ZhanGSKen<zhangsken@188.com>
* @Date 2025/03/02 10:28:08 * @Date 2025/05/10 10:16
* @Describe APPModel * @Describe WinBoLLModel
*/ */
import android.util.JsonReader; import android.util.JsonReader;
import android.util.JsonWriter; import android.util.JsonWriter;
import cc.winboll.studio.libappbase.BaseBean; import cc.winboll.studio.libappbase.BaseBean;
import java.io.IOException; import java.io.IOException;
public class APPModel extends BaseBean { public class WinBoLLModel extends BaseBean {
public static final String TAG = "APPModel"; public static final String TAG = "WinBoLLModel";
String appPackageName; String appPackageName;
String appMainServiveName; String appMainServiveName;
public APPModel() { public WinBoLLModel() {
this.appPackageName = ""; this.appPackageName = "";
this.appMainServiveName = ""; 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.appPackageName = appPackageName;
this.appMainServiveName = appMainServiveName; this.appMainServiveName = appMainServiveName;
} }
@ -53,7 +58,6 @@ public class APPModel extends BaseBean {
super.writeThisToJsonWriter(jsonWriter); super.writeThisToJsonWriter(jsonWriter);
jsonWriter.name("appPackageName").value(getAppPackageName()); jsonWriter.name("appPackageName").value(getAppPackageName());
jsonWriter.name("appMainServiveName").value(getAppMainServiveName()); jsonWriter.name("appMainServiveName").value(getAppMainServiveName());
} }
@Override @Override
@ -84,3 +88,4 @@ public class APPModel extends BaseBean {
return this; return this;
} }
} }

View File

@ -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<zhangsken@188.com>
* @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;
}
}

View File

@ -0,0 +1,17 @@
package cc.winboll.studio.libappbase.winboll;
import android.app.Activity;
/**
* @Author ZhanGSKen<zhangsken@188.com>
* @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();
}

View File

@ -0,0 +1,40 @@
package cc.winboll.studio.libappbase.winboll;
/**
* @Author ZhanGSKen<zhangsken@188.com>
* @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);
}
}

View File

@ -0,0 +1,282 @@
package cc.winboll.studio.libappbase.winboll;
/**
* @Author ZhanGSKen<zhangsken@188.com>
* @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<String, IWinBoLLActivity> 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<String, IWinBoLLActivity>();
}
public static synchronized WinBoLLActivityManager getInstance(Context context) {
if (_mIWinBoLLActivityManager == null) {
_mIWinBoLLActivityManager = new WinBoLLActivityManager(context);
}
return _mIWinBoLLActivityManager;
}
/**
* 把Activity添加到管理中
*/
public <T extends IWinBoLLActivity> 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 <T extends IWinBoLLActivity> void startWinBoLLActivity(Context context, Class<T> 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 <T extends IWinBoLLActivity> void startWinBoLLActivity(Context context, Intent intent, Class<T> 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 <T extends IWinBoLLActivity> 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 <T extends IWinBoLLActivity> 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 <T extends IWinBoLLActivity> 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<String, IWinBoLLActivity> 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 <T extends IWinBoLLActivity> 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<Map.Entry<String, IWinBoLLActivity>> iterator = mActivityListMap.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<String, IWinBoLLActivity> 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.");
}
}
}