我在后台服务中播放音乐。一切正常,除非我从最近的应用程序列表中删除应用程序服务销毁。当没有媒体播放器时,我用来使服务以粘性方式运行的方法很好。这是我的代码
import xml.etree.ElementTree as ET
fwPolicy = ET.parse('policy.xml')
services = ET.parse('services.xml')
rules = fwPolicy.findall('./rule')
service = services.findall('./service')
for rule in rules:
ruleServices = rule.findall('./services/members/reference/Name')
for ruleService in ruleServices:
for objService in service:
objServiceName = objService.find('./Name').text
if ruleService.text == objServiceName:
print('Service search Found :', objServiceName)
XML File 1 policy.xml:
<Class_Name>rule_services</Class_Name>
<members>
<reference>
<Name>icmp-requests</Name>
<Table>services</Table>
</reference>
<reference>
<Name>gre</Name>
<Table>services</Table>
</reference>
</members>
</Class_Name>
XML File 2 services.xml:
<service>
<Name>icmp-requests</Name>
<Class_Name>service_group</Class_Name>
<members>
<reference>
<Name>echo-request</Name>
<Table>services</Table>
</reference>
<reference>
<Name>info-req</Name>
<Table>services</Table>
</reference>
<reference>
<Name>timestamp</Name>
<Table>services</Table>
</reference>
<reference>
<Name>mask-request</Name>
<Table>services</Table>
</reference>
</members>
</service>
<service>
<Name>echo-request</Name>
<Class_Name>icmp_service</Class_Name>
<icmp_type>8</icmp_type>
</service>
答案 0 :(得分:2)
您需要通过将属性android:process=":whatever"
添加到服务标记来指定服务在应用清单中的自己的进程中运行。这将确保在您的应用程序的主要流程即服务列表中删除该应用时,该服务不会被终止。
如果要在用户想要停止之前运行服务,请将其作为前台服务启动。您可以通过在某个时刻调用服务中的startForeground
来执行此操作。您需要将通知ID(您自己选择的整数)和通知传递给startForeground。通知将保留在任务栏中,直到用户停止服务。当然,您应该提供PendingIntent来停止通知或其中一个通知操作中的服务。
答案 1 :(得分:1)
当您的应用程序被销毁时,您的任何服务也会停止。问题是您可能只使用startService
启动服务,并使用stopService
停止服务。您要做的就是在服务类startForeground
内使用onStartCommand
方法启动服务。
@Override
public int onStartCommand(Intent i, int flags, int startId) {
Intent resultIntent = new Intent(SOME_INTENT_ACTION);
PendingIntent resultPendingIntent = PendingIntent.getBroadcast(this, 0, resultIntent, 0);
Notification noti = new Notification.Builder(getApplicationContext())
.setContentTitle(TITLE)
.setContentText(CONTENT_TEXT)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentIntent(resultPendingIntent)
.build();
startForeground(12345, noti);
return Service.START_STICKY;
}
然后你的服务将在另一个线程上运行,即使你的应用程序被杀死也能正常工作。请务必向用户显示本地通知,指出某些后台服务正在运行。