重构通知栏消息,添加铃声。
This commit is contained in:
		
							
								
								
									
										10
									
								
								build.gradle
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								build.gradle
									
									
									
									
									
								
							@@ -1,11 +1,6 @@
 | 
				
			|||||||
// Top-level build file where you can add configuration options common to all sub-projects/modules.
 | 
					// Top-level build file where you can add configuration options common to all sub-projects/modules.
 | 
				
			||||||
buildscript {
 | 
					buildscript {
 | 
				
			||||||
    repositories {
 | 
					    repositories {
 | 
				
			||||||
        // 本地 Maven 仓库(默认路径为 ~/.m2/repository)
 | 
					 | 
				
			||||||
        //mavenLocal()
 | 
					 | 
				
			||||||
        // 或自定义本地仓库路径
 | 
					 | 
				
			||||||
        maven { url "file:///sdcard/.m2/repository" }
 | 
					 | 
				
			||||||
        
 | 
					 | 
				
			||||||
        // Nexus Maven 库地址
 | 
					        // Nexus Maven 库地址
 | 
				
			||||||
        // "WinBoLL Release"
 | 
					        // "WinBoLL Release"
 | 
				
			||||||
        maven { url "https://nexus.winboll.cc/repository/maven-public/" }
 | 
					        maven { url "https://nexus.winboll.cc/repository/maven-public/" }
 | 
				
			||||||
@@ -31,11 +26,6 @@ buildscript {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
allprojects {
 | 
					allprojects {
 | 
				
			||||||
    repositories {
 | 
					    repositories {
 | 
				
			||||||
        // 本地 Maven 仓库(默认路径为 ~/.m2/repository)
 | 
					 | 
				
			||||||
        //mavenLocal()
 | 
					 | 
				
			||||||
        // 或自定义本地仓库路径
 | 
					 | 
				
			||||||
        maven { url "file:///sdcard/.m2/repository" }
 | 
					 | 
				
			||||||
        
 | 
					 | 
				
			||||||
        // Nexus Maven 库地址
 | 
					        // Nexus Maven 库地址
 | 
				
			||||||
        // "WinBoLL Release"
 | 
					        // "WinBoLL Release"
 | 
				
			||||||
        maven { url "https://nexus.winboll.cc/repository/maven-public/" }
 | 
					        maven { url "https://nexus.winboll.cc/repository/maven-public/" }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -24,7 +24,7 @@ android {
 | 
				
			|||||||
    defaultConfig {
 | 
					    defaultConfig {
 | 
				
			||||||
        applicationId "cc.winboll.studio.timestamp"
 | 
					        applicationId "cc.winboll.studio.timestamp"
 | 
				
			||||||
        minSdkVersion 24
 | 
					        minSdkVersion 24
 | 
				
			||||||
        targetSdkVersion 30
 | 
					        targetSdkVersion 29
 | 
				
			||||||
        versionCode 1
 | 
					        versionCode 1
 | 
				
			||||||
        // versionName 更新后需要手动设置 
 | 
					        // versionName 更新后需要手动设置 
 | 
				
			||||||
        // .winboll/winbollBuildProps.properties 文件的 stageCount=0
 | 
					        // .winboll/winbollBuildProps.properties 文件的 stageCount=0
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,8 +1,8 @@
 | 
				
			|||||||
#Created by .winboll/winboll_app_build.gradle
 | 
					#Created by .winboll/winboll_app_build.gradle
 | 
				
			||||||
#Tue May 06 20:37:48 HKT 2025
 | 
					#Tue May 06 18:34:42 GMT 2025
 | 
				
			||||||
stageCount=7
 | 
					stageCount=7
 | 
				
			||||||
libraryProject=
 | 
					libraryProject=
 | 
				
			||||||
baseVersion=15.0
 | 
					baseVersion=15.0
 | 
				
			||||||
publishVersion=15.0.6
 | 
					publishVersion=15.0.6
 | 
				
			||||||
buildCount=0
 | 
					buildCount=7
 | 
				
			||||||
baseBetaVersion=15.0.7
 | 
					baseBetaVersion=15.0.7
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -26,7 +26,6 @@ import cc.winboll.studio.timestamp.receivers.ButtonClickReceiver;
 | 
				
			|||||||
import cc.winboll.studio.timestamp.utils.AppConfigsUtil;
 | 
					import cc.winboll.studio.timestamp.utils.AppConfigsUtil;
 | 
				
			||||||
import cc.winboll.studio.timestamp.utils.NotificationHelper;
 | 
					import cc.winboll.studio.timestamp.utils.NotificationHelper;
 | 
				
			||||||
import cc.winboll.studio.timestamp.utils.ServiceUtil;
 | 
					import cc.winboll.studio.timestamp.utils.ServiceUtil;
 | 
				
			||||||
import cc.winboll.studio.timestamp.utils.TimeStampRemoteViewsUtil;
 | 
					 | 
				
			||||||
import java.time.Instant;
 | 
					import java.time.Instant;
 | 
				
			||||||
import java.time.LocalDateTime;
 | 
					import java.time.LocalDateTime;
 | 
				
			||||||
import java.time.ZoneId;
 | 
					import java.time.ZoneId;
 | 
				
			||||||
@@ -59,9 +58,8 @@ public class MainService extends Service {
 | 
				
			|||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public void onCreate() {
 | 
					    public void onCreate() {
 | 
				
			||||||
        super.onCreate();
 | 
					        super.onCreate();
 | 
				
			||||||
        // 创建 RemoteViews 对象,并使用包含自定义 View 的布局
 | 
					        mNotificationHelper = new NotificationHelper();
 | 
				
			||||||
        //mRemoteViews = new RemoteViews(getPackageName(), R.layout.remoteviews_timestamp);
 | 
					        mNotificationHelper.createServiceNotificationChannel(this);
 | 
				
			||||||
 | 
					 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        // 创建广播接收器实例
 | 
					        // 创建广播接收器实例
 | 
				
			||||||
        mButtonClickReceiver = new ButtonClickReceiver();
 | 
					        mButtonClickReceiver = new ButtonClickReceiver();
 | 
				
			||||||
@@ -219,7 +217,7 @@ 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("时间戳:\n" + formattedDateTime + "\n已拷贝到剪贴板。");
 | 
					                        mNotificationHelper.sendForegroundNotification(MainService.this, "时间戳:\n" + formattedDateTime + "\n已拷贝到剪贴板。");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                        LogUtils.d(TAG, "Hello, World! " + formattedDateTime);
 | 
					                        LogUtils.d(TAG, "Hello, World! " + formattedDateTime);
 | 
				
			||||||
                        break;
 | 
					                        break;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -0,0 +1,69 @@
 | 
				
			|||||||
 | 
					package cc.winboll.studio.timestamp.utils;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @Author ZhanGSKen
 | 
				
			||||||
 | 
					 * @Date 2025/05/07 02:31
 | 
				
			||||||
 | 
					 * @Describe AudioPlayerUtil
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					import android.content.Context;
 | 
				
			||||||
 | 
					import android.media.MediaPlayer;
 | 
				
			||||||
 | 
					import android.net.Uri;
 | 
				
			||||||
 | 
					import android.util.Log;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class AudioPlayerUtil {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static final String TAG = "AudioPlayerUtil";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private static MediaPlayer mediaPlayer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 播放指定Uri的音频
 | 
				
			||||||
 | 
					     * @param context 上下文
 | 
				
			||||||
 | 
					     * @param audioUri 音频的Uri
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public static void playAudio(Context context, Uri audioUri) {
 | 
				
			||||||
 | 
					        if (mediaPlayer != null && mediaPlayer.isPlaying()) {
 | 
				
			||||||
 | 
					            mediaPlayer.stop();
 | 
				
			||||||
 | 
					            mediaPlayer.release();
 | 
				
			||||||
 | 
					            mediaPlayer = null;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            mediaPlayer = new MediaPlayer();
 | 
				
			||||||
 | 
					            mediaPlayer.setDataSource(context, audioUri);
 | 
				
			||||||
 | 
					            mediaPlayer.prepare();
 | 
				
			||||||
 | 
					            mediaPlayer.start();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
 | 
				
			||||||
 | 
					                    @Override
 | 
				
			||||||
 | 
					                    public void onCompletion(MediaPlayer mp) {
 | 
				
			||||||
 | 
					                        releaseMediaPlayer();
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
 | 
				
			||||||
 | 
					                    @Override
 | 
				
			||||||
 | 
					                    public boolean onError(MediaPlayer mp, int what, int extra) {
 | 
				
			||||||
 | 
					                        Log.e("AudioPlayer", "播放音频时出错: what=" + what + ", extra=" + extra);
 | 
				
			||||||
 | 
					                        releaseMediaPlayer();
 | 
				
			||||||
 | 
					                        return true;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                });
 | 
				
			||||||
 | 
					        } catch (Exception e) {
 | 
				
			||||||
 | 
					            e.printStackTrace();
 | 
				
			||||||
 | 
					            releaseMediaPlayer();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 释放MediaPlayer资源
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private static void releaseMediaPlayer() {
 | 
				
			||||||
 | 
					        if (mediaPlayer != null) {
 | 
				
			||||||
 | 
					            mediaPlayer.stop();
 | 
				
			||||||
 | 
					            mediaPlayer.release();
 | 
				
			||||||
 | 
					            mediaPlayer = null;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -12,212 +12,184 @@ import android.app.PendingIntent;
 | 
				
			|||||||
import android.content.Context;
 | 
					import android.content.Context;
 | 
				
			||||||
import android.content.Intent;
 | 
					import android.content.Intent;
 | 
				
			||||||
import android.graphics.BitmapFactory;
 | 
					import android.graphics.BitmapFactory;
 | 
				
			||||||
import android.os.Build;
 | 
					import android.graphics.Color;
 | 
				
			||||||
 | 
					import android.media.RingtoneManager;
 | 
				
			||||||
 | 
					import android.net.Uri;
 | 
				
			||||||
import android.widget.RemoteViews;
 | 
					import android.widget.RemoteViews;
 | 
				
			||||||
import androidx.annotation.RequiresApi;
 | 
					import cc.winboll.studio.timestamp.MainActivity;
 | 
				
			||||||
import androidx.core.app.NotificationCompat;
 | 
					import cc.winboll.studio.timestamp.MainService;
 | 
				
			||||||
import cc.winboll.studio.libappbase.LogUtils;
 | 
					 | 
				
			||||||
import cc.winboll.studio.timestamp.R;
 | 
					import cc.winboll.studio.timestamp.R;
 | 
				
			||||||
import java.util.HashMap;
 | 
					import cc.winboll.studio.timestamp.receivers.ButtonClickReceiver;
 | 
				
			||||||
import java.util.List;
 | 
					 | 
				
			||||||
import java.util.Map;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
public class NotificationHelper {
 | 
					public class NotificationHelper {
 | 
				
			||||||
    public static final String TAG = "NotificationHelper";
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // 渠道ID和名称
 | 
					    public static final String TAG = "NotificationUtil";
 | 
				
			||||||
    private static final String CHANNEL_ID_FOREGROUND = "foreground_channel";
 | 
					    public static final int ID_MSG_SERVICE = 10000;
 | 
				
			||||||
    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
 | 
					    static final String szSMSChannelID = "1";
 | 
				
			||||||
    public static final int FOREGROUND_NOTIFICATION_ID = 1001;
 | 
					 | 
				
			||||||
    public static final int TEMPORARY_NOTIFICATION_ID = 2001;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private final Context mContext;
 | 
					    static final String szServiceChannelID = "0";
 | 
				
			||||||
    private final NotificationManager mNotificationManager;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // 示例:维护当前使用的渠道ID列表
 | 
					 | 
				
			||||||
    // 键:渠道ID,值:渠道重要性级别
 | 
					 | 
				
			||||||
    Map<String, Integer> activeChannelConfigs = new HashMap<>();
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public NotificationHelper(Context context) {
 | 
					    //static int mNumSendForegroundNotification = 10000;
 | 
				
			||||||
 | 
					    //static int mNumSendSMSNotification = 20000;
 | 
				
			||||||
 | 
					    Context mContext;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public NotificationManager createServiceNotificationChannel(Context context) {
 | 
				
			||||||
        mContext = context;
 | 
					        mContext = context;
 | 
				
			||||||
        mNotificationManager = context.getSystemService(NotificationManager.class);
 | 
					        //创建通知渠道ID
 | 
				
			||||||
 | 
					        String channelId = szServiceChannelID;
 | 
				
			||||||
        // 初始化配置
 | 
					        //创建通知渠道名称
 | 
				
			||||||
        activeChannelConfigs.put(
 | 
					        String channelName = "Service Message";
 | 
				
			||||||
            CHANNEL_ID_FOREGROUND,
 | 
					        //创建通知渠道重要性
 | 
				
			||||||
            NotificationManager.IMPORTANCE_HIGH
 | 
					        int importance = NotificationManager.IMPORTANCE_MIN;
 | 
				
			||||||
        );
 | 
					        NotificationChannel channel = new NotificationChannel(channelId, channelName, importance);
 | 
				
			||||||
        activeChannelConfigs.put(
 | 
					 | 
				
			||||||
            CHANNEL_ID_TEMPORARY,
 | 
					 | 
				
			||||||
            NotificationManager.IMPORTANCE_DEFAULT
 | 
					 | 
				
			||||||
        );
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        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.setSound(null, null);
 | 
				
			||||||
        channel.enableVibration(false);
 | 
					        NotificationManager notificationManager = (NotificationManager) context.getSystemService(
 | 
				
			||||||
        mNotificationManager.createNotificationChannel(channel);
 | 
					            Context.NOTIFICATION_SERVICE);
 | 
				
			||||||
 | 
					        notificationManager.createNotificationChannel(channel);
 | 
				
			||||||
 | 
					        return notificationManager;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @RequiresApi(api = Build.VERSION_CODES.O)
 | 
					    public NotificationManager createSMSNotificationChannel(Context context) {
 | 
				
			||||||
    private void createTemporaryChannel() {
 | 
					        //创建通知渠道ID
 | 
				
			||||||
        NotificationChannel channel = new NotificationChannel(
 | 
					        String channelId = szSMSChannelID;
 | 
				
			||||||
            CHANNEL_ID_TEMPORARY,
 | 
					        //创建通知渠道名称
 | 
				
			||||||
            CHANNEL_NAME_TEMPORARY,
 | 
					        String channelName = "SMS Message";
 | 
				
			||||||
            NotificationManager.IMPORTANCE_HIGH
 | 
					        //创建通知渠道重要性
 | 
				
			||||||
        );
 | 
					        int importance = NotificationManager.IMPORTANCE_HIGH;
 | 
				
			||||||
        channel.setDescription("Temporary alert notifications");
 | 
					        NotificationChannel channel = new NotificationChannel(channelId, channelName, importance);
 | 
				
			||||||
        channel.setSound(null, null);
 | 
					        channel.setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE), Notification.AUDIO_ATTRIBUTES_DEFAULT);
 | 
				
			||||||
        channel.enableVibration(true);
 | 
					        NotificationManager notificationManager = (NotificationManager) context.getSystemService(
 | 
				
			||||||
        channel.setVibrationPattern(new long[]{100, 200, 300, 400});
 | 
					            Context.NOTIFICATION_SERVICE);
 | 
				
			||||||
        channel.setBypassDnd(true);
 | 
					        notificationManager.createNotificationChannel(channel);
 | 
				
			||||||
        mNotificationManager.createNotificationChannel(channel);
 | 
					        return notificationManager;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // 显示常驻通知(通常用于前台服务)
 | 
					    // 创建通知
 | 
				
			||||||
    public Notification showForegroundNotification(Intent intent, String title, String content) {
 | 
					    //
 | 
				
			||||||
        PendingIntent pendingIntent = createPendingIntent(intent);
 | 
					    public void sendForegroundNotification(MainService service, String message) {
 | 
				
			||||||
 | 
					        //创建Notification,传入Context和channelId
 | 
				
			||||||
 | 
					        Intent intent = new Intent();//这个intent会传给目标,可以使用getIntent来获取
 | 
				
			||||||
 | 
					        intent.setClass(mContext, MainActivity.class);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        Notification notification = new NotificationCompat.Builder(mContext, CHANNEL_ID_FOREGROUND)
 | 
					        //这里放一个count用来区分每一个通知
 | 
				
			||||||
            .setSmallIcon(R.drawable.ic_launcher)
 | 
					        //intent.putExtra("intent", "intent--->" + count);//这里设置一个数据,带过去
 | 
				
			||||||
            .setLargeIcon(BitmapFactory.decodeResource(mContext.getResources(), R.drawable.ic_launcher))
 | 
					 | 
				
			||||||
            //.setContentTitle(title)
 | 
					 | 
				
			||||||
            .setContentTitle(content)
 | 
					 | 
				
			||||||
            //.setContentText(content)
 | 
					 | 
				
			||||||
            .setContentIntent(pendingIntent)
 | 
					 | 
				
			||||||
            .setPriority(NotificationCompat.PRIORITY_LOW)
 | 
					 | 
				
			||||||
            .setOngoing(true)
 | 
					 | 
				
			||||||
            .build();
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        mNotificationManager.notify(FOREGROUND_NOTIFICATION_ID, notification);
 | 
					        //参数1:context 上下文对象
 | 
				
			||||||
        return notification;
 | 
					        //参数2:发送者私有的请求码(Private request code for the sender)
 | 
				
			||||||
    }
 | 
					        //参数3:intent 意图对象
 | 
				
			||||||
 | 
					        //参数4:必须为FLAG_ONE_SHOT,FLAG_NO_CREATE,FLAG_CANCEL_CURRENT,FLAG_UPDATE_CURRENT,中的一个
 | 
				
			||||||
 | 
					        PendingIntent mForegroundPendingIntent = PendingIntent.getActivity(service, ID_MSG_SERVICE, intent, PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_CANCEL_CURRENT);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Notification mForegroundNotification = new Notification.Builder(service, szServiceChannelID)
 | 
				
			||||||
    // 显示常驻通知(通常用于前台服务)
 | 
					 | 
				
			||||||
    public Notification showCustomForegroundNotification(Intent intent, RemoteViews contentView, RemoteViews bigContentView) {
 | 
					 | 
				
			||||||
        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)
 | 
					 | 
				
			||||||
            .setContentIntent(pendingIntent)
 | 
					 | 
				
			||||||
            .setContent(contentView)
 | 
					 | 
				
			||||||
            .setCustomBigContentView(bigContentView)
 | 
					 | 
				
			||||||
            .setPriority(NotificationCompat.PRIORITY_HIGH)
 | 
					 | 
				
			||||||
            .setAutoCancel(true)
 | 
					            .setAutoCancel(true)
 | 
				
			||||||
            .setOngoing(true)
 | 
					            //.setContentTitle(nessageNotificationBean.getTitle())
 | 
				
			||||||
            .build();
 | 
					            //.setContentText(nessageNotificationBean.getContent())
 | 
				
			||||||
 | 
					            //.setContent(remoteviews)
 | 
				
			||||||
        mNotificationManager.notify(FOREGROUND_NOTIFICATION_ID, notification);
 | 
					            .setWhen(System.currentTimeMillis())
 | 
				
			||||||
        return notification;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // 显示临时通知(自动消失)
 | 
					 | 
				
			||||||
    public void showTemporaryNotification(Intent intent, String title, String content) {
 | 
					 | 
				
			||||||
        showTemporaryNotification(intent, TEMPORARY_NOTIFICATION_ID, title, content);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // 显示临时通知(自动消失)
 | 
					 | 
				
			||||||
    public void showTemporaryNotification(Intent intent, int notificationID, String title, String content) {
 | 
					 | 
				
			||||||
        PendingIntent pendingIntent = createPendingIntent(intent);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        Notification notification = new NotificationCompat.Builder(mContext, CHANNEL_ID_TEMPORARY)
 | 
					 | 
				
			||||||
            .setSmallIcon(R.drawable.ic_launcher)
 | 
					            .setSmallIcon(R.drawable.ic_launcher)
 | 
				
			||||||
            .setLargeIcon(BitmapFactory.decodeResource(mContext.getResources(), R.drawable.ic_launcher))
 | 
					            //设置红色
 | 
				
			||||||
            .setContentTitle(title)
 | 
					            .setColor(Color.parseColor("#F00606"))
 | 
				
			||||||
            .setContentText(content)
 | 
					            .setLargeIcon(BitmapFactory.decodeResource(service.getResources(), R.drawable.ic_launcher))
 | 
				
			||||||
            .setContentIntent(pendingIntent)
 | 
					            .setContentIntent(mForegroundPendingIntent)
 | 
				
			||||||
            .setPriority(NotificationCompat.PRIORITY_HIGH)
 | 
					 | 
				
			||||||
            .setAutoCancel(true)
 | 
					 | 
				
			||||||
            .setVibrate(new long[]{100, 200, 300, 400})
 | 
					 | 
				
			||||||
            .build();
 | 
					            .build();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        mNotificationManager.notify(notificationID, notification);
 | 
					        // 创建 RemoteViews 对象,加载布局
 | 
				
			||||||
    }
 | 
					        RemoteViews remoteViews = new RemoteViews(mContext.getPackageName(), R.layout.custom_notification_layout);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // 创建自定义布局通知(可扩展)
 | 
					        // 自定义 TextView 的文本
 | 
				
			||||||
    public void showCustomNotification(Intent intent, RemoteViews contentView, RemoteViews bigContentView) {
 | 
					        remoteViews.setTextViewText(R.id.tv_timestamp, message);
 | 
				
			||||||
        PendingIntent pendingIntent = createPendingIntent(intent);
 | 
					        // 自定义 TextView 的文本颜色
 | 
				
			||||||
 | 
					        remoteViews.setTextColor(R.id.tv_timestamp, mContext.getResources().getColor(R.color.colorAccent, null));
 | 
				
			||||||
 | 
					        // 这里虽然不能直接设置字体大小,但可以通过反射等方式尝试(不推荐,且有兼容性问题)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        Notification notification = new NotificationCompat.Builder(mContext, CHANNEL_ID_TEMPORARY)
 | 
					        // 创建点击通知后的意图
 | 
				
			||||||
            .setSmallIcon(R.drawable.ic_launcher)
 | 
					        Intent intentMain = new Intent(mContext, MainActivity.class);
 | 
				
			||||||
            .setContentIntent(pendingIntent)
 | 
					        PendingIntent pendingMainIntent = PendingIntent.getActivity(mContext, 0, intentMain, PendingIntent.FLAG_UPDATE_CURRENT);
 | 
				
			||||||
            .setContent(contentView)
 | 
					        // 设置通知的点击事件
 | 
				
			||||||
            .setCustomBigContentView(bigContentView)
 | 
					        remoteViews.setOnClickPendingIntent(R.id.tv_timestamp, pendingMainIntent);
 | 
				
			||||||
            .setPriority(NotificationCompat.PRIORITY_HIGH)
 | 
					 | 
				
			||||||
            .setAutoCancel(true)
 | 
					 | 
				
			||||||
            .build();
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        mNotificationManager.notify(TEMPORARY_NOTIFICATION_ID + 1, notification);
 | 
					        // 创建点击按钮后要发送的广播 Intent
 | 
				
			||||||
    }
 | 
					        Intent broadcastIntent = new Intent(ButtonClickReceiver.BUTTON_COPYTIMESTAMP_ACTION);
 | 
				
			||||||
 | 
					        android.app.PendingIntent pendingIntent = android.app.PendingIntent.getBroadcast(
 | 
				
			||||||
    // 取消所有通知
 | 
					 | 
				
			||||||
    public void cancelAllNotifications() {
 | 
					 | 
				
			||||||
        mNotificationManager.cancelAll();
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // 取消指定通知
 | 
					 | 
				
			||||||
    public void cancelNotification(int notificationID) {
 | 
					 | 
				
			||||||
        mNotificationManager.cancel(notificationID);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // 创建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,
 | 
					            mContext,
 | 
				
			||||||
            0,
 | 
					            0,
 | 
				
			||||||
            intent,
 | 
					            broadcastIntent,
 | 
				
			||||||
            flags
 | 
					            android.app.PendingIntent.FLAG_UPDATE_CURRENT
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // 为按钮设置点击事件
 | 
				
			||||||
 | 
					        remoteViews.setOnClickPendingIntent(R.id.btn_copytimestamp, pendingIntent);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        mForegroundNotification.contentView = remoteViews;
 | 
				
			||||||
 | 
					        mForegroundNotification.bigContentView = remoteViews;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        service.startForeground(ID_MSG_SERVICE, mForegroundNotification);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Uri defaultSmsRingtoneUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
 | 
				
			||||||
 | 
					        AudioPlayerUtil.playAudio(service, defaultSmsRingtoneUri);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//    public void sendSMSReceivedMessage(int notificationID, String szPhone, String szBody) {
 | 
					//    public void sendSMSNotification(Context context, MessageNotificationBean messageNotificationBean) {
 | 
				
			||||||
//        Intent intent = new Intent(mContext, SMSActivity.class);
 | 
					//        NotificationManager notificationManager = (NotificationManager) context.getSystemService(
 | 
				
			||||||
//        intent.putExtra(SMSActivity.EXTRA_PHONE, szPhone);
 | 
					//            Context.NOTIFICATION_SERVICE);
 | 
				
			||||||
//        String szTitle = mContext.getString(R.string.text_smsfrom)  + "<" + szPhone + ">";
 | 
					//        /*NotificationManager notificationManager = createSMSNotificationChannel(context);
 | 
				
			||||||
//        String szContent = "[ " + szBody + " ]";
 | 
					//         if (notificationManager == null) {
 | 
				
			||||||
//        showTemporaryNotification(intent, notificationID, szTitle, szContent);
 | 
					//         LogUtils.d(TAG, "createSMSNotificationChannel failed.");
 | 
				
			||||||
 | 
					//         return;
 | 
				
			||||||
 | 
					//         }*/
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					//        //创建Notification,传入Context和channelId
 | 
				
			||||||
 | 
					//        Intent intent = new Intent(context, SMSActivity.class);
 | 
				
			||||||
 | 
					//        intent.putExtra(SMSActivity.EXTRA_PHONE, messageNotificationBean.getPhone());
 | 
				
			||||||
 | 
					//        LogUtils.d(TAG, "sendSMSNotification(...) message.getPhone() is : " + messageNotificationBean.getPhone());
 | 
				
			||||||
 | 
					//        //Intent intent = new Intent();//这个intent会传给目标,可以使用getIntent来获取
 | 
				
			||||||
 | 
					//        //intent.setClass(context, MainActivity.class);
 | 
				
			||||||
 | 
					//        //这里放一个count用来区分每一个通知
 | 
				
			||||||
 | 
					//        //intent.putExtra("intent", "intent--->" + count);//这里设置一个数据,带过去
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					//        //参数1:context 上下文对象
 | 
				
			||||||
 | 
					//        //参数2:发送者私有的请求码(Private request code for the sender)
 | 
				
			||||||
 | 
					//        //参数3:intent 意图对象
 | 
				
			||||||
 | 
					//        //参数4:必须为FLAG_ONE_SHOT,FLAG_NO_CREATE,FLAG_CANCEL_CURRENT,FLAG_UPDATE_CURRENT,中的一个
 | 
				
			||||||
 | 
					//        PendingIntent mRemindPendingIntent = PendingIntent.getActivity(context, messageNotificationBean.getMessageId(), intent, PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_CANCEL_CURRENT);
 | 
				
			||||||
 | 
					//        Notification mSMSNotification = new Notification.Builder(context, szSMSChannelID)
 | 
				
			||||||
 | 
					//            .setAutoCancel(true)
 | 
				
			||||||
 | 
					//            .setContentTitle(messageNotificationBean.getTitle())
 | 
				
			||||||
 | 
					//            .setContentText(messageNotificationBean.getContent())
 | 
				
			||||||
 | 
					//            .setWhen(System.currentTimeMillis())
 | 
				
			||||||
 | 
					//            .setSmallIcon(R.drawable.ic_launcher)
 | 
				
			||||||
 | 
					//            //设置红色
 | 
				
			||||||
 | 
					//            .setColor(Color.parseColor("#F00606"))
 | 
				
			||||||
 | 
					//            .setLargeIcon(BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_launcher))
 | 
				
			||||||
 | 
					//            .setContentIntent(mRemindPendingIntent)
 | 
				
			||||||
 | 
					//            .build();
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					//        RemoteViews mrvSMSNotificationView = new RemoteViews(context.getPackageName(), R.layout.remoteview);
 | 
				
			||||||
 | 
					//        mrvSMSNotificationView.setTextViewText(R.id.remoteviewTextView1, messageNotificationBean.getTitle());
 | 
				
			||||||
 | 
					//        mrvSMSNotificationView.setTextViewText(R.id.remoteviewTextView2, messageNotificationBean.getContent());
 | 
				
			||||||
 | 
					//        mrvSMSNotificationView.setImageViewResource(R.id.remoteviewImageView1, R.drawable.ic_launcher);
 | 
				
			||||||
 | 
					//        mSMSNotification.contentView = mrvSMSNotificationView;
 | 
				
			||||||
 | 
					//        mSMSNotification.bigContentView = mrvSMSNotificationView;
 | 
				
			||||||
 | 
					//        notificationManager.notify(messageNotificationBean.getMessageId(), mSMSNotification);
 | 
				
			||||||
 | 
					//        LogUtils.d(TAG, "getMessageId is : " + Integer.toString(messageNotificationBean.getMessageId()));
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
//    }
 | 
					//    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public void cleanOldChannels() {
 | 
					//    public void sendSMSReceivedMessage(Context context, int nMessageId, String szPhone, String szBody) {
 | 
				
			||||||
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
 | 
					//        String szTitle = context.getString(R.string.text_smsfrom)  + "<" + szPhone + ">";
 | 
				
			||||||
            List<NotificationChannel> allChannels = mNotificationManager.getNotificationChannels();
 | 
					//        String szContent = "[ " + szBody + " ]";
 | 
				
			||||||
            for (NotificationChannel channel : allChannels) {
 | 
					//        sendSMSNotification(context, new MessageNotificationBean(nMessageId, szPhone, szTitle, szContent));
 | 
				
			||||||
                LogUtils.d(TAG, "Clean channel : " + channel.getId());
 | 
					//    }
 | 
				
			||||||
                if (!activeChannelConfigs.containsKey(channel.getId())) {
 | 
					
 | 
				
			||||||
                    // 安全删除渠道
 | 
					//    public static void cancelNotification(Context context, int notificationId) {
 | 
				
			||||||
                    mNotificationManager.deleteNotificationChannel(channel.getId());
 | 
					//        // 获取 NotificationManager 实例
 | 
				
			||||||
                    LogUtils.d(TAG, String.format("Deleted Channel %s", channel.getId()));
 | 
					//        NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
 | 
				
			||||||
                }
 | 
					//        // 撤回指定 ID 的通知栏消息
 | 
				
			||||||
            }
 | 
					//        notificationManager.cancel(notificationId);
 | 
				
			||||||
        }
 | 
					//    }
 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,132 +0,0 @@
 | 
				
			|||||||
package cc.winboll.studio.timestamp.utils;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * @Author ZhanGSKen
 | 
					 | 
				
			||||||
 * @Date 2025/05/05 21:10
 | 
					 | 
				
			||||||
 * @Describe TimeStampRemoteViewsUtil
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import android.app.PendingIntent;
 | 
					 | 
				
			||||||
import android.content.Context;
 | 
					 | 
				
			||||||
import android.content.Intent;
 | 
					 | 
				
			||||||
import android.widget.RemoteViews;
 | 
					 | 
				
			||||||
import cc.winboll.studio.timestamp.MainActivity;
 | 
					 | 
				
			||||||
import cc.winboll.studio.timestamp.R;
 | 
					 | 
				
			||||||
import cc.winboll.studio.timestamp.receivers.ButtonClickReceiver;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public class TimeStampRemoteViewsUtil {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public static final String TAG = "TimeStampRemoteViewsUtil";
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public static final String CHANNEL_ID = "TimeStampChannel";
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    static volatile TimeStampRemoteViewsUtil _TimeStampRemoteViewsUtil;
 | 
					 | 
				
			||||||
    Context mContext;
 | 
					 | 
				
			||||||
    NotificationHelper mNotificationHelper;
 | 
					 | 
				
			||||||
    RemoteViews mRemoteViews;
 | 
					 | 
				
			||||||
    Intent mIntentMain;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    TimeStampRemoteViewsUtil(Context context) {
 | 
					 | 
				
			||||||
        mContext = context;
 | 
					 | 
				
			||||||
        mNotificationHelper = new NotificationHelper(context);
 | 
					 | 
				
			||||||
        //createNotificationChannel();
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public static synchronized TimeStampRemoteViewsUtil getInstance(Context context) {
 | 
					 | 
				
			||||||
        if (_TimeStampRemoteViewsUtil == null) {
 | 
					 | 
				
			||||||
            _TimeStampRemoteViewsUtil = new TimeStampRemoteViewsUtil(context);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        return _TimeStampRemoteViewsUtil;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//    private void createNotificationChannel() {
 | 
					 | 
				
			||||||
//        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
 | 
					 | 
				
			||||||
//            CharSequence name = "自定义视图通知通道";
 | 
					 | 
				
			||||||
//            String description = "用于展示自定义视图的通知通道";
 | 
					 | 
				
			||||||
//            int importance = NotificationManager.IMPORTANCE_HIGH;
 | 
					 | 
				
			||||||
//            NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance);
 | 
					 | 
				
			||||||
//            channel.setDescription(description);
 | 
					 | 
				
			||||||
//            NotificationManager notificationManager = mContext.getSystemService(NotificationManager.class);
 | 
					 | 
				
			||||||
//            notificationManager.createNotificationChannel(channel);
 | 
					 | 
				
			||||||
//        }
 | 
					 | 
				
			||||||
//    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//    public void showNotification(String msg) {
 | 
					 | 
				
			||||||
//        if (mRemoteViews == null) {
 | 
					 | 
				
			||||||
//            // 创建 RemoteViews 对象,加载布局
 | 
					 | 
				
			||||||
//            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));
 | 
					 | 
				
			||||||
//        // 这里虽然不能直接设置字体大小,但可以通过反射等方式尝试(不推荐,且有兼容性问题)
 | 
					 | 
				
			||||||
//        
 | 
					 | 
				
			||||||
//        // 创建点击通知后的意图
 | 
					 | 
				
			||||||
//        Intent intent = new Intent(mContext, MainActivity.class);
 | 
					 | 
				
			||||||
//        PendingIntent pendingMainIntent = PendingIntent.getActivity(mContext, 0, intent, 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);
 | 
					 | 
				
			||||||
//        
 | 
					 | 
				
			||||||
//        // 构建通知
 | 
					 | 
				
			||||||
//        NotificationCompat.Builder builder = new NotificationCompat.Builder(mContext, CHANNEL_ID)
 | 
					 | 
				
			||||||
//            .setSmallIcon(android.R.drawable.ic_dialog_info)
 | 
					 | 
				
			||||||
//            .setContent(mRemoteViews)
 | 
					 | 
				
			||||||
//            .setPriority(NotificationCompat.PRIORITY_HIGH)
 | 
					 | 
				
			||||||
//            .setOngoing(true)
 | 
					 | 
				
			||||||
//            .setAutoCancel(true);
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
//        // 显示通知
 | 
					 | 
				
			||||||
//        NotificationManager notificationManager = mContext.getSystemService(NotificationManager.class);
 | 
					 | 
				
			||||||
//        mNotification = builder.build();
 | 
					 | 
				
			||||||
//        notificationManager.notify(1, mNotification);
 | 
					 | 
				
			||||||
//    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public void showNotification(String msg) {
 | 
					 | 
				
			||||||
        if (mRemoteViews == null) {
 | 
					 | 
				
			||||||
            // 创建 RemoteViews 对象,加载布局
 | 
					 | 
				
			||||||
            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);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        mNotificationHelper.showCustomForegroundNotification(mIntentMain, mRemoteViews, mRemoteViews);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
		Reference in New Issue
	
	Block a user