当应用程序不在前台时,Android 服务停止工作

2023-11-30

我有一个小问题: 我从服务接收由 LocationListener 给出的速度值。但是当我关闭应用程序的用户界面时,位置侦听器将停止发送更新。有人知道该怎么做吗?我需要它来继续更新,即使该应用程序未在使用中......

这是我的代码:

public class BackroundService extends Service {


//initializing the Location Manager and Listener
LocationManager locationManager;
LocationListener locationListener;


@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}

@SuppressLint("MissingPermission")
@Override
public void onCreate() {

}

@SuppressLint("MissingPermission")
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    //Instantiating the device manager an  listener
    locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
    locationListener = new MyLocationListener();
    locationManager.requestLocationUpdates("gps", 500, 0, locationListener);

    return START_STICKY;
}




}


class MyLocationListener extends Service implements LocationListener
{
public float speed;

public void onLocationChanged(final Location location)
{
    //when the location changed

    Log.d("Location", ""+location);
    Log.d("Float Location", ""+ location.getLongitude() + "     " + location.getLatitude());
    Log.d("Speed", "    "+location.getSpeed());

    //initializing the variable speed with the speed number given by the LocationListener
    speed = location.getSpeed();

    //creating a broadcast reciever
    Intent intent = new Intent("speed_update");
    intent.putExtra("speed", speed);
    //sending speed to main activity
    sendBroadcast(intent);

    //checking if speed is in walking range
    if (speed < 4.0 && speed > 0.4){
        Log.d("######Checker######", "++++++++++turn off+++++++++++");
        //Toast.makeText(MyLocationListener.this, "turn off", Toast.LENGTH_SHORT).show();
    }
}


public void onProviderDisabled(String provider)
{

}


public void onProviderEnabled(String provider)
{

}


public void onStatusChanged(String provider, int status, Bundle extras)
{

}

@Nullable
@Override
public IBinder onBind(Intent intent) {
    return null;
}
}

从oreo开始,android后台政策发生了重大变化,请参考这里https://developer.android.com/about/versions/oreo/background更多细节, 为了避免您的服务被 Android 杀死,您必须将其作为前台服务运行

步骤一:给manifest文件添加权限

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

这是有关此权限的更多详细信息https://developer.android.com/reference/android/Manifest.permission#FOREGROUND_SERVICE

第 2 步:创建服务,我正在为您分享示例代码

public class DemoService extends Service {
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d("SSB Log", "onStartCommand");

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            // For foreground service
            Intent notificationIntent = new Intent(this, DemoService.class);
            PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);

            // Creating channel for notification
            String id = DemoService.class.getSimpleName();
            String name = DemoService.class.getSimpleName();
            NotificationChannel notificationChannel = new NotificationChannel(id,
                    name, NotificationManager.IMPORTANCE_NONE);
            NotificationManager service = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
            service.createNotificationChannel(notificationChannel);

            // Foreground notification
            Notification notification = new Notification.Builder(this, id)
                    .setContentTitle(getText(R.string.app_name))
                    .setContentText("Show service running reason to user")
                    .setSmallIcon(R.mipmap.ic_launcher)
                    .setContentIntent(pendingIntent)
                    .setTicker("Ticker text")
                    .build();

            startForeground(9, notification);
        }
        // Service logic here

        return Service.START_NOT_STICKY;
    }
}

步骤 3:在清单中声明服务

<service android:name=".DemoService" />

第 4 步:从 Activity 启动服务

