如何启动仅限服务的 Android 应用

Posted

技术标签:

【中文标题】如何启动仅限服务的 Android 应用【英文标题】:How to start Service-only Android app 【发布时间】:2010-11-02 16:15:15 【问题描述】:

我正在创建一个应用程序,其唯一组件是 service,它继续在后台运行(基本上是代理服务器),但我无法找到启动该服务的方法。应用程序不能有任何 UI 或用户交互,所以我没有使用 Activity。Broadcast receiver 可以收听 BOOT 广播,但是如何在安装后第一次启动服务以及如何保持它运行? 或者有没有我可以在安装应用程序后收听的广播,例如可能是 TIME_TICK 但我认为必须从活动中注册。

【问题讨论】:

我自己没有尝试过,但是可以从 Application 对象启动服务吗? 我认为它有效android-codes-examples.blogspot.com/2011/11/… 【参考方案1】:

不幸的是,在您的应用程序安装后,现在没有可靠的方法来接收广播事件,ACTION_PACKAGE_ADDED Intent 不会广播到新安装的包。

您必须拥有广播接收器类和服务才能接收ACTION_BOOT_COMPLETED 事件。我还建议添加ACTION_USER_PRESENT 意图被该广播接收器捕获,这需要Android 1.5(minSDK = 3),这将在用户解锁手机时调用您的广播接收器。您可以做的最后一件事是在您的服务 onCreate 中调用 Service.setForeground() 以告诉 Android 您的服务不应停止,这主要是为 mp3 添加的。必须保持运行但可以被任何服务使用的播放器类型服务。

确保为清单中的 boot_complete 和 user_present 事件添加适当的权限。

这是一个简单的类,您可以将其用作事件的广播接收器。

package com.snctln.util.WeatherStatus;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class WeatherStatusServiceReceiver extends BroadcastReceiver

    @Override
    public void onReceive(Context context, Intent intent)
    
        if(intent.getAction() != null)
        
            if(intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED) ||
                intent.getAction().equals(Intent.ACTION_USER_PRESENT))
            
                context.startService(new Intent(context, WeatherStatusService.class));
            
        
    
;

祝你好运。

【讨论】:

好建议。关于 Service.setForeground() 的一件事:它不再适用于 Android 2.0+。现在,所有“长期存在的”服务都需要在运行时在通知区域中具有持久通知。此处示例:developer.android.com/resources/samples/ApiDemos/src/com/… ACTION_USER_PRESENT 是一个很棒的提示。多年来,我一直在努力让我的服务保持活力,而这正好解决了它。 发现,从 3.0 开始,需要至少启动一次应用程序才能获得它的意图 - 很奇怪,但对我有用。这意味着,必须创建一个在安装后开始的小活动(即介绍性内容)。之后,您将正确收到意图。 在 ubuntudroid 的任何地方都有记录吗? @ArchimedesTrajano 我知道这个问题很老,但它是谷歌的第一个结果。有一些文档here 和一个很好的解释here。【参考方案2】:

Service.onStartCommand中返回START_STICKY

Android 将重新启动您的服务

【讨论】:

START_STICKY 仅适用于 Android 2.0+ 但是服务必须至少运行一次才能获得连续性吗?【参考方案3】:

我正在研究同样的问题。这是我发现的: http://kfb-android.blogspot.de/2009/04/registering-for-timetick-after-reboot.html

这个简单的小演示通过在BroadcatReceiverService 之间打一点乒乓球来展示解决方案。通过在清单中注册接收ACTION_BOOT_COMPLETED,接收器被注册为在启动时启动。它只是在接收ACTION_BOOT_COMPLETED 时启动服务。 Service 依次注册BroadcastReceiver 然后为ACTION_TIME_TICK

应用逻辑将在BroadcastReceiver中实现。

【讨论】:

以上是关于如何启动仅限服务的 Android 应用的主要内容,如果未能解决你的问题,请参考以下文章

如何让mysql自动启动? (仅限 linux-cli)

带有 Google Play 服务的 Android Studio“仅限设备”位置不起作用

编辑器中的游戏 UI 已缩放(Unity,仅限 Android)

如何解决这个错误。 com.google.android.gms.tasks.task executors$zza 无法转换为 android.app.activity。我是 Java 和 Andro

Android studio 如何启动

Android进程经常产生logcat“已死亡”消息。