澄清Android前台服务

时间:2017-12-15 01:00:59

标签: android

我的应用目前使用后台服务与物理设备进行通信(蓝牙)。 (我制造和销售物理设备。)应用程序每500ms向设备发送一个命令。用户启动此过程并且必须运行直到用户停止它。当应用程序处于活动状态时,该过程的结果将发送到应用程序。即使应用程序未处于活动状态,也需要运行此过程。 (即他们接听电话,搜索网络。)一旦应用程序再次变为活动状态,该过程的状态将与应用程序同步。该过程可以在几分钟到几个小时的任何时间运行。 (是的,如果用户希望在99小时内运行该过程,则需要插入。)大多数用户运行它持续2-15分钟。现在一切都很好,但是使用API​​ 26,看起来不再允许这种架构。一种迁移选项是移动到前台服务。但是,我发现有关前台服务如何工作的文档不清楚。前台服务是否继续运行且应用程序未激活? (即它已经通过onPause。)如果是这样,这与后台服务有什么不同?有关前台服务如何工作的更好的文档。 (我的网络搜索没有显示任何重要信息。)Alos,API 26文档没有说明如果新的限制仍适用,应用程序是否与后台服务绑定。他们呢?

谢谢, 斯坦

2 个答案:

答案 0 :(得分:8)

Foreground Service 是您置于前台状态的服务,也就是说,如果需要CPU或您的应用已关闭,系统不会终止该进程。

首先,您有3种服务:

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

如上所述,如果您关闭应用,绑定服务也将关闭,由bindService()启动。

IntentService s Service的子类型,它简化了工作队列流程"对于传入的意图,即它在队列中逐个处理传入的意图,如IntentService description中所述。它有一个默认实现,由startService()启动。它主要用于异步任务。

已启动服务是由组件启动的服务,并会一直有效,直到调用stopService()或您的应用已关闭。

使用前台服务可使您的Service 持久。您必须在服务中拨打startForeground()。它会一直运行,直到您停止Service,例如stopSelf()stopService();

注意每次拨打onStartCommand()时都会触发startService(),但onCreate()只会触发一次。

以下是 Foreground Started Service 的简单实现:

在你的Manifest.xml中:

<service android:name=".ConnectionService"
    android:enabled="true"/>

在MyService.java中:

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);
    }
}

最后只需致电startService()

答案 1 :(得分:0)

Forground服务对我来说是新的,但它看起来像是一个在状态栏中有一个图标的服务,所以它确实有一个ui。你看过jobinfo了吗?似乎是一种在后台运行工作的方式。如果你希望你的服务在启动完成时启动this article may help最后这可能是一个很长的镜头,在Android设备上转到设置&gt;应用程序并选择一个已安装的应用程序。你会发现弹出一个屏幕,因为程序员覆盖了android.accounts.AccountAuthenticator动作。换句话说,系统通过Launcher意图以外的方式启动活动。以同样的方式,系统必须调用一个意图,你可以覆盖蓝牙连接时可能android.bluetooth.device.action.FOUND check this out