从最近的应用程序关闭应用程序时服务停止

Posted

技术标签:

【中文标题】从最近的应用程序关闭应用程序时服务停止【英文标题】:Service stops at time of app close from recent applications 【发布时间】:2019-12-05 11:02:27 【问题描述】:

在我的一个应用程序中,我正在使用前台服务获取用户当前位置... 我的问题是当我从最近的应用程序中删除应用程序时,它会强制停止我的应用程序并停止我的服务 for this device i am getting such issue 我尝试了如下所示的服务

     @Override
      public void onTaskRemoved(Intent rootIntent) 

        super.onTaskRemoved(rootIntent);

//TRY 1 but not worked!!!!
//              Intent broadcastIntent = new Intent("uk.ac.shef.oak.ActivityRecognition.RestartSensor");
//              sendBroadcast(broadcastIntent);
//            stoptimertask();
//            Intent broadcastIntent = new Intent(this, SensorRestarterBroadcastReceiver.class);
//            sendBroadcast(broadcastIntent);
//
//            writeDataInLogFile("Service onTaskRemoved  ", " TRIED TO RESTART SERVICE FROM ONDESTROY   ");
            Log.i(TAG, "Task Removed!!!!!!!!!!!!!!!!!!!!!!");
            try 
//TRY 2 ALSO NOT WORKING
                Intent restartServiceIntent = new Intent(getApplicationContext(), this.getClass());
                restartServiceIntent.setPackage(getPackageName());

                PendingIntent restartServicePendingIntent = PendingIntent.getService(getApplicationContext(), 1, restartServiceIntent, PendingIntent.FLAG_ONE_SHOT);
                AlarmManager alarmService = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE);
                alarmService.set(
                        AlarmManager.ELAPSED_REALTIME,
                        SystemClock.elapsedRealtime() + 1000,
                        restartServicePendingIntent);
             catch (Exception e) 

在清单中,我已将上述服务添加为

<service
            android:name=".service.LocationUpdateForegroundService"
            android:enabled="true"
            android:stopWithTask="false"
            android:exported="true" />

但是,当我从最近的应用程序中删除应用程序时,它会强制关闭我的应用程序,如果我检查应用程序是否将其设置为强制关闭应用程序。(上述问题仅与某些设备有关.. 并非每个设备都出现此类问题设备 ) 我该怎么办?请帮我 根据建议,我喜欢参加我的服务班,但还没有得到我的解决方案!!!

  try 
            System.out.println("this is start!!!!!!!!!!!!!!!!!!!!");
            Intent intent = new Intent(this, PowerOnOffBroadcastReceiver.class);
            intent.setAction("service.RestartService");
            PendingIntent      mKeepAlivePendingIntent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
            ((AlarmManager) this.getSystemService(Context.ALARM_SERVICE)).setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + 10000, 10000, mKeepAlivePendingIntent);
        
        catch (Exception e)
        
            System.out.println("new implementation !!!!!!!!!!!!!!!!!");
        

我发现一些解决方案是:This 但是当用户单击最近活动的关闭按钮并从内存中清除所有应用程序时,它会停止我的服务

【问题讨论】:

手机安卓版本是多少? @Mr AF 请检查我在链接中提供的图片 【参考方案1】:

我有一个完美的解决方案。我正在使用所有操作系统(如氧气、颜色和 miui)在 oreo 中进行测试。我正在开发一个 VoIP 应用程序,在我的应用程序中,一个 sip 服务在应用程序被用户破坏或杀死后继续运行。用户设置应用程序的另一件事始终是在手机设置中运行后台和电池优化。

我正在使用警报管理器来保持我的服务活跃,它比作业调度程序和再次调用服务要好。我在服务类的 oncreate() 方法中实现了这段代码。

PendingIntent mKeepAlivePendingIntent;

     public class CallService extends Service 

                @Override
                public void onCreate() 
                    super.onCreate();
                    Intent intent = new Intent(this, RestartServiceBroadcast.class);
                    mKeepAlivePendingIntent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
                    ((AlarmManager) this.getSystemService(Context.ALARM_SERVICE)).setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + 60000, 60000, mKeepAlivePendingIntent);
                

            

当用户从内存任务中杀死应用程序时,创建 BroadcastReceiver 以再次调用服务

public class RestartServiceBroadcast extends BroadcastReceiver 
    @Override
    public void onReceive(Context context, Intent intent) 
        if (intent.getAction().equals("service.RestartService")) 
        // Here Call a Service
    

    

像这样显示

<receiver
                android:name=".service.receiver.RestartServiceBroadcast"
                android:enabled="true"
                android:exported="true">
                <intent-filter>
                    <action android:name="service.RestartService" />
                </intent-filter>
   </receiver>

        <service
            android:name=".service.CallService"
            android:enabled="true"
            android:exported="false"
            android:stopWithTask="false">

        </service>

谢谢,快乐的编码......

【讨论】:

嘿!我正在为此工作..请告诉什么是 mKeepAlivePendingIntent 和 android:process=":sipStack" 这里什么是 sipStack?和 A PendingIntent 是您给外部应用程序(例如 NotificationManager 、 AlarmManager 、 Home Screen AppWidgetManager 或其他 3rd 方应用程序)的令牌,它允许外部应用程序使用您的应用程序的权限来执行预定义的一段代码。 .....当调用广播时,它会检查广播中 onrecieve() 方法中的操作...... if (intent.getAction( ).equals("service.RestartService")) // 这里调用一个服务 嘿!我试过你的把戏。但是,如果我从最近的活动中删除应用程序,它对我不起作用,它会强制停止我的应用程序并且不会触发广播接收器。 这是什么意思?请解释

以上是关于从最近的应用程序关闭应用程序时服务停止的主要内容,如果未能解决你的问题,请参考以下文章

从 Android 中最近的应用程序中刷出应用程序时服务停止

使用任务管理器关闭应用程序时停止 Android 服务

关闭应用程序时停止 AsyncTask

当应用程序被刷掉时服务停止

活动停止/关闭时音乐服务停止?

关闭应用后服务不启动警报