优化常驻通知电量消耗
This commit is contained in:
		@@ -1,8 +1,8 @@
 | 
				
			|||||||
#Created by .winboll/winboll_app_build.gradle
 | 
					#Created by .winboll/winboll_app_build.gradle
 | 
				
			||||||
#Tue May 06 09:02:43 GMT 2025
 | 
					#Tue May 06 09:59:03 GMT 2025
 | 
				
			||||||
stageCount=3
 | 
					stageCount=3
 | 
				
			||||||
libraryProject=
 | 
					libraryProject=
 | 
				
			||||||
baseVersion=15.0
 | 
					baseVersion=15.0
 | 
				
			||||||
publishVersion=15.0.2
 | 
					publishVersion=15.0.2
 | 
				
			||||||
buildCount=2
 | 
					buildCount=14
 | 
				
			||||||
baseBetaVersion=15.0.3
 | 
					baseBetaVersion=15.0.3
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,9 +5,13 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    <!-- 运行前台服务 -->
 | 
					    <!-- 运行前台服务 -->
 | 
				
			||||||
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
 | 
					    <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
 | 
				
			||||||
    <uses-permission android:name="android.permission.READ_CLIPBOARD" />
 | 
					
 | 
				
			||||||
    <uses-permission android:name="android.permission.WRITE_CLIPBOARD" />
 | 
					    <!-- READ_CLIPBOARD -->
 | 
				
			||||||
    
 | 
					    <uses-permission android:name="android.permission.READ_CLIPBOARD"/>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <!-- WRITE_CLIPBOARD -->
 | 
				
			||||||
 | 
					    <uses-permission android:name="android.permission.WRITE_CLIPBOARD"/>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <application
 | 
					    <application
 | 
				
			||||||
        android:allowBackup="true"
 | 
					        android:allowBackup="true"
 | 
				
			||||||
        android:icon="@mipmap/ic_launcher"
 | 
					        android:icon="@mipmap/ic_launcher"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -31,8 +31,6 @@ import java.time.Instant;
 | 
				
			|||||||
import java.time.LocalDateTime;
 | 
					import java.time.LocalDateTime;
 | 
				
			||||||
import java.time.ZoneId;
 | 
					import java.time.ZoneId;
 | 
				
			||||||
import java.time.format.DateTimeFormatter;
 | 
					import java.time.format.DateTimeFormatter;
 | 
				
			||||||
import java.util.Timer;
 | 
					 | 
				
			||||||
import java.util.TimerTask;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
public class MainService extends Service {
 | 
					public class MainService extends Service {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -45,11 +43,11 @@ public class MainService extends Service {
 | 
				
			|||||||
    Notification mNotification;
 | 
					    Notification mNotification;
 | 
				
			||||||
    RemoteViews mRemoteViews;
 | 
					    RemoteViews mRemoteViews;
 | 
				
			||||||
    TextView mtvTimeStamp;
 | 
					    TextView mtvTimeStamp;
 | 
				
			||||||
    Timer mTimer;
 | 
					    //Timer mTimer;
 | 
				
			||||||
    private static boolean _mIsServiceAlive;
 | 
					    private static boolean _mIsServiceAlive;
 | 
				
			||||||
    public static final String EXTRA_APKFILEPATH = "EXTRA_APKFILEPATH";
 | 
					    public static final String EXTRA_APKFILEPATH = "EXTRA_APKFILEPATH";
 | 
				
			||||||
    final static int MSG_INSTALL_APK = 0;
 | 
					    final static int MSG_INSTALL_APK = 0;
 | 
				
			||||||
    MyHandler mMyHandler;
 | 
					    static MyHandler _MyHandler;
 | 
				
			||||||
    MyServiceConnection mMyServiceConnection;
 | 
					    MyServiceConnection mMyServiceConnection;
 | 
				