Intent startDemoService = new Intent(this,DemoService.class);
    startService(startDemoService);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当应用程序不在前台时,Android 服务停止工作 的相关文章

  • 安卓无法玩ogg

    有人知道这是什么意思吗 ogg使用phonegap is Media播放 它使用MediaPlayer 05 26 15 41 50 007 1160 3631 E AudioFlinger no more track names avai
  • Android 自定义视图不能以正确的方式处理透明度/alpha

    我正在绘制自定义视图 在此视图中 我使用两个不同的绘画和路径对象在画布上绘画 我基本上是在绘制两个重叠的形状 添加 Alpha 后 视图中重叠的部分比图像的其余部分更暗 这是不希望的 但我不知道如何解决它 这是我的代码片段 用于展示我如何在
  • ProGuard 无法与 Windows 中使用的 Joda Time 一起编译

    实际上 这是一个答案 而不是一个问题 我确实在 Windows 上花了很多时间 使用 JodaTime 并使用 ProGuard 将其包含在我的 Android 项目中 混淆器配置 libraryjars C Users Reto Docu
  • Firestore - RecycleView - 图像持有者

    我不知道如何编写图像的支架 我已经设置了 2 个文本 但我不知道图像的支架应该是什么样子 你能帮我告诉我图像的文字应该是什么样子才能正确显示吗 holder artistImage setImageResource model getArt
  • 如何从 Retrofit2 获取字符串响应?

    我正在做 android 正在寻找一种方法来执行超级基本的 http GET POST 请求 我不断收到错误 java lang IllegalArgumentException Unable to create converter for
  • 尝试在模拟器上安装第二个 flutter 应用程序时出错

    我创建了一个简单的 flutter 应用程序并在 android 模拟器上运行它 效果还不错 现在我创建了另一个 当我尝试在模拟器上运行它时 我得到 Error ADB exited with exit code 1 adb failed
  • 如何持续更新MPAndroidChart中的Y轴值

    我希望 LineChart 中的轴能够实时调整其最大值和最小值 当新数据的 Y 值增加 正值和负值 时 像 ResetAxisMaxValue 和 ResetAxisMinValue 这样的函数可以很好地工作 但是 一旦信号再次变低 Y 值
  • 在 Jetpack Compose 中跨可组合函数重复使用一组预览注释

    在 Jetpack Compose 中迈出第一步 这非常令人惊奇 除了一个恼人的问题 我有一组固定的预览 正常 深色和 RTL Preview name Normal group Screen showBackground true Pre
  • 如何在进入新活动之前终止线程和处理程序

    大家好 在我尝试清理处理程序时 这段代码可能有点混乱 因为我一直在尝试追踪崩溃发生的位置 我有一个对话框活动 显示密码输入 进度条由线程和处理程序动画显示 似乎当我试图查看进度条是否完成并尝试终止线程时 当我尝试进入新活动时 我这样做的方式
  • 如何在 Android NDK 中创建新的 NativeWindow 而无需 Android 操作系统源代码?

    我想编译一个 Android OpenGL 控制台应用程序 您可以直接从控制台启动 Android x86 运行 或者从 Android x86 GUI 内的 Android 终端应用程序运行 这个帖子 如何在 Android NDK 中创
  • onClick 未在带有子项的 LinearLayout 上触发

    我有一个自定义的 LinearLayout 和一个较小的 TextView 子级 我希望能够单击 TextView 未覆盖的区域 因此我将 clickable true 和 onclicklistener 设置为 LinearLayout
  • Nexus 7 (2013) 和 Win 7 64 - 尽管检查了许多论坛和在线资源,仍无法安装 USB 驱动程序

    我正在尝试设置 Nexus 7 2013 进行调试 但我在安装 USB 驱动程序的步骤中陷入困境 到目前为止 这是我尝试过的 采取的步骤 在 Nexus 7 2013 上打开调试模式 连接设备至 PC 下载 Google USB 驱动程序于
  • 在 Honeycomb Android 3.0 中显示 Action Bar 菜单项的图标

    我正在使用 Honeycomb android 3 0 开发 Android 应用程序 我正在尝试在 Action Bar 中显示菜单 菜单有一个图标和标题 当我们单击菜单项时 它会以下拉列表的形式显示其项目 它是下拉列表中带有项目名称但不
  • Android - 9 补丁

    我正在尝试使用 9 块图片创建一个新的微调器背景 我尝试了很多方法来获得完美的图像 但都失败了 s Here is my 9 patch 当我用Draw 9 patch模拟时 内容看起来不错 但是带有箭头的部分没有显示 或者当它显示时 这部
  • 安卓的限制

    我需要构建一个应用程序 该应用程序拍摄相机图像并将其上传到网络 在网络上进行一些处理并返回真 假 我在这方面遇到了一些问题 希望得到澄清 1 我的应用程序有什么方法可以知道 Android 相机捕获的图像吗 我从这里明白了什么 Androi
  • Android 自定义警报对话框中的 OnClickListener

    我是一个自学成才的初学者 感谢耐心 谢谢 在 Eclipse 中 我使用自己的 xml 文件 custom dialog 创建了一个自定义警报对话框 称为 usernamealert 如果用户尚未输入用户名 即 username lengt
  • Android:解析 XML 数据的最佳解析器 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我正在开发一个应用程序 其中我第一次要解析来自远程服务器的 xml 文件中的数据 但我无法选择哪个解析器是有效的或最适合解析的 因为我知道主要有
  • Android ScrollView fillViewport 不工作

    我有一个简单的布局 名称位于顶部 按钮位于屏幕底部 或者超出该按钮 以防我添加更多项目 所以我使用带有 LinearLayout 的 ScrollView 如下所示
  • 在 Android 中使用 iText 将图像添加到特定位置

    我想使用 Android 中的 iText 将图像添加到 PDF 文件中的特定位置 这是一个可填写的表单 我添加了作为图像占位符的文本框 我想要做的就是像这样获取该文本框和图像 public class FormFill public st
  • Android 和 Java 中绘制椭圆的区别

    在Java中由于某种原因Ellipse2D Double使用参数 height width x y 当我创建一个RectF在Android中参数是 left top right bottom 所以我对适应差异有点困惑 如果在 Java 中创

