Android通知栏前台服务的实现

一、前台服务的简单介绍

前台服务是那些被认为用户知道且在系统内存不足的时候不允许系统杀死的服务。前台服务必须给状态栏提供一个通知,它被放到正在运行(Ongoing)标题之下——这就意味着通知只有在这个服务被终止或从前台主动移除通知后才能被解除。

最常见的表现形式就是音乐播放服务,应用程序后台运行时,用户可以通过通知栏,知道当前播放内容,并进行暂停、继续、切歌等相关操作。

二、为什么使用前台服务

后台运行的Service系统优先级相对较低,当系统内存不足时,在后台运行的Service就有可能被回收,为了保持后台服务的正常运行及相关操作,可以选择将需要保持运行的Service设置为前台服务,从而使APP长时间处于后台或者关闭(进程未被清理)时,服务能够保持工作。

三、前台服务的详细使用

创建服务内容,如下(四大组件不要忘记清单文件进行注册,否则启动会找不到服务);

public class ForegroundService extends Service {

  private static final String TAG = ForegroundService.class.getSimpleName();

 @Override
  public void onCreate() {
    super.onCreate();
    Log.e(TAG, "onCreate");
  }

  @Nullable
  @Override
  public IBinder onBind(Intent intent) {
    Log.e(TAG, "onBind");
    return null;
  }

  @Override
  public int onStartCommand(Intent intent, int flags, int startId) {
    Log.e(TAG, "onStartCommand");
    return super.onStartCommand(intent, flags, startId);
  }

  @Override
  public void onDestroy() {
    Log.e(TAG, "onDestroy");
    super.onDestroy();
  }
}

创建服务通知内容,例如音乐播放,蓝牙设备正在连接等:

/**
 * 创建服务通知
 */
private Notification createForegroundNotification() {
  NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

  // 唯一的通知通道的id.
  String notificationChannelId = "notification_channel_id_01";

  // Android8.0以上的系统,新建消息通道
  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    //用户可见的通道名称
    String channelName = "Foreground Service Notification";
    //通道的重要程度
    int importance = NotificationManager.IMPORTANCE_HIGH;
    NotificationChannel notificationChannel = new NotificationChannel(notificationChannelId, channelName, importance);
    notificationChannel.setDescription("Channel description");
    //LED灯
    notificationChannel.enableLights(true);
    notificationChannel.setLightColor(Color.RED);
    //震动
    notificationChannel.setVibrationPattern(new long[]{0, 1000, 500, 1000});
    notificationChannel.enableVibration(true);
    if (notificationManager != null) {
      notificationManager.createNotificationChannel(notificationChannel);
    }
  }

  NotificationCompat.Builder builder = new NotificationCompat.Builder(this, notificationChannelId);
  //通知小图标
  builder.setSmallIcon(R.drawable.ic_launcher);
  //通知标题
  builder.setContentTitle("ContentTitle");
  //通知内容
  builder.setContentText("ContentText");
  //设定通知显示的时间
  builder.setWhen(System.currentTimeMillis());
  //设定启动的内容
  Intent activityIntent = new Intent(this, NotificationActivity.class);
  PendingIntent pendingIntent = PendingIntent.getActivity(this, 1, activityIntent, PendingIntent.FLAG_UPDATE_CURRENT);
  builder.setContentIntent(pendingIntent);

  //创建通知并返回
  return builder.build();
}

启动服务时,创建通知:

@Override
public void onCreate() {
  super.onCreate();
  Log.e(TAG, "onCreate");
  // 获取服务通知
  Notification notification = createForegroundNotification();
  //将服务置于启动状态 ,NOTIFICATION_ID指的是创建的通知的ID
  startForeground(NOTIFICATION_ID, notification);
}

停止服务时,移除通知:

@Override
public void onDestroy() {
  Log.e(TAG, "onDestroy");
  // 标记服务关闭
  ForegroundService.serviceIsLive = false;
  // 移除通知
  stopForeground(true);
  super.onDestroy();
}