			||||||
    MainActivity mInstallCompletedFollowUpActivity;
 | 
					    MainActivity mInstallCompletedFollowUpActivity;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -77,7 +75,7 @@ public class MainService extends Service {
 | 
				
			|||||||
        LogUtils.d(TAG, "onCreate()");
 | 
					        LogUtils.d(TAG, "onCreate()");
 | 
				
			||||||
        _mIsServiceAlive = false;
 | 
					        _mIsServiceAlive = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        mMyHandler = new MyHandler();
 | 
					        _MyHandler = new MyHandler();
 | 
				
			||||||
        if (mMyServiceConnection == null) {
 | 
					        if (mMyServiceConnection == null) {
 | 
				
			||||||
            mMyServiceConnection = new MyServiceConnection();
 | 
					            mMyServiceConnection = new MyServiceConnection();
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -102,17 +100,18 @@ public class MainService extends Service {
 | 
				
			|||||||
                wakeupAndBindAssistant();
 | 
					                wakeupAndBindAssistant();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                LogUtils.d(TAG, "running...");
 | 
					                LogUtils.d(TAG, "running...");
 | 
				
			||||||
 | 
					                _MyHandler.sendEmptyMessage(MSG_UPDATE_TIMESTAMP);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                mTimer = new Timer();
 | 
					//                mTimer = new Timer();
 | 
				
			||||||
                TimerTask task = new TimerTask() {
 | 
					//                TimerTask task = new TimerTask() {
 | 
				
			||||||
                    @Override
 | 
					//                    @Override
 | 
				
			||||||
                    public void run() {
 | 
					//                    public void run() {
 | 
				
			||||||
                        //System.out.println("定时任务执行了");
 | 
					//                        //System.out.println("定时任务执行了");
 | 
				
			||||||
                        mMyHandler.sendEmptyMessage(MSG_UPDATE_TIMESTAMP);
 | 
					//                        mMyHandler.sendEmptyMessage(MSG_UPDATE_TIMESTAMP);
 | 
				
			||||||
                    }
 | 
					//                    }
 | 
				
			||||||
                };
 | 
					//                };
 | 
				
			||||||
                // 延迟1秒后开始执行,之后每隔100毫秒执行一次
 | 
					//                // 延迟1秒后开始执行,之后每隔100毫秒执行一次
 | 
				
			||||||
                mTimer.schedule(task, 1000, 100);
 | 
					//                mTimer.schedule(task, 1000, 100);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -126,14 +125,17 @@ public class MainService extends Service {
 | 
				
			|||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public void onDestroy() {
 | 
					    public void onDestroy() {
 | 
				
			||||||
        super.onDestroy();
 | 
					        super.onDestroy();
 | 
				
			||||||
        if (mTimer != null) {
 | 
					
 | 
				
			||||||
            mTimer.cancel();
 | 
					
 | 
				
			||||||
        }
 | 
					//        if (mTimer != null) {
 | 
				
			||||||
        
 | 
					//            mTimer.cancel();
 | 
				
			||||||
 | 
					//        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        NotificationManager notificationManager = getSystemService(NotificationManager.class);
 | 
					        NotificationManager notificationManager = getSystemService(NotificationManager.class);
 | 
				
			||||||
        notificationManager.cancelAll();
 | 
					        notificationManager.cancelAll();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        _mIsServiceAlive = false;
 | 
					        _mIsServiceAlive = false;
 | 
				
			||||||
 | 
					        _MyHandler = null;
 | 
				
			||||||
        LogUtils.d(TAG, "onDestroy()");
 | 
					        LogUtils.d(TAG, "onDestroy()");
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -217,9 +219,9 @@ public class MainService extends Service {
 | 
				
			|||||||
                        String szTimeStampFormatString = AppConfigsUtil.getInstance(MainService.this).getAppConfigsModel().getTimeStampFormatString();
 | 
					                        String szTimeStampFormatString = AppConfigsUtil.getInstance(MainService.this).getAppConfigsModel().getTimeStampFormatString();
 | 
				
			||||||
                        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(szTimeStampFormatString);
 | 
					                        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(szTimeStampFormatString);
 | 
				
			||||||
                        String formattedDateTime = ldt.format(formatter);
 | 
					                        String formattedDateTime = ldt.format(formatter);
 | 
				
			||||||
                        TimeStampRemoteViewsUtil.getInstance(MainService.this).showNotification(formattedDateTime);
 | 
					                        TimeStampRemoteViewsUtil.getInstance(MainService.this).showNotification(formattedDateTime + " 已复制");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                        //LogUtils.d(TAG, "Hello, World");
 | 
					                        LogUtils.d(TAG, "Hello, World! " + formattedDateTime);
 | 
				
			||||||
                        break;
 | 
					                        break;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                default:
 | 
					                default:
 | 
				
			||||||
@@ -228,4 +230,10 @@ public class MainService extends Service {
 | 
				
			|||||||
            super.handleMessage(message);
 | 
					            super.handleMessage(message);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static void updateCopiedTimeStamp() {
 | 
				
			||||||
 | 
					        if (_MyHandler != null) {
 | 
				
			||||||
 | 
					            _MyHandler.sendEmptyMessage(MSG_UPDATE_TIMESTAMP);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -10,6 +10,7 @@ import android.content.Context;
 | 
				
			|||||||
import android.content.Intent;
 | 
					import android.content.Intent;
 | 
				
			||||||
import android.widget.Toast;
 | 
					import android.widget.Toast;
 | 
				
			||||||
import cc.winboll.studio.libappbase.LogUtils;
 | 
					import cc.winboll.studio.libappbase.LogUtils;
 | 
				
			||||||
 | 
					import cc.winboll.studio.timestamp.MainService;
 | 
				
			||||||
import cc.winboll.studio.timestamp.utils.AppConfigsUtil;
 | 
					import cc.winboll.studio.timestamp.utils.AppConfigsUtil;
 | 
				
			||||||
import cc.winboll.studio.timestamp.utils.ClipboardUtil;
 | 
					import cc.winboll.studio.timestamp.utils.ClipboardUtil;
 | 
				
			||||||
import java.time.Instant;
 | 
					import java.time.Instant;
 | 
				
			||||||
@@ -39,6 +40,7 @@ public class ButtonClickReceiver extends BroadcastReceiver {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            // 比如显示一个Toast
 | 
					            // 比如显示一个Toast
 | 
				
			||||||
            Toast.makeText(context, formattedDateTime + " 已复制", Toast.LENGTH_SHORT).show();
 | 
					            Toast.makeText(context, formattedDateTime + " 已复制", Toast.LENGTH_SHORT).show();
 | 
				
			||||||
 | 
					            MainService.updateCopiedTimeStamp();
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -102,31 +102,30 @@ public class TimeStampRemoteViewsUtil {
 | 
				
			|||||||
        if (mRemoteViews == null) {
 | 
					        if (mRemoteViews == null) {
 | 
				
			||||||
            // 创建 RemoteViews 对象,加载布局
 | 
					            // 创建 RemoteViews 对象,加载布局
 | 
				
			||||||
            mRemoteViews = new RemoteViews(mContext.getPackageName(), R.layout.custom_notification_layout);
 | 
					            mRemoteViews = new RemoteViews(mContext.getPackageName(), R.layout.custom_notification_layout);
 | 
				
			||||||
 | 
					 | 
				
			||||||
            // 自定义 TextView 的文本
 | 
					 | 
				
			||||||
            mRemoteViews.setTextViewText(R.id.tv_timestamp, msg);
 | 
					 | 
				
			||||||
            // 自定义 TextView 的文本颜色
 | 
					 | 
				
			||||||
            mRemoteViews.setTextColor(R.id.tv_timestamp, mContext.getResources().getColor(R.color.colorAccent, null));
 | 
					 | 
				
			||||||
            // 这里虽然不能直接设置字体大小,但可以通过反射等方式尝试(不推荐,且有兼容性问题)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            // 创建点击通知后的意图
 | 
					 | 
				
			||||||
            mIntentMain = new Intent(mContext, MainActivity.class);
 | 
					 | 
				
			||||||
            PendingIntent pendingMainIntent = PendingIntent.getActivity(mContext, 0, mIntentMain, PendingIntent.FLAG_UPDATE_CURRENT);
 | 
					 | 
				
			||||||
            // 设置通知的点击事件
 | 
					 | 
				
			||||||
            mRemoteViews.setOnClickPendingIntent(R.id.tv_timestamp, pendingMainIntent);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            // 创建点击按钮后要发送的广播 Intent
 | 
					 | 
				
			||||||
            Intent broadcastIntent = new Intent(ButtonClickReceiver.BUTTON_COPYTIMESTAMP_ACTION);
 | 
					 | 
				
			||||||
            android.app.PendingIntent pendingIntent = android.app.PendingIntent.getBroadcast(
 | 
					 | 
				
			||||||
                mContext,
 | 
					 | 
				
			||||||
                0,
 | 
					 | 
				
			||||||
                broadcastIntent,
 | 
					 | 
				
			||||||
                android.app.PendingIntent.FLAG_UPDATE_CURRENT
 | 
					 | 
				
			||||||
            );
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            // 为按钮设置点击事件
 | 
					 | 
				
			||||||
            mRemoteViews.setOnClickPendingIntent(R.id.btn_copytimestamp, pendingIntent);
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					        // 自定义 TextView 的文本
 | 
				
			||||||
 | 
					        mRemoteViews.setTextViewText(R.id.tv_timestamp, msg);
 | 
				
			||||||
 | 
					        // 自定义 TextView 的文本颜色
 | 
				
			||||||
 | 
					        mRemoteViews.setTextColor(R.id.tv_timestamp, mContext.getResources().getColor(R.color.colorAccent, null));
 | 
				
			||||||
 | 
					        // 这里虽然不能直接设置字体大小,但可以通过反射等方式尝试(不推荐,且有兼容性问题)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // 创建点击通知后的意图
 | 
				
			||||||
 | 
					        mIntentMain = new Intent(mContext, MainActivity.class);
 | 
				
			||||||
 | 
					        PendingIntent pendingMainIntent = PendingIntent.getActivity(mContext, 0, mIntentMain, PendingIntent.FLAG_UPDATE_CURRENT);
 | 
				
			||||||
 | 
					        // 设置通知的点击事件
 | 
				
			||||||
 | 
					        mRemoteViews.setOnClickPendingIntent(R.id.tv_timestamp, pendingMainIntent);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // 创建点击按钮后要发送的广播 Intent
 | 
				
			||||||
 | 
					        Intent broadcastIntent = new Intent(ButtonClickReceiver.BUTTON_COPYTIMESTAMP_ACTION);
 | 
				
			||||||
 | 
					        android.app.PendingIntent pendingIntent = android.app.PendingIntent.getBroadcast(
 | 
				
			||||||
 | 
					            mContext,
 | 
				
			||||||
 | 
					            0,
 | 
				
			||||||
 | 
					            broadcastIntent,
 | 
				
			||||||
 | 
					            android.app.PendingIntent.FLAG_UPDATE_CURRENT
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // 为按钮设置点击事件
 | 
				
			||||||
 | 
					        mRemoteViews.setOnClickPendingIntent(R.id.btn_copytimestamp, pendingIntent);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        mNotificationHelper.showCustomForegroundNotification(mIntentMain, mRemoteViews, mRemoteViews);
 | 
					        mNotificationHelper.showCustomForegroundNotification(mIntentMain, mRemoteViews, mRemoteViews);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
<resources>
 | 
					<resources>
 | 
				
			||||||
    <string name="app_name">TimeStamp</string>
 | 
					    <string name="app_name">TimeStamp</string>
 | 
				
			||||||
    <string name="text_aboutservernotification">This is the prompt window when the SMS service runs, which you can set to hide this class notification in the notification message settings.</string>
 | 
					    <string name="text_aboutservernotification">This is the prompt window when the SMS service runs, which you can set to hide this class notification in the notification message settings.</string>
 | 
				
			||||||
    
 | 
					    <string name="accessibility_service_description">Accessibility service description.</string>
 | 
				
			||||||
</resources>
 | 
					</resources>
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user