随机推荐

  • iOS:如何正确访问 UITableViewCell 的 contentView 上的自定义标签?

    我有一个 UITableView 每个单元格被分成几个部分 每个部分都有不同的标签 该表由 NSDictionaries 的 NSArray 填充 其中包含填充单元格标签的所有数据 UITableView 的这一部分效果很好 当我更改其中一
  • C++ 模板和朋友,链接器错误

    为什么以下代码无法编译 链接器错误 无法解析的外部符号 class std basic ostream
  • 将 JSeparator 添加到 DefaultListModel

    我想将一些 JSeparators 添加到 JList 中 我正在使用 DefaultListModel 当我尝试时 DefaultListModel myListModel addElement new JSeparator 当我执行时
  • 在 C++ 中并行读取大文本文件

    我有一个很大的文本文件 我想读取这个文件并在其中执行一些操作 这种操作在每行上独立发生 所以基本上 我正在寻找一些可以并行执行此操作的函数 void readFile string filename do manipulation 操纵可以
  • XML 和 XSD 有什么区别?

    可扩展标记语言 XML 和 XML 架构定义 XSD 之间有什么区别 实际上XSD 本身就是XML 其目的是验证另一个 XML 文档的结构 XSD 对于任何 XML 来说都不是强制性的 但它确保 XML 可用于某些特定目的 XML 仅包含适
  • 如何解决 WSAECONNRESET 错误?

    我作为一个小型开发团队的一部分使用 Perforce 除了一个人收到以下错误之外 每个人都能够连接到 P4V 客户端 TCP 接收失败 读取 套接字 WSAECONNRESET 我们已停用他的迈克菲防火墙和病毒扫描 但错误仍然存 在 我真的
  • Java堆不断缩小!这张堆大小图中发生了什么?

    这是运行 ActiveMQ 的 JVM win64 6u17 的屏幕截图 每次垃圾回收后堆大小都会减小 随着堆大小的减小 垃圾收集变得更加频繁 并且堆减小得更快 最终虚拟机锁定 因为它把所有的时间都花在了 GC 上 Xms是默认值并且 Xm
  • jQuery 一次显示一个元素?

    我有一个包含索引类的列表 在容器 div 淡入时一次显示这些类的最佳方式是什么 Give them a common class and do the fadeIn docs in a loop using the each docs me
  • 最快算法计算数组中 3 长度 AP 的数量

    我想解决thisCodeChef 挑战 假设我们有一个包含 N 范围为 100 000 个元素的数组 A 我们要找到 3 个这样的元素 1 Aj Ai Ak Aj and i lt j lt k 换句话说 Ai Aj Ak 属于算术级数 例
  • 反应选择自定义标签编辑功能

    我在我的应用程序中使用react select 它工作得很好 但是当用户创建自定义标签时我需要一个功能 他们将编辑它 这是一个有效的功能 但是在react select中没有编辑自定义标签的选项 我的应用程序中确实需要此功能 因此我开始自己
  • 在 Internet Explorer 中显示加载程序 GIF 时出现问题

    我想展示一个装载机 gif 在用户单击表单上的 提交 后的 jquery 对话框 当然没有标题栏 上 做了几件事后我想出了这个 demo 并对自己说 终于 成功了 但是当我在 IE 我通常使用 Chrome 上测试它时 令我非常失望的是 动
  • 如何使用 Python 重命名文件

    我想改变a txt to b kml Use os rename import os os rename a txt b kml Usage os rename from extension whatever to another exte
  • 如何根据开始日期和结束日期将数据帧的行拆分为多行?

    我有一个带有开始日期和结束日期的数据集 我想根据该期间的年份拆分此数据框中的行 以此数据框为例 df lt data frame starting date as Date 2015 06 01 end date as Date 2017
  • 将刀片模板保存到数据库而不是文件

    我想拯救我的blade模板到数据库 因为header and footer每页的is customizable对于用户来说 我想让我的用户自己创建布局 然后对于给定用户的每个请求 我想使用该用户指定的布局来提供页面 控制器传递的必要变量在文
  • Scala:覆盖值父代代码已运行,但未在父代分配值

    运行下面的代码 class Parent val value println Setting value in parent ParentVal println s Parent value is value class Child ext
  • 如何从 ruby​​ 数组中获取重复元素? [复制]

    这个问题在这里已经有答案了 假设我有一个数组 1 2 3 1 5 2 这里1和2是重复元素 我想得到一个新的数组 1 2 我该如何在红宝石中做到这一点 arr 1 2 3 1 5 2 arr group by e e map e e 0 i
  • 我如何每 1 秒调用一次服务并使用 angular2 检查响应?

    我有一项服务实施如下 export class UploadPollingService constructor private http Http private appConfig AppConfigService checkUploa
  • JSF 2.0:如何获取在浏览器地址栏中输入的 URL

    我的 JSF 应用程序将任何未登录的用户重定向到登录页面 当用户登录时 我希望应用程序重定向到用户最初在浏览器地址栏中输入的页面 但我不知道如何访问用户最初输入的网址 因为他会自动重定向到我在 web xml 中配置的登录页面 容器管理的安
  • 尝试连接 Google Awareness 服务时收到错误

    我正在尝试使用谷歌的感知 api 并将 GoogleApiClient 的实例注册到感知 api 但我收到了一个我在任何地方都找不到的错误 我已按照手册操作 并在 api 控制台中启用了感知服务 https developers googl
  • 当应用程序不在前台时,Android 服务停止工作

    我有一个小问题 我从服务接收由 LocationListener 给出的速度值 但是当我关闭应用程序的用户界面时 位置侦听器将停止发送更新 有人知道该怎么做吗 我需要它来继续更新 即使该应用程序未在使用中 这是我的代码 public cla