Android安卓组件——Service2前台服务.

发布时间:2024年01月04日

(1)创建渠道

安卓8.0以上要求必须创建渠道才能显示通知。创建渠道不一定非要在展示通知的时候做,同一个渠道只需要被创建一次即可(多次亦可)。

NotificationChannel channel = new NotificationChannel(channelId,getResources()
                .getString(R.string.app_name),NotificationManager.IMPORTANCE_HIGH);

参数分别为 渠道ID,获取App名、

第三个参数为:

IMPORTANCE_HIGH 收到通知发出提示语,并且会浮动提示用户(紧急)

IMPORTANCE_DEFAULT 收到通知发出提示语,不会浮动提示(高)

IMPORTANCE_LOW 收到通知不会发出声音,状态栏有小图标展示(中)

IMPORTANCE_MIN 看不到通知,可以用于禁用通知的场景(低)

强制删除渠道:

删除渠道的方法 deleteNotificationChannel()

(2)需要一个NotificationManager来进行管理,可以通过调用Context的getSystemService方法获取。

NotificationManager manager = (NotificationManager) getSystemService(Context
                    .NOTIFICATION_SERVICE);

(3)显示通知?

notificationManager.notify(1,notification); 

(4)需要使用一个Builder构造期来创建Notification对象,由于API不同会造成不同版本的通知出现不稳定的情况,所以使用NotificationCompat类来兼容各个版本。

Notification notification = new NotificationCompat.Builder(this)

?(5)基本参数设置

.setContentTitle("测试通知标题")  //设置标题
.setContentText("测试通知内容") //设置内容
.setWhen(System.currentTimeMillis())  //设置时间,通知产生的时间,会在通知信息里显示
.setSmallIcon(R.mipmap.ic_launcher)  //设置小图标
.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher))   //设置大图标
.setOngoing(false);//ture,设置他为一个正在进行的通知。他们通常是用来表示一个后台任务,用户积极参与(如播放音乐)或以某种方式正在等待,因此占用设备(如一个文件下载,同步操作,主动网络连接)
.setDefaults(Notification.DEFAULT_ALL);//向通知添加声音、闪灯和振动效果
.setStyle(new NotificationCompat.BigPictureStyle().bigPicture(BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher))) //图片通知
.setStyle(new NotificationCompat.BigTextStyle().bigText("长文字")) //显示长字符

(6)开启前台服务🔒

通知栏中该通知会变为不会随着点击或者滑动而删除。除非该service结束停止,这个通知也会随之被删除。

第一个参数是ID,保证每个通知所指定的ID都不是一样的,第二个参数是notification对象

startForeground(222, mBuilder.build())

(7)结束前台服务

通知栏中该通知会随着点击或者滑动而删除。

参数是:是否删除之前发送的通知,true:删除。false:不删除 (用手滑动或者点击通知会被删除)

stopForeground(true);

?(8)跳转功能,即点击通知跳转页面

PendingIntent的用法:

1>通过getActivity()、getBroadcast()、getService()方法获取实例

2>、参数(Context context, int requestCode, Intent intent, int flags)

第一个参数:Context

第二个参数:requestCode 一般用不到 ,通常设为0

第三个参数:intent

第四个参数:flags 用于确定PendingIntent的行为。通常设为0

调用.setContentIntent( )进行使用

Intent intent1 = new Intent(this,MainActivity.class);
PendingIntent pi1 = PendingIntent.getActivity(this,0,intent1,0);

?

需要注意的是:服务长期不使用会被后台回收。

写入onStartCommand中,即在服务每次启动的时候都会被调用。

?(9)代码

  • 方法一和二的区别:

在老的版本中是使用Notification

新的版本是使用Notification.Builder

为了兼容性现在使用NotificationCompat.Builder

  • 方法一(为适应兼容性NotificationCompat.Builder):

    Intent intent1 = new Intent(this,MainActivity.class);
            //从下拉框点击service进入界面
            PendingIntent pi1 = PendingIntent.getActivity(this,0,intent1,0);
            NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
                    getApplicationContext());
            mBuilder.setContentText("测试");
            mBuilder.setContentTitle("测试");
            mBuilder.setSmallIcon(R.drawable.icon);//设置小图标
            mBuilder.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.mipmap.icon));
            mBuilder.setWhen(System.currentTimeMillis());//通知产生的时间,会在通知信息里显示
            mBuilder.setPriority(Notification.PRIORITY_DEFAULT);//设置该通知优先级
            mBuilder.setOngoing(false);//ture,设置他为一个正在进行的通知。他们通常是用来表示一个后台任务,用户积极参与(如播放音乐)或以某种方式正在等待,因此占用设备(如一个文件下载,同步操作,主动网络连接)
            mBuilder.setDefaults(Notification.DEFAULT_ALL);//向通知添加声音、闪灯和振动效果
            mBuilder.setContentIntent(pi1);
    
            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
            //NotificationManager进行管理
                NotificationManager manager = (NotificationManager) getSystemService(Context
                        .NOTIFICATION_SERVICE);
                String channelId = "channelId" + System.currentTimeMillis();
                NotificationChannel channel = new NotificationChannel(channelId, getResources()
                        .getString(R.string.app_name), NotificationManager.IMPORTANCE_HIGH);
                manager.createNotificationChannel(channel);
                mBuilder.setChannelId(channelId);
            }
    
            startForeground(222, mBuilder.build());

  • 方法二(书本旧方法更改Notification):

    //        方法二
            //通知跳转页面 从下拉框点击service进入界面
            Intent intent2 = new Intent(this,MainActivity.class);
            PendingIntent pi = PendingIntent.getActivity(this,0,intent2,0);
            //创建渠道
            String channelId = "channelId" + System.currentTimeMillis();
            NotificationChannel channel = new NotificationChannel(channelId,getResources()
                    .getString(R.string.app_name),NotificationManager.IMPORTANCE_HIGH);
    
            //NotificationManager进行管理
            NotificationManager notificationManager = (NotificationManager) getSystemService(
                    Context.NOTIFICATION_SERVICE);
            notificationManager.createNotificationChannel(channel);
    
            Notification notification = new NotificationCompat.Builder(this)
                    .setContentTitle("This is content title")
                    .setContentText("This is content text")
                    .setWhen(System.currentTimeMillis())//通知产生的时间,会在通知信息里显示
                    .setPriority(Notification.PRIORITY_DEFAULT)//设置该通知优先级
                    .setSmallIcon(R.drawable.icon)//设置小图标
                    .setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.icon))
                    .setContentIntent(pi)  //从下拉框点击service进入界面
                    .setChannelId(channel.getId()) //获取通道ID
                    .setStyle(new NotificationCompat.BigPictureStyle().bigPicture(
                            BitmapFactory.decodeResource(getResources(),R.drawable.icon)))//图片通知
                    .build();
            startForeground(1,notification); // 开始前台服务 该通知也会变为不会随着点击或者滑动而删除
            stopForeground(false);  //结束前台服务 通知栏中该通知会随着点击或者滑动而删除
            notificationManager.notify(1,notification); //显示通知
            return super.onStartCommand(intent, flags, startId);

demo参考:

https://download.csdn.net/download/shanhe_yuchuan/87140901icon-default.png?t=N7T8https://download.csdn.net/download/shanhe_yuchuan/87140901?

文章来源:https://blog.csdn.net/shanhe_yuchuan/article/details/135277990
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。