diff --git a/appbase/build.properties b/appbase/build.properties index b1b84b7..4b5cf0d 100644 --- a/appbase/build.properties +++ b/appbase/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Wed Feb 19 03:19:10 HKT 2025 +#Wed Feb 19 11:49:56 GMT 2025 stageCount=4 libraryProject=libappbase baseVersion=1.5 publishVersion=1.5.3 -buildCount=0 +buildCount=61 baseBetaVersion=1.5.4 diff --git a/appbase/src/main/AndroidManifest.xml b/appbase/src/main/AndroidManifest.xml index ac115df..f508b74 100644 --- a/appbase/src/main/AndroidManifest.xml +++ b/appbase/src/main/AndroidManifest.xml @@ -54,9 +54,7 @@ - - @@ -66,8 +64,6 @@ android:exported="true"> - - 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 0fb013f..3e4cac0 100644 --- a/appbase/src/main/java/cc/winboll/studio/appbase/MainActivity.java +++ b/appbase/src/main/java/cc/winboll/studio/appbase/MainActivity.java @@ -95,19 +95,22 @@ public class MainActivity extends AppCompatActivity { public void onStartTestService(View view) { Intent intent = new Intent(this, TestService.class); + intent.setAction(SOS.ACTION_SERVICE_ENABLE); startService(intent); } public void onStopTestService(View view) { Intent intent = new Intent(this, TestService.class); - stopService(intent); - + intent.setAction(SOS.ACTION_SERVICE_DISABLE); + startService(intent); + + Intent intentStop = new Intent(this, TestService.class); + stopService(intentStop); } - public void onUpdateAPPWidget(View view) { - Intent intentAPPWidget = new Intent(this, StatusWidget.class); - intentAPPWidget.setAction(StatusWidget.ACTION_STATUS_UPDATE); - sendBroadcast(intentAPPWidget); + public void onStopTestServiceNoSettings(View view) { + Intent intent = new Intent(this, TestService.class); + stopService(intent); } } 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 bfb963c..a791fea 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 @@ -5,13 +5,24 @@ package cc.winboll.studio.appbase.receivers; * @Date 2025/02/13 06:58:04 * @Describe 主要广播接收器 */ +import android.appwidget.AppWidgetManager; 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.beans.SOSReportBean; import cc.winboll.studio.appbase.services.MainService; +import cc.winboll.studio.appbase.widgets.SOSWidget; +import cc.winboll.studio.libappbase.AppUtils; +import cc.winboll.studio.libappbase.LogUtils; +import cc.winboll.studio.libappbase.SOS; +import cc.winboll.studio.libappbase.bean.APPSOSBean; import com.hjq.toast.ToastUtils; +import java.io.IOException; import java.lang.ref.WeakReference; +import java.text.SimpleDateFormat; +import java.util.Date; public class MainReceiver extends BroadcastReceiver { @@ -32,6 +43,74 @@ public class MainReceiver extends BroadcastReceiver { String szAction = intent.getAction(); if (szAction.equals(ACTION_BOOT_COMPLETED)) { ToastUtils.show("ACTION_BOOT_COMPLETED"); + } else if (szAction.equals(SOS.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 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 { + APPSOSBean bean = APPSOSBean.parseStringToBean(szAPPSOSBean, APPSOSBean.class); + if (bean != null) { + String sosPackage = bean.getSosPackage(); + LogUtils.d(TAG, String.format("sosPackage %s", sosPackage)); + String sosClassName = bean.getSosClassName(); + LogUtils.d(TAG, String.format("sosClassName %s", sosClassName)); + mwrService.get().bindSOSConnection(bean); + } + } catch (IOException e) { + LogUtils.d(TAG, e, Thread.currentThread().getStackTrace()); + } + } + } + } 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 szAPPSOSBean = intent.getStringExtra("APPSOSBean"); + LogUtils.d(TAG, String.format("szAPPSOSBean %s", szAPPSOSBean)); + if (szAPPSOSBean != null && !szAPPSOSBean.equals("")) { + try { + APPSOSBean bean = APPSOSBean.parseStringToBean(szAPPSOSBean, APPSOSBean.class); + if (bean != null) { + String sosPackage = bean.getSosPackage(); + LogUtils.d(TAG, String.format("sosPackage %s", sosPackage)); + String sosClassName = bean.getSosClassName(); + LogUtils.d(TAG, String.format("sosClassName %s", sosClassName)); + + Intent intentService = new Intent(); + intentService.setComponent(new ComponentName(sosPackage, sosClassName)); + context.startService(intentService); + + String appName = AppUtils.getAppNameByPackageName(context, sosPackage); + LogUtils.d(TAG, String.format("appName %s", appName)); + SOSReportBean appSOSReportBean = new SOSReportBean(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); + appSOSReportBean.setSosReport(sbLine.toString()); + + SOSWidget.addAPPSOSReportBean(context, appSOSReportBean); + Intent intentWidget = new Intent(context, SOSWidget.class); + intentWidget.setAction(SOSWidget.ACTION_RELOAD_REPORT); + context.sendBroadcast(intentWidget); + } + } catch (IOException e) { + LogUtils.d(TAG, e, Thread.currentThread().getStackTrace()); + } + } + } } else { ToastUtils.show(szAction); } @@ -39,10 +118,14 @@ public class MainReceiver extends BroadcastReceiver { // 注册 Receiver // - public void registerAction(Context context) { + public void registerAction(MainService service) { IntentFilter filter=new IntentFilter(); filter.addAction(ACTION_BOOT_COMPLETED); + filter.addAction(SOS.ACTION_SOS); + filter.addAction(SOS.ACTION_BIND); + filter.addAction(SOS.ACTION_SERVICE_ENABLE); + filter.addAction(SOS.ACTION_SERVICE_DISABLE); //filter.addAction(Intent.ACTION_BATTERY_CHANGED); - context.registerReceiver(this, filter); + 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 ce66f5c..50c2f9d 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,8 +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.libappbase.LogUtils; import cc.winboll.studio.appbase.widgets.SOSWidget; +import cc.winboll.studio.libappbase.LogUtils; +import cc.winboll.studio.libappbase.bean.APPSOSBean; +import java.util.ArrayList; public class MainService extends Service { @@ -43,6 +45,7 @@ public class MainService extends Service { AssistantService mAssistantService; boolean isBound = false; MainReceiver mMainReceiver; + ArrayList mSOSConnectionList; @Override public IBinder onBind(Intent intent) { @@ -57,6 +60,8 @@ public class MainService extends Service { public void onCreate() { super.onCreate(); LogUtils.d(TAG, "onCreate()"); + mSOSConnectionList = new ArrayList(); + _mControlCenterService = MainService.this; isServiceRunning = false; mMainServiceBean = MainServiceBean.loadBean(this, MainServiceBean.class); @@ -94,16 +99,16 @@ public class MainService extends Service { mMainReceiver = new MainReceiver(this); mMainReceiver.registerAction(this); } - + // 启动小部件 Intent intentTimeWidget = new Intent(this, SOSWidget.class); intentTimeWidget.setAction(SOSWidget.ACTION_RELOAD_REPORT); this.sendBroadcast(intentTimeWidget); - + startMainServiceThread(); MyTileService.updateServiceIconStatus(this); - + LogUtils.i(TAG, "Main Service Is Start."); } } @@ -181,12 +186,67 @@ public class MainService extends Service { stopRemindThread(); MyTileService.updateServiceIconStatus(this); - + super.onDestroy(); //LogUtils.d(TAG, "onDestroy done"); } } + public void bindSOSConnection(APPSOSBean bean) { + LogUtils.d(TAG, "bindSOSConnection(...)"); + // 清理旧的绑定链接 + for (int i = mSOSConnectionList.size() - 1; i > -1; i--) { + SOSConnection item = mSOSConnectionList.get(i); + if (item.isBindToAPPSOSBean(bean)) { + LogUtils.d(TAG, "Bind Servive exist."); + unbindService(item); + mSOSConnectionList.remove(i); + } + } + + // 绑定服务 + SOSConnection sosConnection = new SOSConnection(); + Intent intentService = new Intent(); + intentService.setComponent(new ComponentName(bean.getSosPackage(), bean.getSosClassName())); + bindService(intentService, sosConnection, Context.BIND_IMPORTANT); + mSOSConnectionList.add(sosConnection); + } + + public class SOSConnection implements ServiceConnection { + + ComponentName mComponentName; + + boolean isBindToAPPSOSBean(APPSOSBean bean) { + return mComponentName != null + && mComponentName.getClassName().equals(bean.getSosClassName()) + && mComponentName.getPackageName().equals(bean.getSosPackage()); + } + + @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 sosPackage = mComponentName.getPackageName(); + LogUtils.d(TAG, String.format("sosPackage %s", sosPackage)); + String sosClassName = mComponentName.getClassName(); + LogUtils.d(TAG, String.format("sosClassName %s", sosClassName)); + + Intent intentService = new Intent(); + intentService.setComponent(new ComponentName(sosPackage, sosClassName)); + startService(intentService); + } + + } + // 主进程与守护进程连接时需要用到此类 // private class MyServiceConnection implements ServiceConnection { diff --git a/appbase/src/main/java/cc/winboll/studio/appbase/widgets/SOSWidget.java b/appbase/src/main/java/cc/winboll/studio/appbase/widgets/SOSWidget.java index b10de45..fef8ad4 100644 --- a/appbase/src/main/java/cc/winboll/studio/appbase/widgets/SOSWidget.java +++ b/appbase/src/main/java/cc/winboll/studio/appbase/widgets/SOSWidget.java @@ -46,53 +46,7 @@ public class SOSWidget extends AppWidgetProvider { public void onReceive(Context context, Intent intent) { super.onReceive(context, intent); initAPPSOSReportBeanList(context); - if (intent.getAction().equals(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 szAPPSOSBean = intent.getStringExtra("APPSOSBean"); - LogUtils.d(TAG, String.format("szAPPSOSBean %s", szAPPSOSBean)); - if (szAPPSOSBean != null && !szAPPSOSBean.equals("")) { - try { - APPSOSBean bean = APPSOSBean.parseStringToBean(szAPPSOSBean, APPSOSBean.class); - if (bean != null) { - String sosPackage = bean.getSosPackage(); - LogUtils.d(TAG, String.format("sosPackage %s", sosPackage)); - String sosClassName = bean.getSosClassName(); - LogUtils.d(TAG, String.format("sosClassName %s", sosClassName)); - - Intent intentService = new Intent(); - intentService.setComponent(new ComponentName(sosPackage, sosClassName)); - context.startService(intentService); - - String appName = AppUtils.getAppNameByPackageName(context, sosPackage); - LogUtils.d(TAG, String.format("appName %s", appName)); - SOSReportBean appSOSReportBean = new SOSReportBean(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); - appSOSReportBean.setSosReport(sbLine.toString()); - addAPPSOSReportBean(context, appSOSReportBean); - - AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); - int[] appWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(context, SOSWidget.class)); - for (int appWidgetId : appWidgetIds) { - updateAppWidget(context, appWidgetManager, appWidgetId); - } - } - } catch (IOException e) { - LogUtils.d(TAG, e, Thread.currentThread().getStackTrace()); - } - } - } - } else if (intent.getAction().equals(ACTION_RELOAD_REPORT)) { + 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, SOSWidget.class)); @@ -105,7 +59,7 @@ public class SOSWidget extends AppWidgetProvider { // // 加入新报告信息 // - void addAPPSOSReportBean(Context context, SOSReportBean bean) { + public synchronized static void addAPPSOSReportBean(Context context, SOSReportBean bean) { initAPPSOSReportBeanList(context); _SOSReportBeanList.add(0, bean); // 控制记录总数 @@ -115,7 +69,7 @@ public class SOSWidget extends AppWidgetProvider { SOSReportBean.saveBeanList(context, _SOSReportBeanList, SOSReportBean.class); } - void initAPPSOSReportBeanList(Context context) { + synchronized static void initAPPSOSReportBeanList(Context context) { if (_SOSReportBeanList == null) { _SOSReportBeanList = new ArrayList(); SOSReportBean.loadBeanList(context, _SOSReportBeanList, SOSReportBean.class); @@ -150,7 +104,7 @@ public class SOSWidget extends AppWidgetProvider { if (_SOSReportBeanList != null) { int start = _OnePageLinesCount * _CurrentPageIndex; start = _SOSReportBeanList.size() > start ? start : _SOSReportBeanList.size() - 1; - for (int i = start, j = 0; i < _SOSReportBeanList.size() && j < _OnePageLinesCount; i++, j++) { + for (int i = start, j = 0; i < _SOSReportBeanList.size() && j < _OnePageLinesCount && start > -1; i++, j++) { msgTemp.add(_SOSReportBeanList.get(i).getSosReport()); } String message = String.join("\n", msgTemp); diff --git a/appbase/src/main/res/layout/activity_main.xml b/appbase/src/main/res/layout/activity_main.xml index 56944c4..7414106 100644 --- a/appbase/src/main/res/layout/activity_main.xml +++ b/appbase/src/main/res/layout/activity_main.xml @@ -83,9 +83,9 @@