From 8d2b3251720f4353cbb8353e938f5162d0364dbc Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Sat, 15 Feb 2025 11:30:20 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E7=A3=81=E8=B4=B4=E5=90=AF?= =?UTF-8?q?=E5=8A=A8=E6=9C=8D=E5=8A=A1=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- appbase/build.properties | 4 +- appbase/src/main/AndroidManifest.xml | 8 +-- .../winboll/studio/appbase/MyTileService.java | 66 ++++++++++++++----- .../appbase/services/AssistantService.java | 52 +++++++++++++-- .../studio/appbase/services/MainService.java | 46 +++++++++++-- .../appbase/threads/MainServiceThread.java | 4 +- libappbase/build.properties | 4 +- 7 files changed, 145 insertions(+), 39 deletions(-) diff --git a/appbase/build.properties b/appbase/build.properties index b6ba94e..a1873d5 100644 --- a/appbase/build.properties +++ b/appbase/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Fri Feb 14 13:15:46 GMT 2025 +#Sat Feb 15 03:29:17 GMT 2025 stageCount=2 libraryProject=libappbase baseVersion=1.5 publishVersion=1.5.1 -buildCount=41 +buildCount=91 baseBetaVersion=1.5.2 diff --git a/appbase/src/main/AndroidManifest.xml b/appbase/src/main/AndroidManifest.xml index e695954..a3582ef 100644 --- a/appbase/src/main/AndroidManifest.xml +++ b/appbase/src/main/AndroidManifest.xml @@ -45,12 +45,12 @@ - - - + @@ -60,7 +60,7 @@ - + diff --git a/appbase/src/main/java/cc/winboll/studio/appbase/MyTileService.java b/appbase/src/main/java/cc/winboll/studio/appbase/MyTileService.java index 30ef5f5..407a73a 100644 --- a/appbase/src/main/java/cc/winboll/studio/appbase/MyTileService.java +++ b/appbase/src/main/java/cc/winboll/studio/appbase/MyTileService.java @@ -4,41 +4,73 @@ package cc.winboll.studio.appbase; * @Author ZhanGSKen@AliYun.Com * @Date 2025/02/13 19:30:10 */ -import android.app.PendingIntent; -import android.content.Intent; -import android.os.Build; +import android.content.Context; import android.service.quicksettings.Tile; import android.service.quicksettings.TileService; -import android.widget.Toast; +import cc.winboll.studio.appbase.beans.MainServiceBean; +import cc.winboll.studio.appbase.services.MainService; public class MyTileService extends TileService { + public static final String TAG = "MyTileService"; + + volatile static MyTileService _MyTileService; + @Override public void onStartListening() { super.onStartListening(); + _MyTileService = this; Tile tile = getQsTile(); - tile.setState(Tile.STATE_INACTIVE); - tile.setLabel(getString(R.string.tileservice_name)); - tile.setIcon(android.graphics.drawable.Icon.createWithResource(this, R.drawable.ic_cloud_outline)); - - + MainServiceBean bean = MainServiceBean.loadBean(this, MainServiceBean.class); + if (bean != null && bean.isEnable()) { + //MainService.startMainService(context); + tile.setState(Tile.STATE_ACTIVE); + tile.setIcon(android.graphics.drawable.Icon.createWithResource(this, R.drawable.ic_cloud)); + } else { + //MainService.stopMainService(context); + tile.setState(Tile.STATE_INACTIVE); + tile.setIcon(android.graphics.drawable.Icon.createWithResource(this, R.drawable.ic_cloud_outline)); + } tile.updateTile(); +// Tile tile = getQsTile(); +// tile.setState(Tile.STATE_INACTIVE); +// tile.setLabel(getString(R.string.tileservice_name)); +// tile.setIcon(android.graphics.drawable.Icon.createWithResource(this, R.drawable.ic_cloud_outline)); +// tile.updateTile(); + } @Override public void onClick() { super.onClick(); - Toast.makeText(this, "磁贴被点击", Toast.LENGTH_SHORT).show(); - Tile tile = getQsTile(); - if (tile.getState() == Tile.STATE_INACTIVE) { - tile.setState(Tile.STATE_ACTIVE); - tile.setIcon(android.graphics.drawable.Icon.createWithResource(this, R.drawable.ic_cloud)); + MainServiceBean bean = MainServiceBean.loadBean(this, MainServiceBean.class); + if (bean == null) { + bean = new MainServiceBean(); + bean.setIsEnable(true); + MainServiceBean.saveBean(this, bean); + MainService.startMainService(this); + } else { + if (bean.isEnable()) { + MainService.stopMainService(this); + } else { + MainService.startMainService(this); + } + } + } + public static void updateServiceIconStatus(Context context) { + if (_MyTileService == null) { + return; + } + + Tile tile = _MyTileService.getQsTile(); + MainServiceBean bean = MainServiceBean.loadBean(context, MainServiceBean.class); + if (bean != null && bean.isEnable()) { + tile.setState(Tile.STATE_ACTIVE); + tile.setIcon(android.graphics.drawable.Icon.createWithResource(context, R.drawable.ic_cloud)); } else { tile.setState(Tile.STATE_INACTIVE); - tile.setIcon(android.graphics.drawable.Icon.createWithResource(this, R.drawable.ic_cloud_outline)); - + tile.setIcon(android.graphics.drawable.Icon.createWithResource(context, R.drawable.ic_cloud_outline)); } tile.updateTile(); } - } diff --git a/appbase/src/main/java/cc/winboll/studio/appbase/services/AssistantService.java b/appbase/src/main/java/cc/winboll/studio/appbase/services/AssistantService.java index dfb3a73..b2e2f9b 100644 --- a/appbase/src/main/java/cc/winboll/studio/appbase/services/AssistantService.java +++ b/appbase/src/main/java/cc/winboll/studio/appbase/services/AssistantService.java @@ -15,6 +15,7 @@ import cc.winboll.studio.appbase.beans.MainServiceBean; import cc.winboll.studio.appbase.services.AssistantService; import cc.winboll.studio.appbase.services.MainService; import cc.winboll.studio.libappbase.LogUtils; +import android.os.Binder; public class AssistantService extends Service { @@ -22,11 +23,23 @@ public class AssistantService extends Service { MainServiceBean mMainServiceBean; MyServiceConnection mMyServiceConnection; - volatile boolean mIsThreadAlive; + MainService mMainService; + boolean isBound = false; + volatile boolean isThreadAlive = false; + + public synchronized void setIsThreadAlive(boolean isThreadAlive) { + LogUtils.d(TAG, "setIsThreadAlive(...)"); + LogUtils.d(TAG, String.format("isThreadAlive %s", isThreadAlive)); + this.isThreadAlive = isThreadAlive; + } + + public boolean isThreadAlive() { + return isThreadAlive; + } @Override public IBinder onBind(Intent intent) { - return null; + return new MyBinder(); } @Override @@ -39,7 +52,7 @@ public class AssistantService extends Service { mMyServiceConnection = new MyServiceConnection(); } // 设置运行参数 - mIsThreadAlive = false; + setIsThreadAlive(false); assistantService(); } @@ -53,7 +66,12 @@ public class AssistantService extends Service { @Override public void onDestroy() { //LogUtils.d(TAG, "onDestroy"); - mIsThreadAlive = false; + setIsThreadAlive(false); + // 解除绑定 + if (isBound) { + unbindService(mMyServiceConnection); + isBound = false; + } super.onDestroy(); } @@ -62,10 +80,12 @@ public class AssistantService extends Service { void assistantService() { LogUtils.d(TAG, "assistantService()"); mMainServiceBean = MainServiceBean.loadBean(this, MainServiceBean.class); + LogUtils.d(TAG, String.format("mMainServiceBean.isEnable() %s", mMainServiceBean.isEnable())); if (mMainServiceBean.isEnable()) { - if (mIsThreadAlive == false) { + LogUtils.d(TAG, String.format("mIsThreadAlive %s", isThreadAlive())); + if (isThreadAlive() == false) { // 设置运行状态 - mIsThreadAlive = true; + setIsThreadAlive(true); // 唤醒和绑定主进程 wakeupAndBindMain(); } @@ -76,8 +96,13 @@ public class AssistantService extends Service { // void wakeupAndBindMain() { LogUtils.d(TAG, "wakeupAndBindMain()"); + // 绑定服务的Intent + Intent intent = new Intent(this, MainService.class); startService(new Intent(this, MainService.class)); - bindService(new Intent(AssistantService.this, MainService.class), mMyServiceConnection, Context.BIND_IMPORTANT); + bindService(intent, mMyServiceConnection, Context.BIND_IMPORTANT); + +// startService(new Intent(this, MainService.class)); +// bindService(new Intent(AssistantService.this, MainService.class), mMyServiceConnection, Context.BIND_IMPORTANT); } // 主进程与守护进程连接时需要用到此类 @@ -86,6 +111,9 @@ public class AssistantService extends Service { @Override public void onServiceConnected(ComponentName name, IBinder service) { LogUtils.d(TAG, "onServiceConnected(...)"); + MainService.MyBinder binder = (MainService.MyBinder) service; + mMainService = binder.getService(); + isBound = true; } @Override @@ -95,6 +123,16 @@ public class AssistantService extends Service { if (mMainServiceBean.isEnable()) { wakeupAndBindMain(); } + isBound = false; + mMainService = null; + } + } + + // 用于返回服务实例的Binder + public class MyBinder extends Binder { + AssistantService getService() { + LogUtils.d(TAG, "AssistantService MyBinder getService()"); + return AssistantService.this; } } } diff --git a/appbase/src/main/java/cc/winboll/studio/appbase/services/MainService.java b/appbase/src/main/java/cc/winboll/studio/appbase/services/MainService.java index eb37868..848443d 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 @@ -15,6 +15,7 @@ import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; +import android.os.Binder; import android.os.IBinder; import cc.winboll.studio.appbase.beans.MainServiceBean; import cc.winboll.studio.appbase.handlers.MainServiceHandler; @@ -22,8 +23,7 @@ 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.libappbase.SOS; -import com.hjq.toast.ToastUtils; +import cc.winboll.studio.appbase.MyTileService; public class MainService extends Service { @@ -39,11 +39,13 @@ public class MainService extends Service { MainServiceThread mMainServiceThread; MainServiceHandler mMainServiceHandler; MyServiceConnection mMyServiceConnection; + AssistantService mAssistantService; + boolean isBound = false; MainReceiver mMainReceiver; @Override public IBinder onBind(Intent intent) { - return null; + return new MyBinder(); } public MainServiceThread getRemindThread() { @@ -92,6 +94,9 @@ public class MainService extends Service { mMainReceiver.registerAction(this); } startMainServiceThread(); + + MyTileService.updateServiceIconStatus(this); + LogUtils.i(TAG, "Main Service Is Start."); } } @@ -107,8 +112,14 @@ public class MainService extends Service { // } Intent intent = new Intent(this, AssistantService.class); startService(intent); - LogUtils.d(TAG, "startService(intent)"); - bindService(new Intent(this, AssistantService.class), mMyServiceConnection, Context.BIND_IMPORTANT); + // 绑定服务的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); } // 开启提醒铃声线程 @@ -144,7 +155,11 @@ public class MainService extends Service { mMainServiceBean = MainServiceBean.loadBean(this, MainServiceBean.class); if (mMainServiceBean.isEnable() == false) { // 设置运行状态 - isServiceRunning = false; + isServiceRunning = false;// 解除绑定 + if (isBound) { + unbindService(mMyServiceConnection); + isBound = false; + } // 停止守护进程 Intent intent = new Intent(this, AssistantService.class); stopService(intent); @@ -157,6 +172,9 @@ public class MainService extends Service { stopForeground(true); // 停止消息提醒进程 stopRemindThread(); + + MyTileService.updateServiceIconStatus(this); + super.onDestroy(); //LogUtils.d(TAG, "onDestroy done"); } @@ -168,15 +186,31 @@ public class MainService extends Service { @Override public void onServiceConnected(ComponentName name, IBinder service) { LogUtils.d(TAG, "onServiceConnected(...)"); + AssistantService.MyBinder binder = (AssistantService.MyBinder) service; + mAssistantService = binder.getService(); + isBound = true; } @Override public void onServiceDisconnected(ComponentName name) { LogUtils.d(TAG, "onServiceDisconnected(...)"); + if (mMainServiceBean.isEnable()) { // 唤醒守护进程 wakeupAndBindAssistant(); } + isBound = false; + mAssistantService = null; + } + + } + + + // 用于返回服务实例的Binder + public class MyBinder extends Binder { + MainService getService() { + LogUtils.d(TAG, "MainService MyBinder getService()"); + return MainService.this; } } diff --git a/appbase/src/main/java/cc/winboll/studio/appbase/threads/MainServiceThread.java b/appbase/src/main/java/cc/winboll/studio/appbase/threads/MainServiceThread.java index f611a35..ec2059f 100644 --- a/appbase/src/main/java/cc/winboll/studio/appbase/threads/MainServiceThread.java +++ b/appbase/src/main/java/cc/winboll/studio/appbase/threads/MainServiceThread.java @@ -7,6 +7,7 @@ package cc.winboll.studio.appbase.threads; import android.content.Context; import cc.winboll.studio.appbase.handlers.MainServiceHandler; import cc.winboll.studio.libappbase.LogUtils; +import com.hjq.toast.ToastUtils; import java.lang.ref.WeakReference; public class MainServiceThread extends Thread { @@ -38,9 +39,10 @@ public class MainServiceThread extends Thread { public void run() { LogUtils.d(TAG, "run()"); while (!isExist()) { + //ToastUtils.show("run()"); //LogUtils.d(TAG, "run()"); try { - Thread.sleep(1000); + Thread.sleep(3000); } catch (InterruptedException e) { LogUtils.d(TAG, e, Thread.currentThread().getStackTrace()); } diff --git a/libappbase/build.properties b/libappbase/build.properties index b6ba94e..a1873d5 100644 --- a/libappbase/build.properties +++ b/libappbase/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Fri Feb 14 13:15:46 GMT 2025 +#Sat Feb 15 03:29:17 GMT 2025 stageCount=2 libraryProject=libappbase baseVersion=1.5 publishVersion=1.5.1 -buildCount=41 +buildCount=91 baseBetaVersion=1.5.2