diff --git a/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/receivers/SMSRecevier.java b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/receivers/SMSRecevier.java index 1bd854f..fd80e0f 100644 --- a/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/receivers/SMSRecevier.java +++ b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/receivers/SMSRecevier.java @@ -9,7 +9,6 @@ import cc.winboll.studio.mymessagemanager.App; import cc.winboll.studio.mymessagemanager.activitys.SMSActivity; import cc.winboll.studio.mymessagemanager.beans.SMSBean; import cc.winboll.studio.mymessagemanager.utils.AppConfigUtil; -import cc.winboll.studio.mymessagemanager.utils.NotificationUtil; import cc.winboll.studio.mymessagemanager.utils.PhoneUtil; import cc.winboll.studio.mymessagemanager.utils.SMSReceiveRuleUtil; import cc.winboll.studio.mymessagemanager.utils.SMSRecycleUtil; diff --git a/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/services/MainService.java b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/services/MainService.java index 8b58d1a..263026c 100644 --- a/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/services/MainService.java +++ b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/services/MainService.java @@ -5,6 +5,7 @@ package cc.winboll.studio.mymessagemanager.services; * @Date 2024/07/19 14:30:57 * @Describe 应用主要服务组件类 */ +import android.app.Notification; import android.app.Service; import android.content.ComponentName; import android.content.Context; @@ -14,11 +15,12 @@ import android.content.ServiceConnection; import android.os.IBinder; import cc.winboll.studio.libappbase.LogUtils; import cc.winboll.studio.mymessagemanager.R; +import cc.winboll.studio.mymessagemanager.activitys.MainActivity; import cc.winboll.studio.mymessagemanager.beans.MessageNotificationBean; import cc.winboll.studio.mymessagemanager.receivers.SMSRecevier; import cc.winboll.studio.mymessagemanager.services.MainService; import cc.winboll.studio.mymessagemanager.utils.AppConfigUtil; -import cc.winboll.studio.mymessagemanager.utils.NotificationUtil; +import cc.winboll.studio.mymessagemanager.utils.NotificationHelper; import cc.winboll.studio.mymessagemanager.utils.ServiceUtil; import com.hjq.toast.ToastUtils; @@ -26,6 +28,9 @@ public class MainService extends Service { public static String TAG = "ManagerService"; + // 前台服务通知工具 + NotificationHelper mNotificationHelper; + Notification notification; AppConfigUtil mConfigUtil; //MyBinder mMyBinder; MyServiceConnection mMyServiceConnection; @@ -73,17 +78,12 @@ public class MainService extends Service { mSMSRecevier = new SMSRecevier(); registerReceiver(mSMSRecevier, localIntentFilter); - // 显示前台通知栏 - MessageNotificationBean notificationMessage = createNotificationMessage(); - NotificationUtil nu = new NotificationUtil(); - nu.sendForegroundNotification(MainService.this, notificationMessage); + NotificationHelper helper = new NotificationHelper(this); + Intent intent = new Intent(this, MainActivity.class); + notification = helper.showForegroundNotification(intent, getString(R.string.app_name), getString(R.string.text_aboutservernotification)); + startForeground(NotificationHelper.FOREGROUND_NOTIFICATION_ID, notification); - /*if (mConfigUtil.isEnableTTS()) { - TTSPlayRuleUtil.speakText(ManagerService.this, getString(R.string.text_iamhere), 0); - GlobalApplication.showApplicationMessage(getString(R.string.text_iamhere)); - }*/ - ToastUtils.show("Service is start."); LogUtils.i(TAG, "Service is start."); } @@ -101,13 +101,6 @@ public class MainService extends Service { } - private MessageNotificationBean createNotificationMessage() { - String szTitle = getApplicationContext().getString(R.string.app_name); - String szContent = getString(R.string.text_aboutservernotification); - return new MessageNotificationBean(NotificationUtil.ID_MSG_SERVICE, "", szTitle, szContent); - - } - @Override public int onStartCommand(Intent intent, int flags, int startId) { //return super.onStartCommand(intent, flags, startId); @@ -116,12 +109,12 @@ public class MainService extends Service { return mConfigUtil.mAppConfigBean.isEnableService() ? Service.START_STICKY: super.onStartCommand(intent, flags, startId); } - /*private class MyBinder extends IMyAidlInterface.Stub { - @Override - public String getServiceName() { - return MainService.class.getSimpleName(); - } - }*/ + /*private class MyBinder extends IMyAidlInterface.Stub { + @Override + public String getServiceName() { + return MainService.class.getSimpleName(); + } + }*/ // 主进程与守护进程连接时需要用到此类 // diff --git a/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/NotificationHelper.java b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/NotificationHelper.java new file mode 100644 index 0000000..72503b5 --- /dev/null +++ b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/NotificationHelper.java @@ -0,0 +1,158 @@ +package cc.winboll.studio.mymessagemanager.utils; + +/** + * @Author ZhanGSKen@AliYun.Com + * @Date 2025/04/01 14:10:35 + * @Describe 应用通知工具类 + */ +import android.app.Notification; +import android.app.NotificationChannel; +import android.app.NotificationManager; +import android.app.PendingIntent; +import android.content.Context; +import android.content.Intent; +import android.graphics.BitmapFactory; +import android.os.Build; +import android.widget.RemoteViews; +import androidx.annotation.RequiresApi; +import androidx.core.app.NotificationCompat; +import cc.winboll.studio.mymessagemanager.R; +import cc.winboll.studio.mymessagemanager.activitys.SMSActivity; + +public class NotificationHelper { + public static final String TAG = "NotificationHelper"; + + // 渠道ID和名称 + private static final String CHANNEL_ID_FOREGROUND = "foreground_channel"; + private static final String CHANNEL_NAME_FOREGROUND = "Foreground Service"; + private static final String CHANNEL_ID_TEMPORARY = "temporary_channel"; + private static final String CHANNEL_NAME_TEMPORARY = "Temporary Notifications"; + + // 通知ID + public static final int FOREGROUND_NOTIFICATION_ID = 1001; + public static final int TEMPORARY_NOTIFICATION_ID = 2001; + + private final Context mContext; + private final NotificationManager mNotificationManager; + + public NotificationHelper(Context context) { + mContext = context; + mNotificationManager = context.getSystemService(NotificationManager.class); + createNotificationChannels(); + } + + @RequiresApi(api = Build.VERSION_CODES.O) + private void createNotificationChannels() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + createForegroundChannel(); + createTemporaryChannel(); + } + } + + @RequiresApi(api = Build.VERSION_CODES.O) + private void createForegroundChannel() { + NotificationChannel channel = new NotificationChannel( + CHANNEL_ID_FOREGROUND, + CHANNEL_NAME_FOREGROUND, + NotificationManager.IMPORTANCE_LOW + ); + channel.setDescription("Persistent service notifications"); + channel.setSound(null, null); + channel.enableVibration(false); + mNotificationManager.createNotificationChannel(channel); + } + + @RequiresApi(api = Build.VERSION_CODES.O) + private void createTemporaryChannel() { + NotificationChannel channel = new NotificationChannel( + CHANNEL_ID_TEMPORARY, + CHANNEL_NAME_TEMPORARY, + NotificationManager.IMPORTANCE_HIGH + ); + channel.setDescription("Temporary alert notifications"); + channel.setSound(null, null); + channel.enableVibration(true); + channel.setVibrationPattern(new long[]{100, 200, 300, 400}); + channel.setBypassDnd(true); + mNotificationManager.createNotificationChannel(channel); + } + + // 显示常驻通知(通常用于前台服务) + public Notification showForegroundNotification(Intent intent, String title, String content) { + PendingIntent pendingIntent = createPendingIntent(intent); + + Notification notification = new NotificationCompat.Builder(mContext, CHANNEL_ID_FOREGROUND) + .setSmallIcon(R.drawable.ic_launcher) + .setLargeIcon(BitmapFactory.decodeResource(mContext.getResources(), R.drawable.ic_launcher)) + .setContentTitle(title) + .setContentText(content) + .setContentIntent(pendingIntent) + .setPriority(NotificationCompat.PRIORITY_LOW) + .setOngoing(true) + .build(); + + mNotificationManager.notify(FOREGROUND_NOTIFICATION_ID, notification); + return notification; + } + + // 显示临时通知(自动消失) + public void showTemporaryNotification(Intent intent, String title, String content) { + PendingIntent pendingIntent = createPendingIntent(intent); + + Notification notification = new NotificationCompat.Builder(mContext, CHANNEL_ID_TEMPORARY) + .setSmallIcon(R.drawable.ic_launcher) + .setLargeIcon(BitmapFactory.decodeResource(mContext.getResources(), R.drawable.ic_launcher)) + .setContentTitle(title) + .setContentText(content) + .setContentIntent(pendingIntent) + .setPriority(NotificationCompat.PRIORITY_HIGH) + .setAutoCancel(true) + .setVibrate(new long[]{100, 200, 300, 400}) + .build(); + + mNotificationManager.notify(TEMPORARY_NOTIFICATION_ID, notification); + } + + // 创建自定义布局通知(可扩展) + public void showCustomNotification(Intent intent, RemoteViews contentView, RemoteViews bigContentView) { + PendingIntent pendingIntent = createPendingIntent(intent); + + Notification notification = new NotificationCompat.Builder(mContext, CHANNEL_ID_TEMPORARY) + .setSmallIcon(R.drawable.ic_launcher) + .setContentIntent(pendingIntent) + .setContent(contentView) + .setCustomBigContentView(bigContentView) + .setPriority(NotificationCompat.PRIORITY_HIGH) + .setAutoCancel(true) + .build(); + + mNotificationManager.notify(TEMPORARY_NOTIFICATION_ID + 1, notification); + } + + // 取消所有通知 + public void cancelAllNotifications() { + mNotificationManager.cancelAll(); + } + + // 创建PendingIntent(兼容不同API版本) + private PendingIntent createPendingIntent(Intent intent) { + int flags = PendingIntent.FLAG_UPDATE_CURRENT; +// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { +// flags |= PendingIntent.FLAG_IMMUTABLE; +// } + return PendingIntent.getActivity( + mContext, + 0, + intent, + flags + ); + } + + public void sendSMSReceivedMessage(int nResultId, String szPhone, String szBody) { + Intent intent = new Intent(mContext, SMSActivity.class); + intent.putExtra(SMSActivity.EXTRA_PHONE, szPhone); + String szTitle = mContext.getString(R.string.text_smsfrom) + "<" + szPhone + ">"; + String szContent = "[ " + szBody + " ]"; + showTemporaryNotification(intent, szTitle, szContent); + } +} diff --git a/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/NotificationUtil.java b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/NotificationUtil_Bck.java similarity index 99% rename from mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/NotificationUtil.java rename to mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/NotificationUtil_Bck.java index 802fb9c..730af52 100644 --- a/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/NotificationUtil.java +++ b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/NotificationUtil_Bck.java @@ -22,7 +22,7 @@ import cc.winboll.studio.mymessagemanager.activitys.SMSActivity; import cc.winboll.studio.mymessagemanager.beans.MessageNotificationBean; import cc.winboll.studio.mymessagemanager.services.MainService; -public class NotificationUtil { +public class NotificationUtil_Bck { public static final String TAG = "NotificationUtil"; public static final int ID_MSG_SERVICE = 10000;