当前位置: 首页 > 知识库问答 >
问题:

关于Android前台服务的澄清

皇甫飞宇
2023-03-14

我的应用程序目前使用一个后台服务与一个物理设备进行通信(蓝牙)。(我制造并销售物理设备。)应用程序每500ms向设备发送一条命令。用户启动这个进程,它必须运行,直到用户停止它。当应用程序处于活动状态时,进程的结果将发送到应用程序。这个过程需要运行,即使应用程序不是活动的。(例如,他们打电话,搜索网络。)一旦应用程序再次激活,进程的状态将与应用程序同步。该过程可以在任何地方运行,从几分钟到几个小时不等。(是的,如果用户想要运行99小时,则需要插入。)大多数用户运行时间为2-15min。现在一切都很好,但是有了API26,这种体系结构似乎不再被允许了。一个迁移选项是移动到前台服务。但是,我发现文档不清楚前台服务是如何工作的。应用程序未激活的情况下前台服务是否继续运行?(即它已通过onpause。)如果是的话,这与后台服务有何不同?是否有关于前台服务如何工作的更好的文档。(我的网页搜索没有发现任何重要的东西。)另外,如果新的限制仍然适用,API26文档没有说明应用程序是否绑定到后台服务。是吗?

谢谢,斯坦

共有1个答案

司徒阳曜
2023-03-14

前台服务是你放在前台状态的服务,也就是说,如果进程需要CPU,或者你的应用程序关闭了,系统不会杀死它。

首先您有3种服务:

  • 启动的服务(在UI线程中运行)
  • IntentService(在自己的线程中运行)(请参见Services vs IntentServices)
  • 绑定服务(只要有一个活动将其绑定就运行)

使用前台服务可使服务持久化。您必须在服务内部调用startForeground()。在您停止服务之前,它仍将运行,例如使用stopSelf()或stopService();

注意,每次调用startService()时都会触发onStartCommand(),但oncreate()只触发一次。

下面是前台启动服务的一个简单实现:

<service android:name=".ConnectionService"
    android:enabled="true"/>
public class MyService extends Service {
    // Unique notification identifier
    private final static int NOTIFICATION_ID = 95;

    private NotificationManager mNotificationManager;

    public MyService() { super(); }

    @Override
    public void onCreate() {
        // Initialize notification
        mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this);

        // Build your notification here
        mBuilder.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher));
        mBuilder.setSmallIcon(R.mipmap.ic_small_icon);
        mBuilder.setContentTitle("MyService");
        mBuilder.setContentText("The Service is currently running");

        // Launch notification
        startForeground(NOTIFICATION_ID, mBuilder.build());
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // Handle startService() if you need to
        // for exmple if you are passing data in your intent
        return START_NOT_STICKY;
    }

    @Override
    public IBinder onBind(Intent intent) {
        // We don't provide binding, so return null
        return null;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        // Remove the notification when the service is stopped
        mNotificationManager.cancel(NOTIFICATION_ID);
    }
}
 类似资料:
  • 不过,我真的很想弄明白这套房产的目的是什么。我去了Android的文档,里面说: 定义如果填充不为零,则ViewGroup是否将剪辑其子级并将任何EdgeEffect的大小调整到填充中(但不剪辑)。默认情况下,此属性设置为true。 我已经读了很多次,我在网上找了一些例子,但我真的没有找到一些。我发现的唯一的视觉效果与这个ClipToPadding差异类似

  • 我可以在Android 10上使用前台服务在后台进行工作BLE扫描。我的应用程序具有in-manifest Foreground\u服务,并在启动时从用户那里获得premissions ACCESS\u FINE\u位置和ACCESS\u background\u位置。然后用BLE扫描启动前台服务。当屏幕在服务上执行扫描和查找设备时,但当屏幕离开前台时,服务停止工作,扫描停止。 正在启动服务: 使

  • Androids后台任务运行行为的最新变化使得手机被锁定时,很难保持服务活动并在应用程序中继续工作。我的服务只有在屏幕打开或手机充电时才能正常工作。当手机被锁定时,服务几乎立即关闭,或者运行速度太慢,无法发挥任何作用。 我尝试使用“START_STICKY”标志和startForeground()通知来保持服务的活动状态,但这根本没有帮助。我使用的处理程序每5秒调用一次dowork(),然后检查是

  • 我在和前台服务作斗争。在我的设备(Redmi 5 Plus,Android 8.1.0)上,当应用程序从最近的应用程序中删除时,服务通知将不再可见。在其他设备(Android5.0.1、Android7.0)和模拟器(Android8.1-API27)上,当应用程序从最近的应用程序中删除时,通知仍然可见。 在main activity中,我使用启动服务。 这是我的舱单文件: 我错过了什么?它是与后

  • 我正在尝试使用OpenNLP。我需要它从新闻网站(例如:techcrunch)获得新的组织(初创公司)。我有一个组织模型,我用它来识别出版物中的组织(en-ner-organization)。我有一个问题: 如果有一个关于新的初创公司的出版物,它是昨天诞生的,openNlp会承认它是组织吗? 据我所知-没有。直到我不在这个新的初创公司训练模特,对吧?

  • 从文件导入证书时SSL握手失败的后续问题 在该链接中,使用第三方证书时SSL握手失败。 我对此表示怀疑。 一旦服务器向客户端颁发了包含公钥的证书,客户端是否使用服务器的公钥对每条消息进行编码?