diff --git a/appbase/build.gradle b/appbase/build.gradle index d93b9f4..1ad2cf5 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}") } @@ -44,9 +44,13 @@ android { } dependencies { - api project(':libappbase') + implementation project(':libappbase') implementation fileTree(dir: 'libs', include: ['*.jar']) + // SSH + implementation 'com.jcraft:jsch:0.1.55' + // Html 解析 + implementation 'org.jsoup:jsoup:1.13.1' // 二维码类库 implementation 'com.google.zxing:core:3.4.1' implementation 'com.journeyapps:zxing-android-embedded:3.6.0' diff --git a/appbase/build.properties b/appbase/build.properties index 741f66b..b044c5c 100644 --- a/appbase/build.properties +++ b/appbase/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Thu Feb 27 02:34:13 GMT 2025 -stageCount=3 +#Sat Mar 08 02:31:11 HKT 2025 +stageCount=2 libraryProject=libappbase -baseVersion=2.0 -publishVersion=2.0.2 -buildCount=4 -baseBetaVersion=2.0.3 +baseVersion=2.1 +publishVersion=2.1.1 +buildCount=0 +baseBetaVersion=2.1.2 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/App.java b/appbase/src/main/java/cc/winboll/studio/appbase/App.java index 84d0424..f2098d7 100644 --- a/appbase/src/main/java/cc/winboll/studio/appbase/App.java +++ b/appbase/src/main/java/cc/winboll/studio/appbase/App.java @@ -6,22 +6,23 @@ package cc.winboll.studio.appbase; * @Describe APPbase 应用类 */ import cc.winboll.studio.libappbase.GlobalApplication; -import cc.winboll.studio.libappbase.SOSCSBroadcastReceiver; import android.content.IntentFilter; +import cc.winboll.studio.libappbase.sos.SOSCenterServiceReceiver; +import cc.winboll.studio.libappbase.sos.SOS; public class App extends GlobalApplication { public static final String TAG = "App"; - SOSCSBroadcastReceiver mSOSCSBroadcastReceiver; + SOSCenterServiceReceiver mSOSCenterServiceReceiver; @Override public void onCreate() { super.onCreate(); GlobalApplication.setIsDebuging(this, BuildConfig.DEBUG); - mSOSCSBroadcastReceiver = new SOSCSBroadcastReceiver(); + mSOSCenterServiceReceiver = new SOSCenterServiceReceiver(); IntentFilter intentFilter = new IntentFilter(); - intentFilter.addAction(SOSCSBroadcastReceiver.ACTION_SOS); - registerReceiver(mSOSCSBroadcastReceiver, 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 9ac5266..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,15 +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.WinBoll; -import cc.winboll.studio.libappbase.SimpleOperateSignalCenterService; -import cc.winboll.studio.libappbase.bean.APPNewsBean; -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 { @@ -68,17 +68,17 @@ 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(); + String serviceClassName = TestDemoService.class.getName(); // 构建Intent Intent intentService = new Intent(); @@ -87,30 +87,55 @@ public class MainActivity extends AppCompatActivity { startService(intentService); } - public void onSOS(View view) { - Intent intent = new Intent(this, TestService.class); + public void onTestSOS(View view) { + Intent intent = new Intent(this, TestDemoService.class); stopService(intent); - WinBoll.sosService(this, new APPNewsBean(getPackageName(), TestService.class.getName())); + 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); + 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); + public void onStopTestDemoService(View view) { + Intent intent = new Intent(this, TestDemoService.class); + intent.setAction(TestDemoService.ACTION_DISABLE); startService(intent); - Intent intentStop = new Intent(this, TestService.class); + 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 364fe5d..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 @@ -13,16 +13,18 @@ import android.content.Intent; import android.content.IntentFilter; import cc.winboll.studio.appbase.beans.WinBollNewsBean; import cc.winboll.studio.appbase.services.MainService; -import cc.winboll.studio.appbase.widgets.WinBollNewsWidget; +import cc.winboll.studio.appbase.widgets.APPNewsWidget; import cc.winboll.studio.libappbase.AppUtils; import cc.winboll.studio.libappbase.LogUtils; -import cc.winboll.studio.libappbase.WinBoll; -import cc.winboll.studio.libappbase.bean.APPNewsBean; import com.hjq.toast.ToastUtils; import java.io.IOException; import java.lang.ref.WeakReference; import java.text.SimpleDateFormat; import java.util.Date; +import cc.winboll.studio.libappbase.sos.WinBoll; +import cc.winboll.studio.libappbase.sos.APPModel; +import cc.winboll.studio.libappbase.sos.SOS; +import cc.winboll.studio.libappbase.sos.SOSObject; public class MainReceiver extends BroadcastReceiver { @@ -45,70 +47,58 @@ 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 { - APPNewsBean bean = APPNewsBean.parseStringToBean(szAPPSOSBean, APPNewsBean.class); - if (bean != null) { - String szNewsPackageName = bean.getNewsPackageName(); - LogUtils.d(TAG, String.format("szNewsPackageName %s", szNewsPackageName)); - String szNewsClassName = bean.getNewsClassName(); - LogUtils.d(TAG, String.format("szNewsClassName %s", szNewsClassName)); - 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(WinBoll.ACTION_SOS)) { + } else if (intent.getAction().equals(SOS.ACTION_SOS)) { LogUtils.d(TAG, "ACTION_SOS"); - 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 szAPPNewsBean = intent.getStringExtra("APPSOSBean"); - LogUtils.d(TAG, String.format("szAPPNewsBean %s", szAPPNewsBean)); - if (szAPPNewsBean != null && !szAPPNewsBean.equals("")) { - try { - APPNewsBean bean = APPNewsBean.parseStringToBean(szAPPNewsBean, APPNewsBean.class); - if (bean != null) { - String szNewsPackageName = bean.getNewsPackageName(); - LogUtils.d(TAG, String.format("szNewsPackageName %s", szNewsPackageName)); - String szNewsClassName = bean.getNewsClassName(); - LogUtils.d(TAG, String.format("szNewsClassName %s", szNewsClassName)); + 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(szNewsPackageName, szNewsClassName)); - context.startService(intentService); + Intent intentService = new Intent(); + intentService.setComponent(new ComponentName(szObjectPackageName, szObjectServiveName)); + context.startService(intentService); - String appName = AppUtils.getAppNameByPackageName(context, szNewsPackageName); - 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()); + 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()); - WinBollNewsWidget.addWinBollNewsBean(context, appWinBollNewsBean); + APPNewsWidget.addWinBollNewsBean(context, appWinBollNewsBean); - Intent intentWidget = new Intent(context, WinBollNewsWidget.class); - intentWidget.setAction(WinBollNewsWidget.ACTION_RELOAD_REPORT); - context.sendBroadcast(intentWidget); - } - } catch (IOException e) { - LogUtils.d(TAG, e, Thread.currentThread().getStackTrace()); - } + Intent intentWidget = new Intent(context, APPNewsWidget.class); + intentWidget.setAction(APPNewsWidget.ACTION_RELOAD_REPORT); + context.sendBroadcast(intentWidget); } + + } } else { ToastUtils.show(szAction); @@ -120,10 +110,8 @@ public class MainReceiver extends BroadcastReceiver { public void registerAction(MainService service) { IntentFilter filter=new IntentFilter(); filter.addAction(ACTION_BOOT_COMPLETED); - filter.addAction(WinBoll.ACTION_SOS); + filter.addAction(SOS.ACTION_SOS); filter.addAction(WinBoll.ACTION_BIND); - filter.addAction(WinBoll.ACTION_SERVICE_ENABLE); - filter.addAction(WinBoll.ACTION_SERVICE_DISABLE); //filter.addAction(Intent.ACTION_BATTERY_CHANGED); service.registerReceiver(this, filter); } 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 72b158a..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 @@ -23,10 +23,10 @@ import cc.winboll.studio.appbase.handlers.MainServiceHandler; 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.WinBollNewsWidget; +import cc.winboll.studio.appbase.widgets.APPNewsWidget; import cc.winboll.studio.libappbase.LogUtils; -import cc.winboll.studio.libappbase.bean.APPNewsBean; import java.util.ArrayList; +import cc.winboll.studio.libappbase.sos.APPModel; public class MainService extends Service { @@ -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; @@ -101,8 +101,8 @@ public class MainService extends Service { } // 启动小部件 - Intent intentTimeWidget = new Intent(this, WinBollNewsWidget.class); - intentTimeWidget.setAction(WinBollNewsWidget.ACTION_RELOAD_REPORT); + Intent intentTimeWidget = new Intent(this, APPNewsWidget.class); + intentTimeWidget.setAction(APPNewsWidget.ACTION_RELOAD_REPORT); this.sendBroadcast(intentTimeWidget); startMainServiceThread(); @@ -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,40 +182,40 @@ public class MainService extends Service { } } - public void bindSOSConnection(APPNewsBean 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.getNewsPackageName(), bean.getNewsClassName())); - bindService(intentService, sosConnection, Context.BIND_IMPORTANT); - mSOSConnectionList.add(sosConnection); + intentService.setComponent(new ComponentName(bean.getAppPackageName(), bean.getAppMainServiveName())); + bindService(intentService, appConnection, Context.BIND_IMPORTANT); + mAPPModelConnectionList.add(appConnection); - Intent intentWidget = new Intent(this, WinBollNewsWidget.class); - intentWidget.setAction(WinBollNewsWidget.ACTION_WAKEUP_SERVICE); - APPNewsBean appSOSBean = new APPNewsBean(bean.getNewsPackageName(), bean.getNewsClassName()); + Intent intentWidget = new Intent(this, APPNewsWidget.class); + intentWidget.setAction(APPNewsWidget.ACTION_WAKEUP_SERVICE); + APPModel appSOSBean = new APPModel(bean.getAppPackageName(), bean.getAppMainServiveName()); intentWidget.putExtra("APPSOSBean", appSOSBean.toString()); sendBroadcast(intentWidget); } - public class SOSConnection implements ServiceConnection { + public class APPConnection implements ServiceConnection { ComponentName mComponentName; - boolean isBindToAPPSOSBean(APPNewsBean bean) { + boolean isBindToAPP(APPModel bean) { return mComponentName != null - && mComponentName.getClassName().equals(bean.getNewsClassName()) - && mComponentName.getPackageName().equals(bean.getNewsPackageName()); + && mComponentName.getClassName().equals(bean.getAppMainServiveName()) + && mComponentName.getPackageName().equals(bean.getAppPackageName()); } @Override @@ -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 1e627db..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,22 +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; -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; @@ -36,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; } } @@ -53,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()"); @@ -90,7 +99,7 @@ public class TestService extends Service { super.onDestroy(); LogUtils.d(TAG, "onDestroy()"); TestThread.getInstance(this).setIsExit(true); - + _IsRunning = false; } @@ -129,7 +138,6 @@ public class TestService extends Service { isStarted = true; super.run(); LogUtils.d(TAG, "run() start"); - WinBoll.bindToAPPBase(mContext, new APPNewsBean(mContext.getPackageName(), TestService.class.getName())); while (!isExit()) { LogUtils.d(TAG, "run()"); diff --git a/appbase/src/main/java/cc/winboll/studio/appbase/widgets/WinBollNewsWidget.java b/appbase/src/main/java/cc/winboll/studio/appbase/widgets/APPNewsWidget.java similarity index 78% rename from appbase/src/main/java/cc/winboll/studio/appbase/widgets/WinBollNewsWidget.java rename to appbase/src/main/java/cc/winboll/studio/appbase/widgets/APPNewsWidget.java index 65e0c76..fa3da6e 100644 --- a/appbase/src/main/java/cc/winboll/studio/appbase/widgets/WinBollNewsWidget.java +++ b/appbase/src/main/java/cc/winboll/studio/appbase/widgets/APPNewsWidget.java @@ -15,18 +15,19 @@ import cc.winboll.studio.appbase.R; import cc.winboll.studio.appbase.beans.WinBollNewsBean; import cc.winboll.studio.libappbase.AppUtils; import cc.winboll.studio.libappbase.LogUtils; -import cc.winboll.studio.libappbase.bean.APPNewsBean; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; +import cc.winboll.studio.libappbase.sos.APPModel; +import cc.winboll.studio.libappbase.sos.WinBoll; -public class WinBollNewsWidget extends AppWidgetProvider { +public class APPNewsWidget extends AppWidgetProvider { - public static final String TAG = "WinBollNewsWidget"; + 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; @@ -49,25 +50,25 @@ public class WinBollNewsWidget extends AppWidgetProvider { 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, WinBollNewsWidget.class)); + 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 szWinBollNewsBean = intent.getStringExtra("WinBollNewsBean"); - LogUtils.d(TAG, String.format("szWinBollNewsBean %s", szWinBollNewsBean)); - if (szWinBollNewsBean != null && !szWinBollNewsBean.equals("")) { + String szAPPModel = intent.getStringExtra(WinBoll.EXTRA_APPMODEL); + LogUtils.d(TAG, String.format("szAPPModel %s", szAPPModel)); + if (szAPPModel != null && !szAPPModel.equals("")) { try { - APPNewsBean bean = APPNewsBean.parseStringToBean(szWinBollNewsBean, APPNewsBean.class); + APPModel bean = APPModel.parseStringToBean(szAPPModel, APPModel.class); if (bean != null) { - String szNewsPackageName = bean.getNewsPackageName(); - LogUtils.d(TAG, String.format("szNewsPackageName %s", szNewsPackageName)); - String szNewsClassName = bean.getNewsClassName(); - LogUtils.d(TAG, String.format("szNewsClassName %s", szNewsClassName)); + 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, szNewsPackageName); + 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"); @@ -82,7 +83,7 @@ public class WinBollNewsWidget extends AppWidgetProvider { addWinBollNewsBean(context, winBollNewsBean); AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); - int[] appWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(context, WinBollNewsWidget.class)); + int[] appWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(context, APPNewsWidget.class)); for (int appWidgetId : appWidgetIds) { updateAppWidget(context, appWidgetManager, appWidgetId); } @@ -123,12 +124,12 @@ public class WinBollNewsWidget 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); @@ -156,8 +157,8 @@ public class WinBollNewsWidget extends AppWidgetProvider { if (_CurrentPageIndex > 0) { _CurrentPageIndex = _CurrentPageIndex - 1; } - Intent intentWidget = new Intent(context, WinBollNewsWidget.class); - intentWidget.setAction(WinBollNewsWidget.ACTION_RELOAD_REPORT); + Intent intentWidget = new Intent(context, APPNewsWidget.class); + intentWidget.setAction(APPNewsWidget.ACTION_RELOAD_REPORT); context.sendBroadcast(intentWidget); } } @@ -167,8 +168,8 @@ public class WinBollNewsWidget extends AppWidgetProvider { if ((_CurrentPageIndex + 1) * _OnePageLinesCount < _WinBollNewsBeanList.size()) { _CurrentPageIndex = _CurrentPageIndex + 1; } - Intent intentWidget = new Intent(context, WinBollNewsWidget.class); - intentWidget.setAction(WinBollNewsWidget.ACTION_RELOAD_REPORT); + Intent intentWidget = new Intent(context, APPNewsWidget.class); + intentWidget.setAction(APPNewsWidget.ACTION_RELOAD_REPORT); context.sendBroadcast(intentWidget); } } 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 62% 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 3ddf296..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) { @@ -25,10 +25,10 @@ public class WinBollNewsWidgetClickListener extends BroadcastReceiver { } if (action.equals(ACTION_PRE)) { LogUtils.d(TAG, "ACTION_PRE"); - WinBollNewsWidget.prePage(context); + APPNewsWidget.prePage(context); } else if (action.equals(ACTION_NEXT)) { LogUtils.d(TAG, "ACTION_NEXT"); - WinBollNewsWidget.nextPage(context); + APPNewsWidget.nextPage(context); } else { LogUtils.d(TAG, String.format("action %s", action)); } diff --git a/appbase/src/main/res/layout/activity_main.xml b/appbase/src/main/res/layout/activity_main.xml index a17706a..3cca484 100644 --- a/appbase/src/main/res/layout/activity_main.xml +++ b/appbase/src/main/res/layout/activity_main.xml @@ -1,149 +1,194 @@ + android:layout_width="match_parent" + android:layout_height="match_parent"> - - - - - + android:layout_weight="1.0"> - - - -