Android服务在销毁活动后重新创建
首先,我创建的应用程序必须在后台工作(即使用户杀死了应用程序)。我有蓝牙服务器(raspberry pi),我的应用程序应该像该服务器的客户端一样工作。当建立连接时,我需要保持它的活动状态,并且仅当用户离prom服务器太远或者服务器发送特定的断开命令时才断开连接。所以我简单地找到了BluetoothChatExample,并将所有代码从活动放到服务中(因为即使用户杀死了应用程序,我也需要通信,我的服务应该独立于我的主要活动) 以下是我的服务中的一些代码片段Android服务在销毁活动后重新创建,android,sockets,service,background-process,Android,Sockets,Service,Background Process,首先,我创建的应用程序必须在后台工作(即使用户杀死了应用程序)。我有蓝牙服务器(raspberry pi),我的应用程序应该像该服务器的客户端一样工作。当建立连接时,我需要保持它的活动状态,并且仅当用户离prom服务器太远或者服务器发送特定的断开命令时才断开连接。所以我简单地找到了BluetoothChatExample,并将所有代码从活动放到服务中(因为即使用户杀死了应用程序,我也需要通信,我的服务应该独立于我的主要活动) 以下是我的服务中的一些代码片段 public class Blueto
public class BluetoothCommunicationService extends Service {
public BluetoothCommunicationService() {
}
@Override
public void onCreate() {
super.onCreate();
//....
//....
//....
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if(intent.getAction.equals("stop") {
stopSelf();
}
return START_STICKY;
}
private class AcceptThread extends Thread {
//....
}
private class ConnectThread extends Thread {
//....
}
private class ConnectedThread extends Thread {
//....
}
@Override
public void onDestroy() {
super.onDestroy();
}
}
正如您所见,我以
START\u STICKY
的身份启动了我的服务,但当我从“最近使用的应用程序”列表中删除应用程序时,问题是我也在删除我的服务(即使未调用onDestroy()
),然后再次调用onCreate
,并且服务从零开始。但是蓝牙通信是基于套接字的,所以它们也会被重新创建,我的连接也会丢失。我还尝试了START\u NOT\u STICKY
,但是当我关闭我的应用程序时,我的服务就被破坏了,而且永远不会重新创建。在用户关闭我的应用程序后,是否有可能让服务保持活动状态(而不是重新创建) 您不能保证服务不会被终止。它可以并且将在某个时刻终止,关闭所有应用程序将破坏您的服务。您从START\u STICKY
中获得的唯一好处是,它稍后将尝试重新启动服务。您不能保证服务不会被终止。它可以并且将在某个时刻终止,关闭所有应用程序将破坏您的服务。您从START\u STICKY
中获得的唯一好处是,它稍后将尝试重新启动服务。这是设计好的。当你在最近的应用中刷走一个应用时,它会杀死整个应用。这包括任何后台服务。这是设计的。当你在最近的应用中刷走一个应用时,它会杀死整个应用。这包括任何后台服务。是的,可以让您的服务保持活动状态。您应该将以下内容添加到清单中:
<service android:name=".BluetoothCommunicationService"
android:process=":nameNewProcessThatYourServiceWillUseHere"/>
现在,您的服务将在独立于初始应用程序进程的进程上运行。是的,您的服务可以保持活动状态。您应该将以下内容添加到清单中:
<service android:name=".BluetoothCommunicationService"
android:process=":nameNewProcessThatYourServiceWillUseHere"/>
现在,您的服务将在独立于初始应用程序进程的进程上运行
首先,我创建的应用程序必须在后台工作
(即使用户终止了应用程序)
除非你是一个系统应用,否则你不是。Android的应用程序模型非常清楚,应用程序不能强迫自己持续运行,这是有充分理由的。如果你手机上有大量的应用程序决定这么做怎么办?移动设备不是台式计算机。他们有电池,不能在后台连续旋转的过程中达到合理的电池寿命。为了获得合理的电池寿命,Android依赖于在没有任何事情发生时能够让CPU进入睡眠状态
此外,如果用户刷走您的活动,应用程序将处于非活动状态。这意味着它无法接收广播(包括alarm manager唤醒),只能由从启动器启动您的活动的用户、启动您的活动的另一个应用程序或启动应用程序内服务的另一个应用程序重新启动。对于新安装的应用程序也是如此:在您明确使用它们之前,它们无法运行
对于非系统应用程序,最好使用+START\u STICKY
。这是Android最有力的指标,表明你的服务很重要,不应该被终止
系统应用程序可以在其清单中声明它们自己是持久的,并且它们的进程永远不会被终止。除非你正在构建Android dist并自己刷新它,尽管这不是一个选项
首先,我创建的应用程序必须在后台工作
(即使用户终止了应用程序)
除非你是一个系统应用,否则你不是。Android的应用程序模型非常清楚,应用程序不能强迫自己持续运行,这是有充分理由的。如果你手机上有大量的应用程序决定这么做怎么办?移动设备不是台式计算机。他们有电池,不能在后台连续旋转的过程中达到合理的电池寿命。为了获得合理的电池寿命,Android依赖于在没有任何事情发生时能够让CPU进入睡眠状态
此外,如果用户刷走您的活动,应用程序将处于非活动状态。这意味着它无法接收广播(包括alarm manager唤醒),只能由从启动器启动您的活动的用户、启动您的活动的另一个应用程序或启动应用程序内服务的另一个应用程序重新启动。对于新安装的应用程序也是如此:在您明确使用它们之前,它们无法运行
对于非系统应用程序,最好使用+START\u STICKY
。这是Android最有力的指标,表明你的服务很重要,不应该被终止
系统应用程序可以在其清单中声明它们自己是持久的,并且它们的进程永远不会被终止。除非您正在构建Android dist并自己刷新它,尽管这不是一个选项。如果之前启动过,您的服务应该在一段时间后重新启动,返回START\u Stick或START\u REDELIVER\u INTENT并在清单中声明。Android将决定时间,并将其记录在监视器控制台中。它说的是:
Scheduling restart of crashed service com.company.app/MyService in 1000ms
哦,如果您想在Android Studio中看到此消息,请确保将Android监视器logcat设置为详细且无过滤器。按服务的类名进行筛选也会有所帮助,例如:
同样,首先要确保您的服务正在运行。如果你不在舱单上申报,我