判断服务是否启动及获取传递信息:

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
  Log.e(TAG, "onStartCommand");
  // 标记服务启动
  ForegroundService.serviceIsLive = true;
  // 数据获取
  String data = intent.getStringExtra("Foreground");
  Toast.makeText(this, data, Toast.LENGTH_SHORT).show();
  return super.onStartCommand(intent, flags, startId);
}

以上就是前台服务的创建过程,相关注释已经很明白了,具体使用可以查看文末的Demo。

服务创建完毕,接下来就可以进行服务的启动了,启动前不要忘记在清单文件中进行前台服务权限的添加:

<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />

服务的启动和停止

//启动服务
if (!ForegroundService.serviceIsLive) {
  // Android 8.0使用startForegroundService在前台启动新服务
  mForegroundService = new Intent(this, ForegroundService.class);
  mForegroundService.putExtra("Foreground", "This is a foreground service.");
  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    startForegroundService(mForegroundService);
  } else {
    startService(mForegroundService);
  }
} else {
  Toast.makeText(this, "前台服务正在运行中...", Toast.LENGTH_SHORT).show();
}
//停止服务
mForegroundService = new Intent(this, ForegroundService.class);
stopService(mForegroundService);

关于前台服务的介绍及使用就到这里了,相关使用已上传至Github开发记录,欢迎点击查阅及Star,我也会继续补充其它有用的知识及例子在项目上。

