Android 前台服务

Android 前台服务

学习自

https://blog.csdn.net/guolin_blog/article/details/11952435#t3

前台服务漫谈

我们之前学习的Service都是运行与后台的,自然相对优先级会比较低一点,当内存不足的时候很容易被杀死。但是谁又希望自家的Service被杀死呢。那自然是想办法将自家的服务的优先级提高了,如果提高Service的优先级那当然是用---前台服务,也就是我们本章的主题。

常见的前台服务

各种音乐播放APP中的前台服务是最常见的了,比如我最喜欢的网易云音乐,在播放音乐的时候,在通知栏都会,存在一个类似通知的视图,这其实就是一个前台Service,也是Service+RemoteView+Notification的结合体。网易云音乐通过前台服务不仅可以保证Service的运行,还实时地显式了音乐的播放信息,并且也非常方便我们来切换音乐。

因为手头没有手机,图片来源于网络。

实现前台服务

前台服务的布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="100dp">

    <ImageView
        android:id="@+id/posterIV"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:src="@mipmap/ic_launcher" />

    <TextView
        android:id="@+id/singNameTV"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="8dp"
        android:layout_marginTop="10dp"
        android:layout_toRightOf="@id/posterIV"
        android:text="Sing Name"
        android:textColor="#2b2b2b"
        android:textSize="18sp" />

    <TextView
        android:id="@+id/singerNameTV"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/singNameTV"
        android:layout_marginLeft="8dp"
        android:layout_marginTop="3dp"
        android:layout_toRightOf="@id/posterIV"
        android:text="Sing Name"
        android:textColor="#2b2b2b"
        android:textSize="12sp" />

    <ImageView
        android:id="@+id/previousIV"
        android:layout_width="20dp"
        android:layout_height="20dp"
        android:layout_below="@id/singerNameTV"
        android:layout_marginLeft="8dp"
        android:layout_marginTop="5dp"
        android:layout_toRightOf="@id/posterIV"
        android:src="@drawable/previous" />

    <ImageView
        android:id="@+id/pauseIV"
        android:layout_width="20dp"
        android:layout_height="20dp"
        android:layout_below="@id/singerNameTV"
        android:layout_marginLeft="8dp"
        android:layout_marginTop="5dp"
        android:layout_toRightOf="@id/previousIV"
        android:src="@drawable/pause" />

    <ImageView
        android:id="@+id/nextIV"
        android:layout_width="20dp"
        android:layout_height="20dp"
        android:layout_below="@id/singerNameTV"
        android:layout_marginLeft="8dp"
        android:layout_marginTop="5dp"
        android:layout_toRightOf="@id/pauseIV"
        android:src="@drawable/next" />
</RelativeLayout>

Service

class MusicService : Service() {
    override fun onBind(intent: Intent?): IBinder {
        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
    }

    override fun onCreate() {
        super.onCreate()
        val remoteViews = RemoteViews(this.packageName, R.layout.music_remote)

        remoteViews.setOnClickPendingIntent(R.id.previousIV, createIntent("top.littledavid.studyservice.PREVIOUS"))
        remoteViews.setOnClickPendingIntent(R.id.pauseIV, createIntent("top.littledavid.studyservice.PAUSE"))
        remoteViews.setOnClickPendingIntent(R.id.nextIV, createIntent("top.littledavid.studyservice.NEXT"))

        val notification = Notification.Builder(this).apply {
            setSmallIcon(R.mipmap.ic_launcher)
            setCustomContentView(remoteViews)
        }.build()
        //开启前台服务
        startForeground(1, notification)
    }

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        when (intent!!.action) {
            "top.littledavid.studyservice.PREVIOUS" -> "Previous".logE()
            "top.littledavid.studyservice.PAUSE" -> "PAUSE".logE()
            "top.littledavid.studyservice.NEXT" -> "NEXT".logE()
            "top.littledavid.studyservice.START" -> "Start playing music".logE()
            else -> "UNKOW Operation".logE()
        }
        return super.onStartCommand(intent, flags, startId)
    }

    override fun onDestroy() {
        super.onDestroy()
    }

    private fun createIntent(action: String): PendingIntent {
        val intent = Intent(this, MusicService::class.java)
        intent.action = action
        return PendingIntent.getService(this, 0, intent, 0)
    }
}

Manifest文件中配置服务

<service android:name=".MusicService">
    <intent-filter>
        <action android:name="top.littledavid.studyservice.PREVIOUS" />
        <action android:name="top.littledavid.studyservice.PAUSE" />
        <action android:name="top.littledavid.studyservice.NEXT" />
        <action android:name="top.littledavid.studyservice.START" />
    </intent-filter>
