当应用程序与寡妇分离时,媒体播放器的Android服务被破坏

时间:2017-01-18 13:53:30

标签: android android-service android-mediaplayer

我在后台服务中播放音乐。一切正常,除非我从最近的应用程序列表中删除应用程序服务销毁。当没有媒体播放器时,我用来使服务以粘性方式运行的方法很好。这是我的代码

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> 

2 个答案:

答案 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;
    }

然后你的服务将在另一个线程上运行,即使你的应用程序被杀死也能正常工作。请务必向用户显示本地通知,指出某些后台服务正在运行。