diff --git a/appbase/build.gradle b/appbase/build.gradle index f59582b..f1adbe8 100644 --- a/appbase/build.gradle +++ b/appbase/build.gradle @@ -30,7 +30,7 @@ android { // versionName 更新后需要手动设置 // .winboll/winbollBuildProps.properties 文件的 stageCount=0 // Gradle编译环境下合起来的 versionName 就是 "${versionName}.0" - versionName "15.9" + versionName "15.10" if(true) { versionName = genVersionName("${versionName}") } diff --git a/appbase/build.properties b/appbase/build.properties index 7928c98..5cf4049 100644 --- a/appbase/build.properties +++ b/appbase/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Mon Sep 15 18:05:08 HKT 2025 -stageCount=6 +#Sun Sep 21 16:44:01 GMT 2025 +stageCount=0 libraryProject=libappbase -baseVersion=15.9 -publishVersion=15.9.5 -buildCount=46 -baseBetaVersion=15.9.6 +baseVersion=15.10 +publishVersion=15.10.0 +buildCount=6 +baseBetaVersion=15.10.1 diff --git a/appbase/src/main/AndroidManifest.xml b/appbase/src/main/AndroidManifest.xml index 66f68a3..4b2817e 100644 --- a/appbase/src/main/AndroidManifest.xml +++ b/appbase/src/main/AndroidManifest.xml @@ -9,10 +9,9 @@ android:label="@string/app_name" android:theme="@style/MyAPPBaseTheme" android:resizeableActivity="true" - android:process=":App" - android:networkSecurityConfig="@xml/network_security_config"> + android:process=":App"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + 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 1160928..271747c 100644 --- a/appbase/src/main/java/cc/winboll/studio/appbase/App.java +++ b/appbase/src/main/java/cc/winboll/studio/appbase/App.java @@ -5,23 +5,15 @@ package cc.winboll.studio.appbase; * @Date 2025/01/05 09:54:42 * @Describe APPbase 应用类 */ -import cc.winboll.studio.libappbase.GlobalApplication; import android.content.IntentFilter; -import cc.winboll.studio.libappbase.sos.SOSCenterServiceReceiver; -import cc.winboll.studio.libappbase.sos.SOS; +import cc.winboll.studio.libappbase.GlobalApplication; public class App extends GlobalApplication { public static final String TAG = "App"; - SOSCenterServiceReceiver mSOSCenterServiceReceiver; - @Override public void onCreate() { super.onCreate(); - mSOSCenterServiceReceiver = new SOSCenterServiceReceiver(); - IntentFilter intentFilter = new IntentFilter(); - intentFilter.addAction(SOS.ACTION_SOS); - registerReceiver(mSOSCenterServiceReceiver, intentFilter); } } 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 7f55f8a..f2cadee 100644 --- a/appbase/src/main/java/cc/winboll/studio/appbase/MainActivity.java +++ b/appbase/src/main/java/cc/winboll/studio/appbase/MainActivity.java @@ -10,35 +10,16 @@ import android.view.View; 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; 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; +import cc.winboll.studio.libappbase.ToastUtils; -public class MainActivity extends WinBoLLActivity implements IWinBoLLActivity { +public class MainActivity extends Activity { public static final String TAG = "MainActivity"; - @Override - public Activity getActivity() { - return this; - } - - @Override - public String getTag() { - return TAG; - } - Toolbar mToolbar; @Override @@ -71,113 +52,15 @@ public class MainActivity extends WinBoLLActivity implements IWinBoLLActivity { return super.onOptionsItemSelected(item); } - @Override - protected void onDestroy() { - super.onDestroy(); - Intent intentAPPWidget = new Intent(this, StatusWidget.class); - intentAPPWidget.setAction(StatusWidget.ACTION_STATUS_UPDATE); - sendBroadcast(intentAPPWidget); + public void onCrashTest(View view) { + for (int i = Integer.MIN_VALUE; i < Integer.MAX_VALUE; i++) { + getString(i); + } } - - public void onSwitchDebugMode(View view) { - boolean isDebuging = ((CheckBox)view).isChecked(); - 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..."); - startActivity(intent); - } - - public void onStartCenter(View view) { - MainService.startMainService(this); - } - - public void onStopCenter(View view) { - MainService.stopMainService(this); - } - - public void onTestStopMainServiceWithoutSettingEnable(View view) { - LogUtils.d(TAG, "onTestStopMainServiceWithoutSettingEnable"); - stopService(new Intent(this, MainService.class)); - } - - public void onTestUseComponentStartService(View view) { - LogUtils.d(TAG, "onTestUseComponentStartService"); - - // 目标服务的包名和类名 - String packageName = this.getPackageName(); - String serviceClassName = TestDemoService.class.getName(); - - // 构建Intent - Intent intentService = new Intent(); - intentService.setComponent(new ComponentName(packageName, serviceClassName)); - - startService(intentService); - } - - public void onTestDemoServiceSOS(View view) { - Intent intent = new Intent(this, TestDemoService.class); - stopService(intent); - if (App.isDebuging()) { - SOS.sosToAppBaseBeta(this, TestDemoService.class.getName()); - } else { - SOS.sosToAppBase(this, TestDemoService.class.getName()); - } - } - - public void onSartTestDemoService(View view) { + + public void onLogTest(View view) { Intent intent = new Intent(this, TestDemoService.class); intent.setAction(TestDemoService.ACTION_ENABLE); startService(intent); - } - - public void onStopTestDemoService(View view) { - Intent intent = new Intent(this, TestDemoService.class); - intent.setAction(TestDemoService.ACTION_DISABLE); - startService(intent); - - Intent intentStop = new Intent(this, TestDemoService.class); - stopService(intentStop); - } - - public void onStopTestDemoServiceNoSettings(View view) { - Intent intent = new Intent(this, TestDemoService.class); - stopService(intent); - } - - public void onSartTestDemoBindService(View view) { - Intent intent = new Intent(this, TestDemoBindService.class); - intent.setAction(TestDemoBindService.ACTION_ENABLE); - startService(intent); - - } - - public void onStopTestDemoBindService(View view) { - Intent intent = new Intent(this, TestDemoBindService.class); - intent.setAction(TestDemoBindService.ACTION_DISABLE); - startService(intent); - - Intent intentStop = new Intent(this, TestDemoBindService.class); - stopService(intentStop); - } - - public void onStopTestDemoBindServiceNoSettings(View view) { - Intent intent = new Intent(this, TestDemoBindService.class); - stopService(intent); - } - - public void onTestOpenNewActivity(View view) { - GlobalApplication.getWinBoLLActivityManager().startWinBoLLActivity(this, NewActivity.class); - } - - @Override - protected void onResume() { - super.onResume(); - } - - } diff --git a/appbase/src/main/java/cc/winboll/studio/appbase/MyTileService.java b/appbase/src/main/java/cc/winboll/studio/appbase/MyTileService.java deleted file mode 100644 index 9e17410..0000000 --- a/appbase/src/main/java/cc/winboll/studio/appbase/MyTileService.java +++ /dev/null @@ -1,79 +0,0 @@ -package cc.winboll.studio.appbase; - -/** - * @Author ZhanGSKen - * @Date 2025/02/13 19:30:10 - */ -import android.content.Context; -import android.service.quicksettings.Tile; -import android.service.quicksettings.TileService; -import cc.winboll.studio.appbase.models.MainServiceBean; -import cc.winboll.studio.appbase.services.MainService; - -public class MyTileService extends TileService { - public static final String TAG = "MyTileService"; - - volatile static MyTileService _MyTileService; - - @Override - public void onStartListening() { - super.onStartListening(); - _MyTileService = this; - Tile tile = getQsTile(); - MainServiceBean bean = MainServiceBean.loadBean(this, MainServiceBean.class); - if (bean != null && bean.isEnable()) { - //MainService.startMainService(context); - tile.setState(Tile.STATE_ACTIVE); - tile.setIcon(android.graphics.drawable.Icon.createWithResource(this, R.drawable.ic_cloud)); - } else { - //MainService.stopMainService(context); - tile.setState(Tile.STATE_INACTIVE); - tile.setIcon(android.graphics.drawable.Icon.createWithResource(this, R.drawable.ic_cloud_outline)); - } - tile.updateTile(); -// Tile tile = getQsTile(); -// tile.setState(Tile.STATE_INACTIVE); -// tile.setLabel(getString(R.string.tileservice_name)); -// tile.setIcon(android.graphics.drawable.Icon.createWithResource(this, R.drawable.ic_cloud_outline)); -// tile.updateTile(); - - } - - @Override - public void onClick() { - super.onClick(); - Tile tile = getQsTile(); - MainServiceBean bean = MainServiceBean.loadBean(this, MainServiceBean.class); - if (bean == null) { - bean = new MainServiceBean(); - } - - if (tile.getState() == Tile.STATE_ACTIVE) { - bean.setIsEnable(false); - MainServiceBean.saveBean(this, bean); - MainService.stopMainService(this); - } else if (tile.getState() == Tile.STATE_INACTIVE) { - bean.setIsEnable(true); - MainServiceBean.saveBean(this, bean); - MainService.startMainService(this); - } - updateServiceIconStatus(this); - } - - public static void updateServiceIconStatus(Context context) { - if (_MyTileService == null) { - return; - } - - Tile tile = _MyTileService.getQsTile(); - MainServiceBean bean = MainServiceBean.loadBean(context, MainServiceBean.class); - if (bean != null && bean.isEnable()) { - tile.setState(Tile.STATE_ACTIVE); - tile.setIcon(android.graphics.drawable.Icon.createWithResource(context, R.drawable.ic_cloud)); - } else { - tile.setState(Tile.STATE_INACTIVE); - tile.setIcon(android.graphics.drawable.Icon.createWithResource(context, R.drawable.ic_cloud_outline)); - } - tile.updateTile(); - } -} 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 deleted file mode 100644 index faf79d2..0000000 --- a/appbase/src/main/java/cc/winboll/studio/appbase/activities/New2Activity.java +++ /dev/null @@ -1,77 +0,0 @@ -package cc.winboll.studio.appbase.activities; - -/** - * @Author ZhanGSKen - * @Date 2025/03/25 11:46:40 - * @Describe 测试窗口2 - */ -import android.app.Activity; -import android.os.Bundle; -import android.view.Menu; -import android.view.MenuItem; -import android.view.View; -import android.widget.Toolbar; -import cc.winboll.studio.appbase.R; -import cc.winboll.studio.libappbase.GlobalApplication; -import cc.winboll.studio.libappbase.winboll.IWinBoLLActivity; - -public class New2Activity extends WinBoLLActivity implements IWinBoLLActivity { - - public static final String TAG = "New2Activity"; - - Toolbar mToolbar; - //LogView mLogView; - - @Override - public Activity getActivity() { - return this; - } - - @Override - public String getTag() { - return TAG; - } - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_new2); - -// mLogView = findViewById(R.id.logview); -// mLogView.start(); - mToolbar = findViewById(R.id.toolbar); - setActionBar(mToolbar); - - } - - @Override - protected void onResume() { - super.onResume(); - //mLogView.start(); - } - - public void onCloseThisActivity(View view) { - GlobalApplication.getWinBoLLActivityManager().finish(this); - } - - public void onCloseAllActivity(View view) { - GlobalApplication.getWinBoLLActivityManager().finishAll(); - } - - public void onNewActivity(View view) { - GlobalApplication.getWinBoLLActivityManager().startWinBoLLActivity(this, NewActivity.class); - } - - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - getMenuInflater().inflate(R.menu.toolbar_main, menu); - return super.onCreateOptionsMenu(menu); - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - // 在switch语句中处理每个ID,并在处理完后返回true,未处理的情况返回false。 - return super.onOptionsItemSelected(item); - } -} 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 deleted file mode 100644 index f87156e..0000000 --- a/appbase/src/main/java/cc/winboll/studio/appbase/activities/NewActivity.java +++ /dev/null @@ -1,76 +0,0 @@ -package cc.winboll.studio.appbase.activities; - -/** - * @Author ZhanGSKen&豆包大模型 - * @Date 2025/03/25 05:04:22 - * @Describe - */ -import android.app.Activity; -import android.os.Bundle; -import android.view.Menu; -import android.view.MenuItem; -import android.view.View; -import android.widget.Toolbar; -import cc.winboll.studio.appbase.R; -import cc.winboll.studio.libappbase.GlobalApplication; -import cc.winboll.studio.libappbase.winboll.IWinBoLLActivity; - -public class NewActivity extends WinBoLLActivity implements IWinBoLLActivity { - - public static final String TAG = "NewActivity"; - - Toolbar mToolbar; - //LogView mLogView; - - @Override - public Activity getActivity() { - return this; - } - - @Override - public String getTag() { - return TAG; - } - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_new); -// mLogView = findViewById(R.id.logview); -// mLogView.start(); - mToolbar = findViewById(R.id.toolbar); - setActionBar(mToolbar); - - } - - @Override - protected void onResume() { - super.onResume(); - //mLogView.start(); - } - - public void onCloseThisActivity(View view) { - GlobalApplication.getWinBoLLActivityManager().finish(this); - } - - public void onCloseAllActivity(View view) { - GlobalApplication.getWinBoLLActivityManager().finishAll(); - } - - public void onNew2Activity(View view) { - GlobalApplication.getWinBoLLActivityManager().startWinBoLLActivity(this, New2Activity.class); - } - - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - getMenuInflater().inflate(R.menu.toolbar_main, menu); - return super.onCreateOptionsMenu(menu); - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - // 在switch语句中处理每个ID,并在处理完后返回true,未处理的情况返回false。 - return super.onOptionsItemSelected(item); - } -} 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 deleted file mode 100644 index 0721c40..0000000 --- a/appbase/src/main/java/cc/winboll/studio/appbase/activities/WinBoLLActivity.java +++ /dev/null @@ -1,61 +0,0 @@ -package cc.winboll.studio.appbase.activities; - -/** - * @Author ZhanGSKen - * @Date 2025/05/10 09:48 - * @Describe WinBoLL 窗口基础类 - */ -import android.app.Activity; -import android.os.Bundle; -import android.view.MenuItem; -import cc.winboll.studio.appbase.MainActivity; -import cc.winboll.studio.appbase.R; -import cc.winboll.studio.libappbase.GlobalApplication; -import cc.winboll.studio.libappbase.LogUtils; -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; - } - - @Override - protected void onResume() { - super.onResume(); - LogUtils.d(TAG, String.format("onResume %s", getTag())); - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - if (item.getItemId() == R.id.item_log) { - GlobalApplication.getWinBoLLActivityManager().startLogActivity(this); - return true; - } else if (item.getItemId() == R.id.item_home) { - GlobalApplication.getWinBoLLActivityManager().startWinBoLLActivity(getApplicationContext(), MainActivity.class); - return true; - } - // 在switch语句中处理每个ID,并在处理完后返回true,未处理的情况返回false。 - return super.onOptionsItemSelected(item); - } - - @Override - protected void onPostCreate(Bundle savedInstanceState) { - super.onPostCreate(savedInstanceState); - GlobalApplication.getWinBoLLActivityManager().add(this); - } - - @Override - protected void onDestroy() { - super.onDestroy(); - GlobalApplication.getWinBoLLActivityManager().registeRemove(this); - } -} diff --git a/appbase/src/main/java/cc/winboll/studio/appbase/handlers/MainServiceHandler.java b/appbase/src/main/java/cc/winboll/studio/appbase/handlers/MainServiceHandler.java deleted file mode 100644 index c9d6a0e..0000000 --- a/appbase/src/main/java/cc/winboll/studio/appbase/handlers/MainServiceHandler.java +++ /dev/null @@ -1,38 +0,0 @@ -package cc.winboll.studio.appbase.handlers; - -/** - * @Author ZhanGSKen - * @Date 2025/02/14 03:51:40 - */ -import android.os.Handler; -import android.os.Message; -import cc.winboll.studio.appbase.services.MainService; -import java.lang.ref.WeakReference; - -public class MainServiceHandler extends Handler { - public static final String TAG = "MainServiceHandler"; - - public static final int MSG_REMINDTHREAD = 0; - - WeakReference serviceWeakReference; - public MainServiceHandler(MainService service) { - serviceWeakReference = new WeakReference(service); - } - - @Override - public void handleMessage(Message msg) { - switch (msg.what) { - case MSG_REMINDTHREAD: // 处理下载完成消息,更新UI - { - // 显示提醒消息 - // - //LogUtils.d(TAG, "显示提醒消息"); - MainService mainService = serviceWeakReference.get(); - if (mainService != null) { - mainService.appenMessage((String)msg.obj); - } - break; - } - } - } -} diff --git a/appbase/src/main/java/cc/winboll/studio/appbase/models/MainServiceBean.java b/appbase/src/main/java/cc/winboll/studio/appbase/models/MainServiceBean.java deleted file mode 100644 index 01dc414..0000000 --- a/appbase/src/main/java/cc/winboll/studio/appbase/models/MainServiceBean.java +++ /dev/null @@ -1,67 +0,0 @@ -package cc.winboll.studio.appbase.models; - -/** - * @Author ZhanGSKen - * @Date 2025/02/13 07:06:13 - */ -import android.util.JsonReader; -import android.util.JsonWriter; -import cc.winboll.studio.libappbase.BaseBean; -import java.io.IOException; - -public class MainServiceBean extends BaseBean { - - public static final String TAG = "MainServiceBean"; - - boolean isEnable; - - public MainServiceBean() { - this.isEnable = false; - } - - public void setIsEnable(boolean isEnable) { - this.isEnable = isEnable; - } - - public boolean isEnable() { - return isEnable; - } - - @Override - public String getName() { - return MainServiceBean.class.getName(); - } - - @Override - public void writeThisToJsonWriter(JsonWriter jsonWriter) throws IOException { - super.writeThisToJsonWriter(jsonWriter); - jsonWriter.name("isEnable").value(isEnable()); - - } - - @Override - public boolean initObjectsFromJsonReader(JsonReader jsonReader, String name) throws IOException { - if (super.initObjectsFromJsonReader(jsonReader, name)) { return true; } else { - if (name.equals("isEnable")) { - setIsEnable(jsonReader.nextBoolean()); - } 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/appbase/src/main/java/cc/winboll/studio/appbase/models/TestDemoBindServiceBean.java b/appbase/src/main/java/cc/winboll/studio/appbase/models/TestDemoBindServiceBean.java deleted file mode 100644 index 75f7184..0000000 --- a/appbase/src/main/java/cc/winboll/studio/appbase/models/TestDemoBindServiceBean.java +++ /dev/null @@ -1,67 +0,0 @@ -package cc.winboll.studio.appbase.models; - -/** - * @Author ZhanGSKen - * @Date 2025/03/07 12:47:22 - * @Describe TestServiceBean - */ -import android.util.JsonReader; -import android.util.JsonWriter; -import cc.winboll.studio.libappbase.BaseBean; -import java.io.IOException; - -public class TestDemoBindServiceBean extends BaseBean { - - public static final String TAG = "TestServiceBean"; - - boolean isEnable; - - public TestDemoBindServiceBean() { - this.isEnable = false; - } - - public void setIsEnable(boolean isEnable) { - this.isEnable = isEnable; - } - - public boolean isEnable() { - return isEnable; - } - - @Override - public String getName() { - return TestDemoBindServiceBean.class.getName(); - } - - @Override - public void writeThisToJsonWriter(JsonWriter jsonWriter) throws IOException { - super.writeThisToJsonWriter(jsonWriter); - jsonWriter.name("isEnable").value(isEnable()); - } - - @Override - public boolean initObjectsFromJsonReader(JsonReader jsonReader, String name) throws IOException { - if (super.initObjectsFromJsonReader(jsonReader, name)) { return true; } else { - if (name.equals("isEnable")) { - setIsEnable(jsonReader.nextBoolean()); - } 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/appbase/src/main/java/cc/winboll/studio/appbase/models/TestDemoServiceBean.java b/appbase/src/main/java/cc/winboll/studio/appbase/models/TestDemoServiceBean.java deleted file mode 100644 index 8d6a379..0000000 --- a/appbase/src/main/java/cc/winboll/studio/appbase/models/TestDemoServiceBean.java +++ /dev/null @@ -1,68 +0,0 @@ -package cc.winboll.studio.appbase.models; - -/** - * @Author ZhanGSKen - * @Date 2025/03/07 12:49:21 - * @Describe TestDemoServiceBean - */ -import android.util.JsonReader; -import android.util.JsonWriter; -import cc.winboll.studio.libappbase.BaseBean; -import java.io.IOException; - -public class TestDemoServiceBean extends BaseBean { - - public static final String TAG = "TestDemoServiceBean"; - - boolean isEnable; - - public TestDemoServiceBean() { - this.isEnable = false; - } - - public void setIsEnable(boolean isEnable) { - this.isEnable = isEnable; - } - - public boolean isEnable() { - return isEnable; - } - - @Override - public String getName() { - return TestDemoServiceBean.class.getName(); - } - - @Override - public void writeThisToJsonWriter(JsonWriter jsonWriter) throws IOException { - super.writeThisToJsonWriter(jsonWriter); - jsonWriter.name("isEnable").value(isEnable()); - - } - - @Override - public boolean initObjectsFromJsonReader(JsonReader jsonReader, String name) throws IOException { - if (super.initObjectsFromJsonReader(jsonReader, name)) { return true; } else { - if (name.equals("isEnable")) { - setIsEnable(jsonReader.nextBoolean()); - } 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/appbase/src/main/java/cc/winboll/studio/appbase/receivers/APPNewsWidgetClickListener.java b/appbase/src/main/java/cc/winboll/studio/appbase/receivers/APPNewsWidgetClickListener.java deleted file mode 100644 index fd4a35d..0000000 --- a/appbase/src/main/java/cc/winboll/studio/appbase/receivers/APPNewsWidgetClickListener.java +++ /dev/null @@ -1,36 +0,0 @@ -package cc.winboll.studio.appbase.receivers; - -/** - * @Author ZhanGSKen - * @Date 2025/03/24 07:11:44 - */ -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import cc.winboll.studio.appbase.widgets.APPNewsWidget; -import cc.winboll.studio.libappbase.LogUtils; - -public class APPNewsWidgetClickListener extends BroadcastReceiver { - - public static final String TAG = "APPNewsWidgetClickListener"; - public static final String ACTION_PRE = APPNewsWidgetClickListener.class.getName() + ".ACTION_PRE"; - public static final String ACTION_NEXT = APPNewsWidgetClickListener.class.getName() + ".ACTION_NEXT"; - - @Override - public void onReceive(Context context, Intent intent) { - String action = intent.getAction(); - if (action == null) { - LogUtils.d(TAG, String.format("action %s", action)); - return; - } - if (action.equals(ACTION_PRE)) { - LogUtils.d(TAG, "ACTION_PRE"); - APPNewsWidget.prePage(context); - } else if (action.equals(ACTION_NEXT)) { - LogUtils.d(TAG, "ACTION_NEXT"); - APPNewsWidget.nextPage(context); - } else { - LogUtils.d(TAG, String.format("action %s", action)); - } - } -} 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 deleted file mode 100644 index 14f4318..0000000 --- a/appbase/src/main/java/cc/winboll/studio/appbase/receivers/MainReceiver.java +++ /dev/null @@ -1,119 +0,0 @@ -package cc.winboll.studio.appbase.receivers; - -/** - * @Author ZhanGSKen - * @Date 2025/02/13 06:58:04 - * @Describe 主要广播接收器 - */ -import android.content.BroadcastReceiver; -import android.content.ComponentName; -import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -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.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; -import java.util.Date; - -public class MainReceiver extends BroadcastReceiver { - - public static final String TAG = "MainReceiver"; - - public static final String ACTION_BOOT_COMPLETED = "android.intent.action.BOOT_COMPLETED"; - - WeakReference mwrService; - - public MainReceiver(MainService service) { - mwrService = new WeakReference(service); - } - - @Override - public void onReceive(Context context, Intent intent) { - String szAction = intent.getAction(); - if (szAction.equals(ACTION_BOOT_COMPLETED)) { - ToastUtils.show("ACTION_BOOT_COMPLETED"); - } 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 szWinBoLLModel = intent.getStringExtra(WinBoLL.EXTRA_WINBOLLMODEL); - LogUtils.d(TAG, String.format("szAPPModel %s", szWinBoLLModel)); - if (szWinBoLLModel != null && !szWinBoLLModel.equals("")) { - try { - 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().bindWinBoLLModelConnection(bean); - } - } catch (IOException e) { - LogUtils.d(TAG, e, Thread.currentThread().getStackTrace()); - } - } - } else if (intent.getAction().equals(SOS.ACTION_SOS)) { - LogUtils.d(TAG, "ACTION_SOS"); - String sos = intent.getStringExtra(SOS.EXTRA_OBJECT); - LogUtils.d(TAG, String.format("SOS %s", sos)); - if (sos != null && !sos.equals("")) { - SOSObject bean = SOS.parseSOSObject(sos); - if (bean != null) { - String szObjectPackageName = bean.getObjectPackageName(); - LogUtils.d(TAG, String.format("szObjectPackageName %s", szObjectPackageName)); - String szObjectServiveName = bean.getObjectServiveName(); - LogUtils.d(TAG, String.format("szObjectServiveName %s", szObjectServiveName)); - - Intent intentService = new Intent(); - intentService.setComponent(new ComponentName(szObjectPackageName, szObjectServiveName)); - context.startService(intentService); - - String appName = AppUtils.getAppNameByPackageName(context, szObjectPackageName); - LogUtils.d(TAG, String.format("appName %s", appName)); - WinBoLLNewsBean appWinBoLLNewsBean = new WinBoLLNewsBean(appName); - SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); - String currentTime = sdf.format(new Date()); - StringBuilder sbLine = new StringBuilder(); - sbLine.append("["); - sbLine.append(currentTime); - sbLine.append("] Power to "); - sbLine.append(appName); - appWinBoLLNewsBean.setMessage(sbLine.toString()); - - APPNewsWidget.addWinBoLLNewsBean(context, appWinBoLLNewsBean); - - Intent intentWidget = new Intent(context, APPNewsWidget.class); - intentWidget.setAction(APPNewsWidget.ACTION_RELOAD_REPORT); - context.sendBroadcast(intentWidget); - } - - - } - } else { - ToastUtils.show(szAction); - } - } - - // 注册 Receiver - // - public void registerAction(MainService service) { - IntentFilter filter=new IntentFilter(); - filter.addAction(ACTION_BOOT_COMPLETED); - filter.addAction(SOS.ACTION_SOS); - filter.addAction(WinBoLL.ACTION_BIND); - //filter.addAction(Intent.ACTION_BATTERY_CHANGED); - service.registerReceiver(this, filter); - } -} diff --git a/appbase/src/main/java/cc/winboll/studio/appbase/services/AssistantService.java b/appbase/src/main/java/cc/winboll/studio/appbase/services/AssistantService.java deleted file mode 100644 index 0770241..0000000 --- a/appbase/src/main/java/cc/winboll/studio/appbase/services/AssistantService.java +++ /dev/null @@ -1,138 +0,0 @@ -package cc.winboll.studio.appbase.services; - -/** - * @Author ZhanGSKen - * @Date 2025/02/14 03:38:31 - * @Describe 守护进程服务 - */ -import android.app.Service; -import android.content.ComponentName; -import android.content.Context; -import android.content.Intent; -import android.content.ServiceConnection; -import android.os.IBinder; -import cc.winboll.studio.appbase.models.MainServiceBean; -import cc.winboll.studio.appbase.services.AssistantService; -import cc.winboll.studio.appbase.services.MainService; -import cc.winboll.studio.libappbase.LogUtils; -import android.os.Binder; - -public class AssistantService extends Service { - - public static final String TAG = "AssistantService"; - - MainServiceBean mMainServiceBean; - MyServiceConnection mMyServiceConnection; - MainService mMainService; - boolean isBound = false; - volatile boolean isThreadAlive = false; - - public synchronized void setIsThreadAlive(boolean isThreadAlive) { - LogUtils.d(TAG, "setIsThreadAlive(...)"); - LogUtils.d(TAG, String.format("isThreadAlive %s", isThreadAlive)); - this.isThreadAlive = isThreadAlive; - } - - public boolean isThreadAlive() { - return isThreadAlive; - } - - @Override - public IBinder onBind(Intent intent) { - return new MyBinder(); - } - - @Override - public void onCreate() { - LogUtils.d(TAG, "onCreate"); - super.onCreate(); - - //mMyBinder = new MyBinder(); - if (mMyServiceConnection == null) { - mMyServiceConnection = new MyServiceConnection(); - } - // 设置运行参数 - setIsThreadAlive(false); - assistantService(); - } - - @Override - public int onStartCommand(Intent intent, int flags, int startId) { - LogUtils.d(TAG, "call onStartCommand(...)"); - assistantService(); - return START_STICKY; - } - - @Override - public void onDestroy() { - //LogUtils.d(TAG, "onDestroy"); - setIsThreadAlive(false); - // 解除绑定 - if (isBound) { - unbindService(mMyServiceConnection); - isBound = false; - } - super.onDestroy(); - } - - // 运行服务内容 - // - void assistantService() { - LogUtils.d(TAG, "assistantService()"); - mMainServiceBean = MainServiceBean.loadBean(this, MainServiceBean.class); - LogUtils.d(TAG, String.format("mMainServiceBean.isEnable() %s", mMainServiceBean.isEnable())); - if (mMainServiceBean.isEnable()) { - LogUtils.d(TAG, String.format("mIsThreadAlive %s", isThreadAlive())); - if (isThreadAlive() == false) { - // 设置运行状态 - setIsThreadAlive(true); - // 唤醒和绑定主进程 - wakeupAndBindMain(); - } - } - } - - // 唤醒和绑定主进程 - // - void wakeupAndBindMain() { - LogUtils.d(TAG, "wakeupAndBindMain()"); - // 绑定服务的Intent - Intent intent = new Intent(this, MainService.class); - startService(new Intent(this, MainService.class)); - bindService(intent, mMyServiceConnection, Context.BIND_IMPORTANT); - -// startService(new Intent(this, MainService.class)); -// bindService(new Intent(AssistantService.this, MainService.class), mMyServiceConnection, Context.BIND_IMPORTANT); - } - - // 主进程与守护进程连接时需要用到此类 - // - class MyServiceConnection implements ServiceConnection { - @Override - public void onServiceConnected(ComponentName name, IBinder service) { - LogUtils.d(TAG, "onServiceConnected(...)"); - MainService.MyBinder binder = (MainService.MyBinder) service; - mMainService = binder.getService(); - isBound = true; - } - - @Override - public void onServiceDisconnected(ComponentName name) { - LogUtils.d(TAG, "onServiceDisconnected(...)"); - mMainServiceBean = MainServiceBean.loadBean(AssistantService.this, MainServiceBean.class); - if (mMainServiceBean.isEnable()) { - wakeupAndBindMain(); - } - isBound = false; - mMainService = null; - } - } - - // 用于返回服务实例的Binder - public class MyBinder extends Binder { - AssistantService getService() { - LogUtils.d(TAG, "AssistantService MyBinder getService()"); - return AssistantService.this; - } - } -} 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 deleted file mode 100644 index f71bdbb..0000000 --- a/appbase/src/main/java/cc/winboll/studio/appbase/services/MainService.java +++ /dev/null @@ -1,317 +0,0 @@ -package cc.winboll.studio.appbase.services; - -/** - * @Author ZhanGSKen - * @Date 2025/02/13 06:56:41 - * @Describe 拨号主服务 - * 参考: - * 进程保活-双进程守护的正确姿势 - * https://blog.csdn.net/sinat_35159441/article/details/75267380 - * Android Service之onStartCommand方法研究 - * https://blog.csdn.net/cyp331203/article/details/38920491 - */ -import android.app.Service; -import android.content.ComponentName; -import android.content.Context; -import android.content.Intent; -import android.content.ServiceConnection; -import android.os.Binder; -import android.os.IBinder; -import cc.winboll.studio.appbase.MyTileService; -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; - -public class MainService extends Service { - - public static final String TAG = "MainService"; - - public static final int MSG_UPDATE_STATUS = 0; - - static MainService _mControlCenterService; - - volatile boolean isServiceRunning; - - MainServiceBean mMainServiceBean; - MainServiceThread mMainServiceThread; - MainServiceHandler mMainServiceHandler; - MyServiceConnection mMyServiceConnection; - AssistantService mAssistantService; - boolean isBound = false; - MainReceiver mMainReceiver; - ArrayList mAPPModelConnectionList; - - @Override - public IBinder onBind(Intent intent) { - return new MyBinder(); - } - - public MainServiceThread getRemindThread() { - return mMainServiceThread; - } - - @Override - public void onCreate() { - super.onCreate(); - LogUtils.d(TAG, "onCreate()"); - mAPPModelConnectionList = new ArrayList(); - - _mControlCenterService = MainService.this; - isServiceRunning = false; - mMainServiceBean = MainServiceBean.loadBean(this, MainServiceBean.class); - - if (mMyServiceConnection == null) { - mMyServiceConnection = new MyServiceConnection(); - } - mMainServiceHandler = new MainServiceHandler(this); - - // 运行服务内容 - mainService(); - } - - @Override - public int onStartCommand(Intent intent, int flags, int startId) { - LogUtils.d(TAG, "onStartCommand(...)"); - // 运行服务内容 - mainService(); - return (mMainServiceBean.isEnable()) ? START_STICKY : super.onStartCommand(intent, flags, startId); - } - - // 运行服务内容 - // - void mainService() { - LogUtils.d(TAG, "mainService()"); - mMainServiceBean = MainServiceBean.loadBean(this, MainServiceBean.class); - if (mMainServiceBean.isEnable() && isServiceRunning == false) { - LogUtils.d(TAG, "mainService() start running"); - isServiceRunning = true; - // 唤醒守护进程 - wakeupAndBindAssistant(); - - if (mMainReceiver == null) { - // 注册广播接收器 - mMainReceiver = new MainReceiver(this); - mMainReceiver.registerAction(this); - } - - // 启动小部件 - Intent intentTimeWidget = new Intent(this, APPNewsWidget.class); - intentTimeWidget.setAction(APPNewsWidget.ACTION_RELOAD_REPORT); - this.sendBroadcast(intentTimeWidget); - - startMainServiceThread(); - - MyTileService.updateServiceIconStatus(this); - - LogUtils.i(TAG, "Main Service Is Start."); - } - } - - // 唤醒和绑定守护进程 - // - void wakeupAndBindAssistant() { - LogUtils.d(TAG, "wakeupAndBindAssistant()"); - - Intent intent = new Intent(this, AssistantService.class); - startService(intent); - // 绑定服务的Intent - bindService(intent, mMyServiceConnection, Context.BIND_IMPORTANT); - } - - // 开启提醒铃声线程 - // - public void startMainServiceThread() { - LogUtils.d(TAG, "startMainServiceThread"); - if (mMainServiceThread == null) { - mMainServiceThread = new MainServiceThread(this, mMainServiceHandler); - LogUtils.d(TAG, "new MainServiceThread"); - } else { - if (mMainServiceThread.isExist() == true) { - mMainServiceThread = new MainServiceThread(this, mMainServiceHandler); - LogUtils.d(TAG, "renew MainServiceThread"); - } else { - // 提醒进程正在进行中就更新状态后退出 - LogUtils.d(TAG, "A mMainServiceThread running."); - return; - } - } - mMainServiceThread.start(); - } - - public void stopRemindThread() { - if (mMainServiceThread != null) { - mMainServiceThread.setIsExist(true); - mMainServiceThread = null; - } - } - - @Override - public void onDestroy() { - //LogUtils.d(TAG, "onDestroy"); - mMainServiceBean = MainServiceBean.loadBean(this, MainServiceBean.class); - if (mMainServiceBean.isEnable() == false) { - // 设置运行状态 - isServiceRunning = false;// 解除绑定 - if (isBound) { - unbindService(mMyServiceConnection); - isBound = false; - } - // 停止守护进程 - Intent intent = new Intent(this, AssistantService.class); - stopService(intent); - // 停止Receiver - if (mMainReceiver != null) { - unregisterReceiver(mMainReceiver); - mMainReceiver = null; - } - // 停止前台通知栏 - stopForeground(true); - // 停止消息提醒进程 - stopRemindThread(); - - MyTileService.updateServiceIconStatus(this); - - super.onDestroy(); - //LogUtils.d(TAG, "onDestroy done"); - } - } - - public void bindWinBoLLModelConnection(WinBoLLModel bean) { - LogUtils.d(TAG, "bindAPPModelConnection(...)"); - // 清理旧的绑定链接 - for (int i = mAPPModelConnectionList.size() - 1; i > -1; i--) { - APPConnection item = mAPPModelConnectionList.get(i); - if (item.isBindToAPP(bean)) { - LogUtils.d(TAG, "Bind Servive exist."); - unbindService(item); - mAPPModelConnectionList.remove(i); - } - } - - // 绑定服务 - APPConnection appConnection = new APPConnection(); - Intent intentService = new Intent(); - intentService.setComponent(new ComponentName(bean.getAppPackageName(), bean.getAppMainServiveName())); - bindService(intentService, appConnection, Context.BIND_IMPORTANT); - mAPPModelConnectionList.add(appConnection); - - Intent intentWidget = new Intent(this, APPNewsWidget.class); - intentWidget.setAction(APPNewsWidget.ACTION_WAKEUP_SERVICE); - WinBoLLModel appSOSBean = new WinBoLLModel(bean.getAppPackageName(), bean.getAppMainServiveName()); - intentWidget.putExtra("APPSOSBean", appSOSBean.toString()); - sendBroadcast(intentWidget); - } - - public class APPConnection implements ServiceConnection { - - ComponentName mComponentName; - - boolean isBindToAPP(WinBoLLModel bean) { - return mComponentName != null - && mComponentName.getClassName().equals(bean.getAppMainServiveName()) - && mComponentName.getPackageName().equals(bean.getAppPackageName()); - } - - @Override - public void onServiceConnected(ComponentName name, IBinder service) { - LogUtils.d(TAG, "onServiceConnected(...)"); - mComponentName = name; - LogUtils.d(TAG, String.format("onServiceConnected : \ngetClassName %s\ngetPackageName %s", name.getClassName(), name.getPackageName())); - } - - @Override - public void onServiceDisconnected(ComponentName name) { - LogUtils.d(TAG, "onServiceDisconnected(...)"); - LogUtils.d(TAG, String.format("onServiceDisconnected : \ngetClassName %s\ngetPackageName %s", name.getClassName(), name.getPackageName())); - - // 尝试无参数启动一下服务 - String appPackage = mComponentName.getPackageName(); - LogUtils.d(TAG, String.format("appPackage %s", appPackage)); - String appMainServiceClassName = mComponentName.getClassName(); - LogUtils.d(TAG, String.format("appMainServiceClassName %s", appMainServiceClassName)); - - Intent intentService = new Intent(); - intentService.setComponent(new ComponentName(appPackage, appMainServiceClassName)); - startService(intentService); - } - - } - - // 主进程与守护进程连接时需要用到此类 - // - private class MyServiceConnection implements ServiceConnection { - @Override - public void onServiceConnected(ComponentName name, IBinder service) { - LogUtils.d(TAG, "onServiceConnected(...)"); - AssistantService.MyBinder binder = (AssistantService.MyBinder) service; - mAssistantService = binder.getService(); - isBound = true; - } - - @Override - public void onServiceDisconnected(ComponentName name) { - LogUtils.d(TAG, "onServiceDisconnected(...)"); - - if (mMainServiceBean.isEnable()) { - // 唤醒守护进程 - wakeupAndBindAssistant(); - } - isBound = false; - mAssistantService = null; - } - - } - - - // 用于返回服务实例的Binder - public class MyBinder extends Binder { - MainService getService() { - LogUtils.d(TAG, "MainService MyBinder getService()"); - return MainService.this; - } - } - -// // -// // 启动服务 -// // -// public static void startControlCenterService(Context context) { -// Intent intent = new Intent(context, MainService.class); -// context.startForegroundService(intent); -// } -// -// // -// // 停止服务 -// // -// public static void stopControlCenterService(Context context) { -// Intent intent = new Intent(context, MainService.class); -// context.stopService(intent); -// } - - public void appenMessage(String message) { - LogUtils.d(TAG, String.format("Message : %s", message)); - } - - public static void stopMainService(Context context) { - LogUtils.d(TAG, "stopMainService"); - MainServiceBean bean = new MainServiceBean(); - bean.setIsEnable(false); - MainServiceBean.saveBean(context, bean); - context.stopService(new Intent(context, MainService.class)); - } - - public static void startMainService(Context context) { - LogUtils.d(TAG, "startMainService"); - MainServiceBean bean = new MainServiceBean(); - bean.setIsEnable(true); - MainServiceBean.saveBean(context, bean); - context.startService(new Intent(context, MainService.class)); - } -} - 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 deleted file mode 100644 index 7136d3c..0000000 --- a/appbase/src/main/java/cc/winboll/studio/appbase/services/TestDemoBindService.java +++ /dev/null @@ -1,179 +0,0 @@ -package cc.winboll.studio.appbase.services; - -/** - * @Author ZhanGSKen - * @Date 2025/03/07 12:45:49 - * @Describe 启动时申请绑定到APPBase主服务的服务示例 - */ -import android.app.Service; -import android.content.Context; -import android.content.Intent; -import android.os.Binder; -import android.os.IBinder; -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 { - - public static final String TAG = "TestDemoBindService"; - - public static final String ACTION_ENABLE = TestDemoBindService.class.getName() + ".ACTION_ENABLE"; - public static final String ACTION_DISABLE = TestDemoBindService.class.getName() + ".ACTION_DISABLE"; - - volatile static TestThread _TestThread; - - volatile static boolean _IsRunning; - - public synchronized static void setIsRunning(boolean isRunning) { - _IsRunning = isRunning; - } - - public static boolean isRunning() { - return _IsRunning; - } - - @Override - public IBinder onBind(Intent intent) { - return new MyBinder(); - } - - public class MyBinder extends Binder { - public TestDemoBindService getService() { - return TestDemoBindService.this; - } - } - - @Override - public void onCreate() { - super.onCreate(); - LogUtils.d(TAG, "onCreate()"); - - run(); - } - - @Override - public int onStartCommand(Intent intent, int flags, int startId) { - LogUtils.d(TAG, "onStartCommand(...)"); - TestDemoBindServiceBean bean = TestDemoBindServiceBean.loadBean(this, TestDemoBindServiceBean.class); - if (bean == null) { - bean = new TestDemoBindServiceBean(); - } - - if (intent.getAction() != null) { - if (intent.getAction().equals(ACTION_ENABLE)) { - bean.setIsEnable(true); - LogUtils.d(TAG, "setIsEnable(true);"); - TestDemoBindServiceBean.saveBean(this, bean); - } else if (intent.getAction().equals(ACTION_DISABLE)) { - bean.setIsEnable(false); - LogUtils.d(TAG, "setIsEnable(false);"); - TestDemoBindServiceBean.saveBean(this, bean); - } - } - - run(); - - return (bean.isEnable()) ? START_STICKY : super.onStartCommand(intent, flags, startId); - //return super.onStartCommand(intent, flags, startId); - } - - void run() { - LogUtils.d(TAG, "run()"); - TestDemoBindServiceBean bean = TestDemoBindServiceBean.loadBean(this, TestDemoBindServiceBean.class); - if (bean == null) { - bean = new TestDemoBindServiceBean(); - TestDemoBindServiceBean.saveBean(this, bean); - } - if (bean.isEnable()) { - LogUtils.d(TAG, "run() bean.isEnable()"); - TestThread.getInstance(this).start(); - LogUtils.d(TAG, "_TestThread.start()"); - } - } - - - @Override - public void onDestroy() { - super.onDestroy(); - LogUtils.d(TAG, "onDestroy()"); - TestDemoBindServiceBean bean = TestDemoBindServiceBean.loadBean(this, TestDemoBindServiceBean.class); - if (bean == null) { - bean = new TestDemoBindServiceBean(); - } - - TestThread.getInstance(this).setIsExit(true); - - // 预防 APPBase 应用重启绑定失效。 - // 所以退出时检查本服务是否配置启用,如果启用就发送一个 SOS 信号。 - // 这样 APPBase 就会用组件方式启动本服务。 - if (bean.isEnable()) { - if (App.isDebuging()) { - SOS.sosToAppBaseBeta(this, TestDemoBindService.class.getName()); - } else { - SOS.sosToAppBase(this, TestDemoBindService.class.getName()); - } - } - - _IsRunning = false; - } - - static class TestThread extends Thread { - - volatile static TestThread _TestThread; - Context mContext; - volatile boolean isStarted = false; - volatile boolean isExit = false; - - TestThread(Context context) { - super(); - mContext = context; - } - - public static synchronized TestThread getInstance(Context context) { - if (_TestThread != null) { - _TestThread.setIsExit(true); - } - _TestThread = new TestThread(context); - - return _TestThread; - } - - public synchronized void setIsExit(boolean isExit) { - this.isExit = isExit; - } - - public boolean isExit() { - return isExit; - } - - @Override - public void run() { - if (isStarted == false) { - isStarted = true; - super.run(); - LogUtils.d(TAG, "run() start"); - if (App.isDebuging()) { - WinBoLL.bindToAPPBaseBeta(mContext, TestDemoBindService.class.getName()); - } else { - WinBoLL.bindToAPPBase(mContext, TestDemoBindService.class.getName()); - } - - while (!isExit()) { - LogUtils.d(TAG, "run()"); - - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - LogUtils.d(TAG, e, Thread.currentThread().getStackTrace()); - } - } - - LogUtils.d(TAG, "run() exit"); - } - } - } -} 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 deleted file mode 100644 index ee7de32..0000000 --- a/appbase/src/main/java/cc/winboll/studio/appbase/services/TestDemoService.java +++ /dev/null @@ -1,155 +0,0 @@ -package cc.winboll.studio.appbase.services; - -/** - * @Author ZhanGSKen - * @Date 2025/03/07 12:39:24 - * @Describe 普通服务示例 - */ -import android.app.Service; -import android.content.Context; -import android.content.Intent; -import android.os.Binder; -import android.os.IBinder; -import cc.winboll.studio.appbase.models.TestDemoServiceBean; -import cc.winboll.studio.libappbase.LogUtils; - -public class TestDemoService extends Service { - - public static final String TAG = "TestDemoService"; - - public static final String ACTION_ENABLE = TestDemoService.class.getName() + ".ACTION_ENABLE"; - public static final String ACTION_DISABLE = TestDemoService.class.getName() + ".ACTION_DISABLE"; - - volatile static TestThread _TestThread; - - volatile static boolean _IsRunning; - - public synchronized static void setIsRunning(boolean isRunning) { - _IsRunning = isRunning; - } - - public static boolean isRunning() { - return _IsRunning; - } - - @Override - public IBinder onBind(Intent intent) { - return new MyBinder(); - } - - public class MyBinder extends Binder { - public TestDemoService getService() { - return TestDemoService.this; - } - } - - @Override - public void onCreate() { - super.onCreate(); - LogUtils.d(TAG, "onCreate()"); - - - run(); - } - - @Override - public int onStartCommand(Intent intent, int flags, int startId) { - LogUtils.d(TAG, "onStartCommand(...)"); - TestDemoServiceBean bean = TestDemoServiceBean.loadBean(this, TestDemoServiceBean.class); - if (bean == null) { - bean = new TestDemoServiceBean(); - } - - if (intent.getAction() != null) { - if (intent.getAction().equals(ACTION_ENABLE)) { - bean.setIsEnable(true); - LogUtils.d(TAG, "setIsEnable(true);"); - TestDemoServiceBean.saveBean(this, bean); - } else if (intent.getAction().equals(ACTION_DISABLE)) { - bean.setIsEnable(false); - LogUtils.d(TAG, "setIsEnable(false);"); - TestDemoServiceBean.saveBean(this, bean); - } - } - - run(); - - return (bean.isEnable()) ? START_STICKY : super.onStartCommand(intent, flags, startId); - //return super.onStartCommand(intent, flags, startId); - } - - void run() { - LogUtils.d(TAG, "run()"); - TestDemoServiceBean bean = TestDemoServiceBean.loadBean(this, TestDemoServiceBean.class); - if (bean == null) { - bean = new TestDemoServiceBean(); - TestDemoServiceBean.saveBean(this, bean); - } - if (bean.isEnable()) { - LogUtils.d(TAG, "run() bean.isEnable()"); - TestThread.getInstance(this).start(); - LogUtils.d(TAG, "_TestThread.start()"); - } - } - - - @Override - public void onDestroy() { - super.onDestroy(); - LogUtils.d(TAG, "onDestroy()"); - TestThread.getInstance(this).setIsExit(true); - - _IsRunning = false; - } - - static class TestThread extends Thread { - - volatile static TestThread _TestThread; - Context mContext; - volatile boolean isStarted = false; - volatile boolean isExit = false; - - TestThread(Context context) { - super(); - mContext = context; - } - - public static synchronized TestThread getInstance(Context context) { - if (_TestThread != null) { - _TestThread.setIsExit(true); - } - _TestThread = new TestThread(context); - - return _TestThread; - } - - public synchronized void setIsExit(boolean isExit) { - this.isExit = isExit; - } - - public boolean isExit() { - return isExit; - } - - @Override - public void run() { - if (isStarted == false) { - isStarted = true; - super.run(); - LogUtils.d(TAG, "run() start"); - - while (!isExit()) { - LogUtils.d(TAG, "run()"); - - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - LogUtils.d(TAG, e, Thread.currentThread().getStackTrace()); - } - } - - LogUtils.d(TAG, "run() exit"); - } - } - } -} diff --git a/appbase/src/main/java/cc/winboll/studio/appbase/threads/MainServiceThread.java b/appbase/src/main/java/cc/winboll/studio/appbase/threads/MainServiceThread.java deleted file mode 100644 index c922e84..0000000 --- a/appbase/src/main/java/cc/winboll/studio/appbase/threads/MainServiceThread.java +++ /dev/null @@ -1,54 +0,0 @@ -package cc.winboll.studio.appbase.threads; - -/** - * @Author ZhanGSKen - * @Date 2025/02/14 03:46:44 - */ -import android.content.Context; -import cc.winboll.studio.appbase.handlers.MainServiceHandler; -import cc.winboll.studio.libappbase.LogUtils; -import java.lang.ref.WeakReference; - -public class MainServiceThread extends Thread { - - public static final String TAG = "MainServiceThread"; - - Context mContext; - - // 控制线程是否退出的标志 - volatile boolean isExist = false; - - // 服务Handler, 用于线程发送消息使用 - WeakReference mwrMainServiceHandler; - - public void setIsExist(boolean isExist) { - this.isExist = isExist; - } - - public boolean isExist() { - return isExist; - } - - public MainServiceThread(Context context, MainServiceHandler handler) { - mContext = context; - mwrMainServiceHandler = new WeakReference(handler); - } - - @Override - public void run() { - LogUtils.d(TAG, "run()"); - - while (!isExist()) { - //ToastUtils.show("run()"); - //LogUtils.d(TAG, "run()"); - - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - LogUtils.d(TAG, e, Thread.currentThread().getStackTrace()); - } - } - LogUtils.d(TAG, "run() exit."); - } - -} 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 deleted file mode 100644 index 71a5caa..0000000 --- a/appbase/src/main/java/cc/winboll/studio/appbase/widgets/APPNewsWidget.java +++ /dev/null @@ -1,187 +0,0 @@ -package cc.winboll.studio.appbase.widgets; -/** - * @Author ZhanGSKen - * @Date 2025/02/15 14:41:25 - * @Describe TimeWidget - */ -import android.app.PendingIntent; -import android.appwidget.AppWidgetManager; -import android.appwidget.AppWidgetProvider; -import android.content.ComponentName; -import android.content.Context; -import android.content.Intent; -import android.widget.RemoteViews; -import cc.winboll.studio.appbase.R; -import cc.winboll.studio.appbase.receivers.APPNewsWidgetClickListener; -import cc.winboll.studio.libappbase.AppUtils; -import cc.winboll.studio.libappbase.LogUtils; -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 { - - public static final String TAG = "APPNewsWidget"; - - public static final String ACTION_WAKEUP_SERVICE = APPNewsWidget.class.getName() + ".ACTION_WAKEUP_SERVICE"; - public static final String ACTION_RELOAD_REPORT = APPNewsWidget.class.getName() + ".ACTION_RELOAD_REPORT"; - - - volatile static ArrayList _WinBoLLNewsBeanList; - final static int _MAX_PAGES = 10; - final static int _OnePageLinesCount = 5; - volatile static int _CurrentPageIndex = 0; - - @Override - public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { - initWinBoLLNewsBeanList(context); - for (int appWidgetId : appWidgetIds) { - updateAppWidget(context, appWidgetManager, appWidgetId); - } - } - - @Override - public void onReceive(Context context, Intent intent) { - super.onReceive(context, intent); - initWinBoLLNewsBeanList(context); - if (intent.getAction().equals(ACTION_RELOAD_REPORT)) { - LogUtils.d(TAG, "ACTION_RELOAD_REPORT"); - AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); - int[] appWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(context, APPNewsWidget.class)); - for (int appWidgetId : appWidgetIds) { - updateAppWidget(context, appWidgetManager, appWidgetId); - } - }else if (intent.getAction().equals(ACTION_WAKEUP_SERVICE)) { - LogUtils.d(TAG, "ACTION_WAKEUP_SERVICE"); - String szWinBoLLModel = intent.getStringExtra(WinBoLL.EXTRA_WINBOLLMODEL); - LogUtils.d(TAG, String.format("szWinBoLLModel %s", szWinBoLLModel)); - if (szWinBoLLModel != null && !szWinBoLLModel.equals("")) { - try { - 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)); - - - String appName = AppUtils.getAppNameByPackageName(context, szAppPackageName); - LogUtils.d(TAG, String.format("appName %s", appName)); - WinBoLLNewsBean winBollNewsBean = new WinBoLLNewsBean(appName); - SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); - String currentTime = sdf.format(new Date()); - StringBuilder sbLine = new StringBuilder(); - sbLine.append("["); - sbLine.append(currentTime); - sbLine.append("] Wake up "); - sbLine.append(appName); - winBollNewsBean.setMessage(sbLine.toString()); - - addWinBoLLNewsBean(context, winBollNewsBean); - - AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); - int[] appWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(context, APPNewsWidget.class)); - for (int appWidgetId : appWidgetIds) { - updateAppWidget(context, appWidgetManager, appWidgetId); - } - } - } catch (IOException e) { - LogUtils.d(TAG, e, Thread.currentThread().getStackTrace()); - } - } - } - } - - // - // 加入新报告信息 - // - public synchronized static void addWinBoLLNewsBean(Context context, WinBoLLNewsBean bean) { - initWinBoLLNewsBeanList(context); - _WinBoLLNewsBeanList.add(0, bean); - // 控制记录总数 - while (_WinBoLLNewsBeanList.size() > _MAX_PAGES * _OnePageLinesCount) { - _WinBoLLNewsBeanList.remove(_WinBoLLNewsBeanList.size() - 1); - } - WinBoLLNewsBean.saveBeanList(context, _WinBoLLNewsBeanList, WinBoLLNewsBean.class); - } - - synchronized static void initWinBoLLNewsBeanList(Context context) { - if (_WinBoLLNewsBeanList == null) { - _WinBoLLNewsBeanList = new ArrayList(); - WinBoLLNewsBean.loadBeanList(context, _WinBoLLNewsBeanList, WinBoLLNewsBean.class); - } - if (_WinBoLLNewsBeanList == null) { - _WinBoLLNewsBeanList = new ArrayList(); - WinBoLLNewsBean.saveBeanList(context, _WinBoLLNewsBeanList, WinBoLLNewsBean.class); - } - } - - private void updateAppWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId) { - LogUtils.d(TAG, "updateAppWidget(...)"); - - RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_news); - //设置按钮点击事件 - Intent intentPre = new Intent(context, APPNewsWidgetClickListener.class); - intentPre.setAction(APPNewsWidgetClickListener.ACTION_PRE); - PendingIntent pendingIntentPre = PendingIntent.getBroadcast(context, 0, intentPre, PendingIntent.FLAG_UPDATE_CURRENT); - views.setOnClickPendingIntent(R.id.widget_button_pre, pendingIntentPre); - Intent intentNext = new Intent(context, APPNewsWidgetClickListener.class); - intentNext.setAction(APPNewsWidgetClickListener.ACTION_NEXT); - PendingIntent pendingIntentNext = PendingIntent.getBroadcast(context, 0, intentNext, PendingIntent.FLAG_UPDATE_CURRENT); - views.setOnClickPendingIntent(R.id.widget_button_next, pendingIntentNext); - - views.setTextViewText(R.id.tv_msg, getPageInfo()); - views.setTextViewText(R.id.tv_news, getMessage()); - appWidgetManager.updateAppWidget(appWidgetId, views); - } - - public static String getMessage() { - ArrayList msgTemp = new ArrayList(); - if (_WinBoLLNewsBeanList != null) { - int start = _OnePageLinesCount * _CurrentPageIndex; - start = _WinBoLLNewsBeanList.size() > start ? start : _WinBoLLNewsBeanList.size() - 1; - for (int i = start, j = 0; i < _WinBoLLNewsBeanList.size() && j < _OnePageLinesCount && start > -1; i++, j++) { - msgTemp.add(_WinBoLLNewsBeanList.get(i).getMessage()); - } - String message = String.join("\n", msgTemp); - return message; - } - return ""; - } - - public static void prePage(Context context) { - if (_WinBoLLNewsBeanList != null) { - if (_CurrentPageIndex > 0) { - _CurrentPageIndex = _CurrentPageIndex - 1; - } - Intent intentWidget = new Intent(context, APPNewsWidget.class); - intentWidget.setAction(APPNewsWidget.ACTION_RELOAD_REPORT); - context.sendBroadcast(intentWidget); - } - } - - public static void nextPage(Context context) { - if (_WinBoLLNewsBeanList != null) { - if ((_CurrentPageIndex + 1) * _OnePageLinesCount < _WinBoLLNewsBeanList.size()) { - _CurrentPageIndex = _CurrentPageIndex + 1; - } - Intent intentWidget = new Intent(context, APPNewsWidget.class); - intentWidget.setAction(APPNewsWidget.ACTION_RELOAD_REPORT); - context.sendBroadcast(intentWidget); - } - } - - String getPageInfo() { - if (_WinBoLLNewsBeanList == null) { - return "0/0"; - } - int leftCount = _WinBoLLNewsBeanList.size() % _OnePageLinesCount; - int currentPageCount = _WinBoLLNewsBeanList.size() / _OnePageLinesCount + (leftCount == 0 ?0: 1); - return String.format("%d/%d", _CurrentPageIndex + 1, currentPageCount); - } -} diff --git a/appbase/src/main/res/drawable/btn_light_blue.xml b/appbase/src/main/res/drawable/btn_light_blue.xml new file mode 100644 index 0000000..58415fd --- /dev/null +++ b/appbase/src/main/res/drawable/btn_light_blue.xml @@ -0,0 +1,7 @@ + + + + + + diff --git a/appbase/src/main/res/drawable/ic_cloud.xml b/appbase/src/main/res/drawable/ic_cloud.xml deleted file mode 100644 index 62b99af..0000000 --- a/appbase/src/main/res/drawable/ic_cloud.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - \ No newline at end of file diff --git a/appbase/src/main/res/drawable/ic_cloud_outline.xml b/appbase/src/main/res/drawable/ic_cloud_outline.xml deleted file mode 100644 index fb06b79..0000000 --- a/appbase/src/main/res/drawable/ic_cloud_outline.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - \ No newline at end of file diff --git a/appbase/src/main/res/layout/activity_main.xml b/appbase/src/main/res/layout/activity_main.xml index 135b845..9552e3a 100644 --- a/appbase/src/main/res/layout/activity_main.xml +++ b/appbase/src/main/res/layout/activity_main.xml @@ -3,213 +3,45 @@ xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" - android:layout_height="match_parent"> + android:layout_height="match_parent" + android:padding="16dp"> - + android:layout_weight="1" + android:orientation="vertical" + android:gravity="center_vertical" + android:spacing="12dp"> - + android:text="应用崩溃测试" + android:textSize="16sp" + android:textColor="@android:color/white" + android:background="#81C7F5" + android:paddingVertical="12dp" + android:layout_marginHorizontal="24dp" + android:onClick="onCrashTest"/> - +