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