</service>

效果如下

原文地址:https://www.cnblogs.com/slyfox/p/9377650.html

时间: 2024-10-14 01:45:07

Android 前台服务的相关文章

Android四大组件——Service后台服务、前台服务、IntentService、跨进程服务、无障碍服务、系统服务

Service后台服务.前台服务.IntentService.跨进程服务.无障碍服务.系统服务 本篇文章包括以下内容: 前言 Service的简介 后台服务 不可交互的后台服务 可交互的后台服务 混合性交互的后台服务 前台服务 IntentService AIDL跨进程服务 AccessibilityService无障碍服务 系统服务 部分源码下载 前言 作为四大组件之一的Service类,是面试和笔试的必备关卡,我把我所学到的东西总结了一遍,相信你看了之后你会对Service娓娓道来,在以后遇

Android多媒体-播放多媒体时的前台服务

众所周知,一般我们将播放的逻辑都放入service当中,这样就能实现在后台继续播放音乐的功能.后台service被系统回收的概率相对来说比较低,但是这种情况也确实存在. 前台服务是那些被认为用户知道的并且在内存低的时候不允许系统杀死的服务.前台服务必须给状态栏提供一个通知,他被放到了"正在进行中(Ongoing)"标题之下,这就意味着直到这个服务被终止或从前台删除通知才能被解除. 例如,一个播放音乐的音乐播放器服务应该被设置在前台运行,因为用户明确的知道它们的操作.状态栏中的通知可能指

android: 使用前台服务

9.5.1    使用前台服务 服务几乎都是在后台运行的,一直以来它都是默默地做着辛苦的工作.但是服务的系统 优先级还是比较低的,当系统出现内存不足的情况时,就有可能会回收掉正在后台运行的服 务.如果你希望服务可以一直保持运行状态,而不会由于系统内存不足的原因导致被回收, 就可以考虑使用前台服务.前台服务和普通服务最大的区别就在于,它会一直有一个正在运 行的图标在系统的状态栏显示,下拉状态栏后可以看到更加详细的信息,非常类似于通知的 效果.当然有时候你也可能不仅仅是为了防止服务被回收掉才使用前台

Android service 服务

Android的服务: 1:已启动方式: startService()和bindService(): startService:启动后,如果Activity关闭了,服务依然运行,除非stopService: bindService:创建开启服务器,但是在程序关闭的时候,会自动关闭服务: 通过ServiceConnectionjava接口获取service的IBinder接口: 2:控制服务(绑定服务): (1)但是上述两个方式都是通过Intent创建启动服务的,没有通过new,所以没有直接控制s

服务 IntentService 前台服务 定时后台服务

Activity public class MainActivity extends ListActivity {     private int intentNumber = 0;     @Override     protected void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         List<String> mData = new ArrayList

Android 定位服务(Location-Based Services)

Android定位服务融合了GPS定位.移动通信.导航等多种技术,提供与空间位置相关的综合应用服务.近些年来,基于位置的服务发展更为迅速,涉及商务.医疗.工作和生活的各个方面,为用户提供定位.追踪和敏感区域警告等一系列服务. Android平台支持提供位置服务的API,在开发过程中主要使用LocationManager和LocationProviders对象. - LocationManager: 用来获取当前位置,追踪设备的移动路线,或设定敏感区域,在进入或离开敏感区域时设备会发出特定警报.

android前台渲染图片

android前台渲染,主要是重写view的ondraw方法,在canvas里操作 自定义MyView类 package com.ssln; import android.annotation.SuppressLint; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; impo

3D语音天气球——在Unity中使用Android语音服务

转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 开篇废话: 这个项目准备分四部分介绍: 一:创建可旋转的"3D球":3D语音天气球(源码分享)--创建可旋转的3D球 二:通过天气服务,从网络获取时实天气信息并动态生成"3D球":3D语音天气球(源码分享)--通过天气服务动态创建3D球 三:Android语音服务和Unity的消息传递 四:Unity3D端和Android端的结合 前两篇文章已经介绍了如何创

Android 定位服务(转载)

今天因为工作需要,把以前编写的一个GPS测试程序拿出来重新修改了一下.这个程序说起来有些历史了,是我11年编写的,那时候学了Android开发没多久,算是一个实验性的作品.现在工作需要,重新拿出来修整.同时发现我对android的GPS服务了解并不深,所以今天特意阅读了有关GPS服务的一些资料,把相关知识点记录下来. 本人做了GPS相关的嵌入式软件已经几年了,所以说起要做个测试GPS定位模块的程序,第一反应就是串口读取GPS模块的数据,然后解析GPS的NMEA格式数据.NMEA是一种标准化数据格