到此这篇关于Android通知栏前台服务的实现的文章就介绍到这了,更多相关Android 通知栏前台内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Android8.0适配前台定位服务service的示例代码

    从Android 8.0开始系统为实现降低功耗,对后台应用获取用户位置信息频率进行了限制,每小时只允许更新几次位置信息,详细信息请参考官方说明.按照官方指引,如果要提高位置更新频率,需要后台应用提供一个前台服务通知告知. 所以原来的单单使用locationManager获得当前位置在后台情况下无法使用了.于是打算使用一个前台服务,当app在后台时也能获得当前位置. 查了几篇博客说前台服务需要在service的onStartCommand方法中调用startForeground(int, Noti

  • Android实现Service在前台运行服务

    前言 在做手机音乐播放器的时候,让我非常苦恼的一件事就是手机有清理内存的软件,比如百度,360等等,一点击清理音乐就停止播放了,去后台查看发现Service已经被停止并重新启动了,这显然不是我想要的,我希望音乐能够在后台播放,并且自己能控制什么时候退出,不想让系统给我清理了,就像酷狗一直在通知栏显示那样,于是我就知道了在前台运行的服务. 实现 我们先看一下结果图: 这是运行在通知栏的界面,这样就是让服务在前台运行,再清理的时候就不会导致服务被关闭了. 好了,我们直接上代码,因为要开启服务,所以我

  • Android通知栏前台服务的实现

    一.前台服务的简单介绍 前台服务是那些被认为用户知道且在系统内存不足的时候不允许系统杀死的服务.前台服务必须给状态栏提供一个通知,它被放到正在运行(Ongoing)标题之下--这就意味着通知只有在这个服务被终止或从前台主动移除通知后才能被解除. 最常见的表现形式就是音乐播放服务,应用程序后台运行时,用户可以通过通知栏,知道当前播放内容,并进行暂停.继续.切歌等相关操作. 二.为什么使用前台服务 后台运行的Service系统优先级相对较低,当系统内存不足时,在后台运行的Service就有可能被回收

  • Android客户端与服务端交互

    本文和大家一起了解了一下android客户端与服务端是怎样交互的,具体内容如下 1.后台使用简单的servlet,支持GET或POST.这个servlet最终返回给前台一个字符串flag,值是true或false,表示登录是否成功. servlet使用之前需要配置,主义servlet的servlet-name要和servlet-mapping的servlet-name一致,否则找不到路径 我是在myEclipse上创建的一个web service 项目,然后部署到tomcat服务器上以便andr

  • Android组件之服务的详解

    目录 一.服务的概念 二.Android的多线程编程 2.1 线程的基本用法 2.2 在子线程中更新UI 更新方式一 更新方式二 2.3 解析异步消息处理机制 2.4 使用AsyncTask 三.服务的基本用法 3.1 首先定义一个服务 3.2 MyService类里重写几个方法 3.3 在注册文件中完成对服务的注册 3.4 启动和停止服务 3.5 活动和服务进行通信 四.服务的生命周期 五.服务的更多技巧 5.1 使用前台服务 5.2 服务中的多线程问题&IntentService 一.服务的

  • Android原生定位服务LocationManager

    目录 前言 一.LocationManager的使用 二.混合定位 总结 前言 现在的应用,几乎每一个 App 都存在定位的逻辑,方便更好的推荐产品或服务,获取当前设备的经纬度是必备的功能了.有些 App 还是以LBS(基于位置服务)为基础来实现的,比如美团,饿了吗,不获取到位置都无法使用的. 有些同学觉得不就是获取到经纬度么,Android 自带的就有位置服务 LocationManager ,我们无需引入第三方服务,就可以很方便的实现定位逻辑. 确实 LocationManager 的使用很

  • Android中Service服务详解(一)

    本文详细分析了Android中Service服务.分享给大家供大家参考,具体如下: 一.Service简介 Service是Android中实现程序后台运行的解决方案,适用于去执行那些不需要和用户交互而且还要求长期运行的任务.Service是android 系统中的四大组件之一(Activity.Service.BroadcastReceiver.ContentProvider),它跟Activity的级别差不多,但不能自己运行只能后台运行,并且可以和其他组件进行交互. Service并不是运行

  • Android判断后台服务是否开启的两种方法实例详解

    Android判断后台服务是否开启的两种方法实例详解 最近项目用到后台上传,就开启了一个服务service. 但是刚开始用这种方法,有些机型不支持:酷派不支持.然后又换了第二种判断方法. // public boolean isServiceWork(Context mContext, String serviceName) { // boolean isWork = false; // ActivityManager myAM = (ActivityManager) mContext // .

  • Android闹铃服务AlarmManager用法深入分析

    本文实例讲述了Android闹铃服务AlarmManager用法.分享给大家供大家参考,具体如下: 对应AlarmManage有一个AlarmManagerServie服务程 序,该服务程序才是正真提供闹铃服务的,它主要维护应用程序注册下来的各类闹铃并适时的设置即将触发的闹铃给闹铃设备(在系统中,linux实现的设备名 为"/dev/alarm"),并且一直监听闹铃设备,一旦有闹铃触发或者是闹铃事件发生,AlarmManagerServie服务程序就会遍历闹铃列 表找到相应的注册闹铃并

  • android通知栏的实现方法分析

    本文实例讲述了android通知栏的实现方法.分享给大家供大家参考,具体如下: 这几天一直在修改twigee的源代码,其中一个要加入的功能是常驻Notification栏,以前写的时候只能出现 在"通知"这一组中,想把它放在"正在运行"组中却不知道怎么放,查了下官方文档,找到了方法,在notification的flags字段中加一下 "FLAG_ONGOING_EVENT"就可以了.同时我也把Notification的使用方法给总结了一下.详见下

  • Android中Service服务详解(二)

    本文详细分析了Android中Service服务.分享给大家供大家参考,具体如下: 在前面文章<Android中Service服务详解(一)>中,我们介绍了服务的启动和停止,是调用Context的startService和stopService方法.还有另外一种启动方式和停止方式,即绑定服务和解绑服务,这种方式使服务与启动服务的活动之间的关系更为紧密,可以在活动中告诉服务去做什么事情. 为了说明这种情况,做如下工作: 1.修改Service服务类MyService package com.ex

  • Android通知栏微技巧一些需要注意的小细节

    为此Android在appcompat-v7库中提供了一个NotificationCompat类来处理新老版本的兼容问题,我们在编写通知功能时都使用NotificationCompat这个类来实现,appcompat-v7库就会自动帮我们做好所有系统版本的兼容性处理了.一段基本的触发通知代码如下所示: NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); Notifi

随机推荐