diff --git a/appbase/build.gradle b/appbase/build.gradle
index 4dd0737..3043907 100644
--- a/appbase/build.gradle
+++ b/appbase/build.gradle
@@ -29,7 +29,7 @@ android {
// versionName 更新后需要手动设置
// .winboll/winbollBuildProps.properties 文件的 stageCount=0
// Gradle编译环境下合起来的 versionName 就是 "${versionName}.0"
- versionName "2.0"
+ versionName "2.1"
if(true) {
versionName = genVersionName("${versionName}")
}
diff --git a/appbase/build.properties b/appbase/build.properties
index 631b0a2..cb0c2af 100644
--- a/appbase/build.properties
+++ b/appbase/build.properties
@@ -1,8 +1,8 @@
#Created by .winboll/winboll_app_build.gradle
-#Fri Mar 07 04:36:05 GMT 2025
-stageCount=3
+#Fri Mar 07 06:49:58 GMT 2025
+stageCount=0
libraryProject=libappbase
-baseVersion=2.0
-publishVersion=2.0.2
-buildCount=7
-baseBetaVersion=2.0.3
+baseVersion=2.1
+publishVersion=2.1.0
+buildCount=1
+baseBetaVersion=2.1.1
diff --git a/appbase/src/main/AndroidManifest.xml b/appbase/src/main/AndroidManifest.xml
index 1ada098..4fdc630 100644
--- a/appbase/src/main/AndroidManifest.xml
+++ b/appbase/src/main/AndroidManifest.xml
@@ -54,19 +54,25 @@
+
+
-
-
+
+
+
+
+
+
-
+
-
+
-
+
@@ -91,6 +97,11 @@
android:name="android.max_aspect"
android:value="4.0"/>
+
+
+
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 58976a1..32d7431 100644
--- a/appbase/src/main/java/cc/winboll/studio/appbase/MainActivity.java
+++ b/appbase/src/main/java/cc/winboll/studio/appbase/MainActivity.java
@@ -1,6 +1,5 @@
package cc.winboll.studio.appbase;
-import android.content.ComponentName;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
@@ -9,13 +8,16 @@ import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import cc.winboll.studio.appbase.R;
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.GlobalApplication;
import cc.winboll.studio.libappbase.LogUtils;
import cc.winboll.studio.libappbase.LogView;
-import cc.winboll.studio.libappbase.services.TestService;
import cc.winboll.studio.libappbase.widgets.StatusWidget;
import com.hjq.toast.ToastUtils;
+import android.content.ComponentName;
import cc.winboll.studio.libappbase.sos.SOS;
+import cc.winboll.studio.libappbase.sos.SOSObject;
public class MainActivity extends AppCompatActivity {
@@ -66,49 +68,74 @@ public class MainActivity extends AppCompatActivity {
MainService.stopMainService(this);
}
- public void onTestStopWithoutSettingEnable(View view) {
-// LogUtils.d(TAG, "onTestStopWithoutSettingEnable");
-// stopService(new Intent(this, SimpleOperateSignalCenterService.class));
+ public void onTestStopMainServiceWithoutSettingEnable(View view) {
+ LogUtils.d(TAG, "onTestStopMainServiceWithoutSettingEnable");
+ stopService(new Intent(this, MainService.class));
}
- public void onTestStartWithString(View view) {
- LogUtils.d(TAG, "onTestStartWithString");
+ public void onTestUseComponentStartService(View view) {
+ LogUtils.d(TAG, "onTestUseComponentStartService");
// 目标服务的包名和类名
-// String packageName = this.getPackageName();
-// String serviceClassName = SimpleOperateSignalCenterService.class.getName();
-//
-// // 构建Intent
-// Intent intentService = new Intent();
-// intentService.setComponent(new ComponentName(packageName, serviceClassName));
-//
-// startService(intentService);
+ String packageName = this.getPackageName();
+ String serviceClassName = TestDemoService.class.getName();
+
+ // 构建Intent
+ Intent intentService = new Intent();
+ intentService.setComponent(new ComponentName(packageName, serviceClassName));
+
+ startService(intentService);
}
- public void onSOS(View view) {
-// Intent intent = new Intent(this, TestService.class);
-// stopService(intent);
-// SOS.se(this, new APPNewsBean(getPackageName(), TestService.class.getName()));
+ public void onTestSOS(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 onStartTestService(View view) {
-// Intent intent = new Intent(this, TestService.class);
-// intent.setAction(WinBoll.ACTION_SERVICE_ENABLE);
-// startService(intent);
+ public void onSartTestDemoService(View view) {
+ Intent intent = new Intent(this, TestDemoService.class);
+ intent.setAction(TestDemoService.ACTION_ENABLE);
+ startService(intent);
}
- public void onStopTestService(View view) {
-// Intent intent = new Intent(this, TestService.class);
-// intent.setAction(WinBoll.ACTION_SERVICE_DISABLE);
-// startService(intent);
-//
-// Intent intentStop = new Intent(this, TestService.class);
-// stopService(intentStop);
+ 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 onStopTestServiceNoSettings(View view) {
- Intent intent = new Intent(this, TestService.class);
+ 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);
}
}
diff --git a/appbase/src/main/java/cc/winboll/studio/appbase/beans/MainServiceBean.java b/appbase/src/main/java/cc/winboll/studio/appbase/beans/MainServiceBean.java
index 81a3a7a..580b6e5 100644
--- a/appbase/src/main/java/cc/winboll/studio/appbase/beans/MainServiceBean.java
+++ b/appbase/src/main/java/cc/winboll/studio/appbase/beans/MainServiceBean.java
@@ -35,8 +35,7 @@ public class MainServiceBean extends BaseBean {
@Override
public void writeThisToJsonWriter(JsonWriter jsonWriter) throws IOException {
super.writeThisToJsonWriter(jsonWriter);
- MainServiceBean bean = this;
- jsonWriter.name("isEnable").value(bean.isEnable());
+ jsonWriter.name("isEnable").value(isEnable());
}
diff --git a/libappbase/src/main/java/cc/winboll/studio/libappbase/bean/TestServiceBean.java b/appbase/src/main/java/cc/winboll/studio/appbase/beans/TestDemoBindServiceBean.java
similarity index 87%
rename from libappbase/src/main/java/cc/winboll/studio/libappbase/bean/TestServiceBean.java
rename to appbase/src/main/java/cc/winboll/studio/appbase/beans/TestDemoBindServiceBean.java
index 30d8cfe..59649a6 100644
--- a/libappbase/src/main/java/cc/winboll/studio/libappbase/bean/TestServiceBean.java
+++ b/appbase/src/main/java/cc/winboll/studio/appbase/beans/TestDemoBindServiceBean.java
@@ -1,8 +1,8 @@
-package cc.winboll.studio.libappbase.bean;
+package cc.winboll.studio.appbase.beans;
/**
* @Author ZhanGSKen@AliYun.Com
- * @Date 2025/02/19 13:34:52
+ * @Date 2025/03/07 12:47:22
* @Describe TestServiceBean
*/
import android.util.JsonReader;
@@ -10,13 +10,13 @@ import android.util.JsonWriter;
import cc.winboll.studio.libappbase.BaseBean;
import java.io.IOException;
-public class TestServiceBean extends BaseBean {
+public class TestDemoBindServiceBean extends BaseBean {
public static final String TAG = "TestServiceBean";
boolean isEnable;
- public TestServiceBean() {
+ public TestDemoBindServiceBean() {
this.isEnable = false;
}
@@ -30,7 +30,7 @@ public class TestServiceBean extends BaseBean {
@Override
public String getName() {
- return TestServiceBean.class.getName();
+ return TestDemoBindServiceBean.class.getName();
}
@Override
diff --git a/appbase/src/main/java/cc/winboll/studio/appbase/beans/TestDemoServiceBean.java b/appbase/src/main/java/cc/winboll/studio/appbase/beans/TestDemoServiceBean.java
new file mode 100644
index 0000000..680d2e4
--- /dev/null
+++ b/appbase/src/main/java/cc/winboll/studio/appbase/beans/TestDemoServiceBean.java
@@ -0,0 +1,68 @@
+package cc.winboll.studio.appbase.beans;
+
+/**
+ * @Author ZhanGSKen@AliYun.Com
+ * @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/MainReceiver.java b/appbase/src/main/java/cc/winboll/studio/appbase/receivers/MainReceiver.java
index ad553dc..4b82474 100644
--- a/appbase/src/main/java/cc/winboll/studio/appbase/receivers/MainReceiver.java
+++ b/appbase/src/main/java/cc/winboll/studio/appbase/receivers/MainReceiver.java
@@ -47,31 +47,27 @@ public class MainReceiver extends BroadcastReceiver {
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 SOS = intent.getStringExtra("SOS");
- LogUtils.d(TAG, String.format("SOS %s", SOS));
- if (SOS != null && SOS.equals("Service")) {
- String szAPPSOSBean = intent.getStringExtra("APPSOSBean");
- LogUtils.d(TAG, String.format("szAPPSOSBean %s", szAPPSOSBean));
- if (szAPPSOSBean != null && !szAPPSOSBean.equals("")) {
- try {
- APPModel bean = APPModel.parseStringToBean(szAPPSOSBean, APPModel.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("szNewsClassName %s", szAppMainServiveName));
- mwrService.get().bindSOSConnection(bean);
- }
- } catch (IOException e) {
- LogUtils.d(TAG, e, Thread.currentThread().getStackTrace());
+ String szAPPModel = intent.getStringExtra(WinBoll.EXTRA_APPMODEL);
+ LogUtils.d(TAG, String.format("szAPPModel %s", szAPPModel));
+ if (szAPPModel != null && !szAPPModel.equals("")) {
+ try {
+ APPModel bean = APPModel.parseStringToBean(szAPPModel, APPModel.class);
+ if (bean != null) {
+ String szAppPackageName = bean.getAppPackageName();
+ LogUtils.d(TAG, String.format("szAppPackageName %s", szAppPackageName));
+ String szAppMainServiveName = bean.getAppMainServiveName();
+ LogUtils.d(TAG, String.format("szAppMainServiveName %s", szAppMainServiveName));
+ mwrService.get().bindAPPModelConnection(bean);
}
+ } 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("")) {
+ if (sos != null && !sos.equals("")) {
SOSObject bean = SOS.parseSOSObject(sos);
if (bean != null) {
String szObjectPackageName = bean.getObjectPackageName();
diff --git a/appbase/src/main/java/cc/winboll/studio/appbase/services/MainService.java b/appbase/src/main/java/cc/winboll/studio/appbase/services/MainService.java
index 0c296f0..41949ef 100644
--- a/appbase/src/main/java/cc/winboll/studio/appbase/services/MainService.java
+++ b/appbase/src/main/java/cc/winboll/studio/appbase/services/MainService.java
@@ -45,7 +45,7 @@ public class MainService extends Service {
AssistantService mAssistantService;
boolean isBound = false;
MainReceiver mMainReceiver;
- ArrayList mSOSConnectionList;
+ ArrayList mAPPModelConnectionList;
@Override
public IBinder onBind(Intent intent) {
@@ -60,7 +60,7 @@ public class MainService extends Service {
public void onCreate() {
super.onCreate();
LogUtils.d(TAG, "onCreate()");
- mSOSConnectionList = new ArrayList();
+ mAPPModelConnectionList = new ArrayList();
_mControlCenterService = MainService.this;
isServiceRunning = false;
@@ -117,21 +117,11 @@ public class MainService extends Service {
//
void wakeupAndBindAssistant() {
LogUtils.d(TAG, "wakeupAndBindAssistant()");
-// if (ServiceUtils.isServiceAlive(getApplicationContext(), AssistantService.class.getName()) == false) {
-// startService(new Intent(MainService.this, AssistantService.class));
-// //LogUtils.d(TAG, "call wakeupAndBindAssistant() : Binding... AssistantService");
-// bindService(new Intent(MainService.this, AssistantService.class), mMyServiceConnection, Context.BIND_IMPORTANT);
-// }
+
Intent intent = new Intent(this, AssistantService.class);
startService(intent);
// 绑定服务的Intent
- //Intent intent = new Intent(this, AssistantService.class);
bindService(intent, mMyServiceConnection, Context.BIND_IMPORTANT);
-
-// Intent intent = new Intent(this, AssistantService.class);
-// startService(intent);
-// LogUtils.d(TAG, "startService(intent)");
-// bindService(new Intent(this, AssistantService.class), mMyServiceConnection, Context.BIND_IMPORTANT);
}
// 开启提醒铃声线程
@@ -192,24 +182,24 @@ public class MainService extends Service {
}
}
- public void bindSOSConnection(APPModel bean) {
- LogUtils.d(TAG, "bindSOSConnection(...)");
+ public void bindAPPModelConnection(APPModel bean) {
+ LogUtils.d(TAG, "bindAPPModelConnection(...)");
// 清理旧的绑定链接
- for (int i = mSOSConnectionList.size() - 1; i > -1; i--) {
- SOSConnection item = mSOSConnectionList.get(i);
- if (item.isBindToAPPSOSBean(bean)) {
+ 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);
- mSOSConnectionList.remove(i);
+ mAPPModelConnectionList.remove(i);
}
}
// 绑定服务
- SOSConnection sosConnection = new SOSConnection();
+ APPConnection appConnection = new APPConnection();
Intent intentService = new Intent();
intentService.setComponent(new ComponentName(bean.getAppPackageName(), bean.getAppMainServiveName()));
- bindService(intentService, sosConnection, Context.BIND_IMPORTANT);
- mSOSConnectionList.add(sosConnection);
+ bindService(intentService, appConnection, Context.BIND_IMPORTANT);
+ mAPPModelConnectionList.add(appConnection);
Intent intentWidget = new Intent(this, APPNewsWidget.class);
intentWidget.setAction(APPNewsWidget.ACTION_WAKEUP_SERVICE);
@@ -218,11 +208,11 @@ public class MainService extends Service {
sendBroadcast(intentWidget);
}
- public class SOSConnection implements ServiceConnection {
+ public class APPConnection implements ServiceConnection {
ComponentName mComponentName;
- boolean isBindToAPPSOSBean(APPModel bean) {
+ boolean isBindToAPP(APPModel bean) {
return mComponentName != null
&& mComponentName.getClassName().equals(bean.getAppMainServiveName())
&& mComponentName.getPackageName().equals(bean.getAppPackageName());
@@ -241,13 +231,13 @@ public class MainService extends Service {
LogUtils.d(TAG, String.format("onServiceDisconnected : \ngetClassName %s\ngetPackageName %s", name.getClassName(), name.getPackageName()));
// 尝试无参数启动一下服务
- String sosPackage = mComponentName.getPackageName();
- LogUtils.d(TAG, String.format("sosPackage %s", sosPackage));
- String sosClassName = mComponentName.getClassName();
- LogUtils.d(TAG, String.format("sosClassName %s", sosClassName));
+ 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(sosPackage, sosClassName));
+ intentService.setComponent(new ComponentName(appPackage, appMainServiceClassName));
startService(intentService);
}
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
new file mode 100644
index 0000000..a957afa
--- /dev/null
+++ b/appbase/src/main/java/cc/winboll/studio/appbase/services/TestDemoBindService.java
@@ -0,0 +1,178 @@
+package cc.winboll.studio.appbase.services;
+
+/**
+ * @Author ZhanGSKen@AliYun.Com
+ * @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.beans.TestDemoBindServiceBean;
+import cc.winboll.studio.libappbase.LogUtils;
+import cc.winboll.studio.libappbase.sos.WinBoll;
+import cc.winboll.studio.appbase.App;
+import cc.winboll.studio.libappbase.sos.SOS;
+
+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/libappbase/src/main/java/cc/winboll/studio/libappbase/services/TestService.java b/appbase/src/main/java/cc/winboll/studio/appbase/services/TestDemoService.java
similarity index 68%
rename from libappbase/src/main/java/cc/winboll/studio/libappbase/services/TestService.java
rename to appbase/src/main/java/cc/winboll/studio/appbase/services/TestDemoService.java
index a73ea97..4739f9c 100644
--- a/libappbase/src/main/java/cc/winboll/studio/libappbase/services/TestService.java
+++ b/appbase/src/main/java/cc/winboll/studio/appbase/services/TestDemoService.java
@@ -1,23 +1,25 @@
-package cc.winboll.studio.libappbase.services;
+package cc.winboll.studio.appbase.services;
/**
* @Author ZhanGSKen@AliYun.Com
- * @Date 2025/02/15 20:48:36
- * @Describe TestService
+ * @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.beans.TestDemoServiceBean;
import cc.winboll.studio.libappbase.LogUtils;
-import cc.winboll.studio.libappbase.bean.TestServiceBean;
import cc.winboll.studio.libappbase.sos.WinBoll;
-import cc.winboll.studio.libappbase.sos.APPModel;
-public class TestService extends Service {
+public class TestDemoService extends Service {
- public static final String TAG = "TestService";
+ 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;
@@ -37,8 +39,8 @@ public class TestService extends Service {
}
public class MyBinder extends Binder {
- public TestService getService() {
- return TestService.this;
+ public TestDemoService getService() {
+ return TestDemoService.this;
}
}
@@ -54,29 +56,35 @@ public class TestService extends Service {
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
LogUtils.d(TAG, "onStartCommand(...)");
- TestServiceBean bean = TestServiceBean.loadBean(this, TestServiceBean.class);
+ TestDemoServiceBean bean = TestDemoServiceBean.loadBean(this, TestDemoServiceBean.class);
if (bean == null) {
- bean = new TestServiceBean();
+ bean = new TestDemoServiceBean();
}
-// if (intent.getAction() != null && intent.getAction().equals(WinBoll.ACTION_SERVICE_ENABLE)) {
-// bean.setIsEnable(true);
-// TestServiceBean.saveBean(this, bean);
-// run();
-// } else if (intent.getAction() != null && intent.getAction().equals(WinBoll.ACTION_SERVICE_DISABLE)) {
-// bean.setIsEnable(false);
-// TestServiceBean.saveBean(this, bean);
-// }
- LogUtils.d(TAG, String.format("TestServiceBean.saveBean setIsEnable %s", bean.isEnable()));
+
+ 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()");
- TestServiceBean bean = TestServiceBean.loadBean(this, TestServiceBean.class);
+ TestDemoServiceBean bean = TestDemoServiceBean.loadBean(this, TestDemoServiceBean.class);
if (bean == null) {
- bean = new TestServiceBean();
- TestServiceBean.saveBean(this, bean);
+ bean = new TestDemoServiceBean();
+ TestDemoServiceBean.saveBean(this, bean);
}
if (bean.isEnable()) {
LogUtils.d(TAG, "run() bean.isEnable()");
@@ -91,7 +99,7 @@ public class TestService extends Service {
super.onDestroy();
LogUtils.d(TAG, "onDestroy()");
TestThread.getInstance(this).setIsExit(true);
-
+
_IsRunning = false;
}
@@ -130,7 +138,6 @@ public class TestService extends Service {
isStarted = true;
super.run();
LogUtils.d(TAG, "run() start");
- WinBoll.bindToAPPBase(mContext, TestService.class.getName());
while (!isExit()) {
LogUtils.d(TAG, "run()");
diff --git a/appbase/src/main/java/cc/winboll/studio/appbase/widgets/APPNewsWidget.java b/appbase/src/main/java/cc/winboll/studio/appbase/widgets/APPNewsWidget.java
index 907f18b..fa3da6e 100644
--- a/appbase/src/main/java/cc/winboll/studio/appbase/widgets/APPNewsWidget.java
+++ b/appbase/src/main/java/cc/winboll/studio/appbase/widgets/APPNewsWidget.java
@@ -26,8 +26,8 @@ public class APPNewsWidget extends AppWidgetProvider {
public static final String TAG = "APPNewsWidget";
- public static final String ACTION_WAKEUP_SERVICE = "cc.winboll.studio.appbase.widgets.WinBollNewsWidget.ACTION_WAKEUP_SERVICE";
- public static final String ACTION_RELOAD_REPORT = "cc.winboll.studio.appbase.widgets.WinBollNewsWidget.ACTION_RELOAD_REPORT";
+ 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;
@@ -124,12 +124,12 @@ public class APPNewsWidget extends AppWidgetProvider {
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_news);
//设置按钮点击事件
- Intent intentPre = new Intent(context, WinBollNewsWidgetClickListener.class);
- intentPre.setAction(WinBollNewsWidgetClickListener.ACTION_PRE);
+ 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, WinBollNewsWidgetClickListener.class);
- intentNext.setAction(WinBollNewsWidgetClickListener.ACTION_NEXT);
+ 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);
diff --git a/appbase/src/main/java/cc/winboll/studio/appbase/widgets/WinBollNewsWidgetClickListener.java b/appbase/src/main/java/cc/winboll/studio/appbase/widgets/APPNewsWidgetClickListener.java
similarity index 70%
rename from appbase/src/main/java/cc/winboll/studio/appbase/widgets/WinBollNewsWidgetClickListener.java
rename to appbase/src/main/java/cc/winboll/studio/appbase/widgets/APPNewsWidgetClickListener.java
index 52e3ee8..bfe263f 100644
--- a/appbase/src/main/java/cc/winboll/studio/appbase/widgets/WinBollNewsWidgetClickListener.java
+++ b/appbase/src/main/java/cc/winboll/studio/appbase/widgets/APPNewsWidgetClickListener.java
@@ -10,11 +10,11 @@ import android.content.Context;
import android.content.Intent;
import cc.winboll.studio.libappbase.LogUtils;
-public class WinBollNewsWidgetClickListener extends BroadcastReceiver {
+public class APPNewsWidgetClickListener extends BroadcastReceiver {
- public static final String TAG = "WinBollNewsWidgetClickListener";
- public static final String ACTION_PRE = "cc.winboll.studio.appbase.widgets.WinBollNewsWidgetClickListener.ACTION_PRE";
- public static final String ACTION_NEXT = "cc.winboll.studio.appbase.widgets.WinBollNewsWidgetClickListener.ACTION_NEXT";
+ 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) {
diff --git a/appbase/src/main/res/layout/activity_main.xml b/appbase/src/main/res/layout/activity_main.xml
index 3af84c5..3cca484 100644
--- a/appbase/src/main/res/layout/activity_main.xml
+++ b/appbase/src/main/res/layout/activity_main.xml
@@ -84,28 +84,62 @@
+ android:onClick="onSartTestDemoService"/>
+ android:onClick="onStopTestDemoService"/>
+ android:onClick="onStopTestDemoServiceNoSettings"/>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ android:onClick="onTestStopMainServiceWithoutSettingEnable"/>
+ android:onClick="onTestUseComponentStartService"/>
+ android:onClick="onTestSOS"/>
diff --git a/libappbase/build.properties b/libappbase/build.properties
index 631b0a2..cb0c2af 100644
--- a/libappbase/build.properties
+++ b/libappbase/build.properties
@@ -1,8 +1,8 @@
#Created by .winboll/winboll_app_build.gradle
-#Fri Mar 07 04:36:05 GMT 2025
-stageCount=3
+#Fri Mar 07 06:49:58 GMT 2025
+stageCount=0
libraryProject=libappbase
-baseVersion=2.0
-publishVersion=2.0.2
-buildCount=7
-baseBetaVersion=2.0.3
+baseVersion=2.1
+publishVersion=2.1.0
+buildCount=1
+baseBetaVersion=2.1.1
diff --git a/libappbase/src/main/java/cc/winboll/studio/libappbase/sos/WinBoll.java b/libappbase/src/main/java/cc/winboll/studio/libappbase/sos/WinBoll.java
index 941ca9d..f826b7b 100644
--- a/libappbase/src/main/java/cc/winboll/studio/libappbase/sos/WinBoll.java
+++ b/libappbase/src/main/java/cc/winboll/studio/libappbase/sos/WinBoll.java
@@ -17,11 +17,13 @@ public class WinBoll {
public static final String EXTRA_APPMODEL = "EXTRA_APPMODEL";
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);
}
diff --git a/libappbase/src/main/java/cc/winboll/studio/libappbase/widgets/StatusWidget.java b/libappbase/src/main/java/cc/winboll/studio/libappbase/widgets/StatusWidget.java
index a4a2eee..389b346 100644
--- a/libappbase/src/main/java/cc/winboll/studio/libappbase/widgets/StatusWidget.java
+++ b/libappbase/src/main/java/cc/winboll/studio/libappbase/widgets/StatusWidget.java
@@ -17,7 +17,6 @@ import cc.winboll.studio.libappbase.utils.ServiceUtils;
import com.hjq.toast.ToastUtils;
import android.content.ServiceConnection;
import android.os.IBinder;
-import cc.winboll.studio.libappbase.services.TestService;
public class StatusWidget extends AppWidgetProvider {
@@ -52,12 +51,12 @@ public class StatusWidget extends AppWidgetProvider {
PendingIntent pendingIntentAppButton = PendingIntent.getBroadcast(context, 0, intentAppButton, PendingIntent.FLAG_UPDATE_CURRENT);
views.setOnClickPendingIntent(R.id.ivapp, pendingIntentAppButton);
- boolean isActive = ServiceUtils.isServiceRunning(context, TestService.class.getName());
- if (isActive) {
- views.setImageViewResource(R.id.ivapp, cc.winboll.studio.libappbase.R.drawable.ic_launcher);
- } else {
- views.setImageViewResource(R.id.ivapp, cc.winboll.studio.libappbase.R.drawable.ic_launcher_disable);
- }
+// boolean isActive = ServiceUtils.isServiceRunning(context, TestService.class.getName());
+// if (isActive) {
+// views.setImageViewResource(R.id.ivapp, cc.winboll.studio.libappbase.R.drawable.ic_launcher);
+// } else {
+// views.setImageViewResource(R.id.ivapp, cc.winboll.studio.libappbase.R.drawable.ic_launcher_disable);
+// }
appWidgetManager.updateAppWidget(appWidgetId, views);
}
}