Сервис и BroadcastReceiver не работают в телефоне MI во время уничтожения памяти или уничтожения активности - PullRequest
1 голос
/ 25 апреля 2019

Я создаю один RestartServiceBroadcast, чтобы мой фоновый сервис всегда оставался в живых после закрытия приложения.

  public class RestartServiceBroadcast extends BroadcastReceiver {

                Context ctx;
                private PreferencesProviderWrapper prefProviderWrapper;

                @Override
                public void onReceive(Context context, Intent intent) {
                    this.ctx= context;
                    System.out.println("RestartServiceBroadcast:");
                    if(intent.getAction().equals(ipManager.INTENT_SERVICE_RESTART)){
                        startOneService();
                    }

                }

                private void startOneService() {


            }
                }

Здесь я также создаю один сервис для подключения IP-адреса сервера, в котором я также запускаю широковещательную рассылку для перезапуска того же сервиса. Я также использую START_STICKEY в Сервисе

public class IpService extends Service {

@Override
    public void onCreate() {
        super.onCreate();

    }

@Override
    public void onDestroy() {
        super.onDestroy();
        System.out.println("ipStack : onDestroy");

        Intent broadcastIntent = new Intent(ipManager.INTENT_SERVICE_RESTART);
        sendBroadcast(broadcastIntent);
    }
}

Я вызываю Broadcast в методе mainActivity onDestroy ().

 override fun onDestroy() {
           val broadcastIntent = Intent(ipManager.INTENT_SERVICE_RESTART)
            sendBroadcast(broadcastIntent)
            super.onDestroy()
        }

Это мой манифест

 <service
            android:name=".service.ipService"
            android:enabled="true"
            android:exported="false"
            android:permission="demo.magic.mobile.android.permission.CONFIGURE_IP"
            android:process=":ipStack"
            android:stopWithTask="false">
            <intent-filter>
                <action android:name="demo.magic.mobile.service.ipService" />
                <action android:name="demo.magic.mobile.service.ipConfiguration" />
            </intent-filter>
        </service>




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

Класс ipManager для получения значения Broadcast

public final class ipManager {

    public static final String INTENT_SIP_SERVICE_RESTART = "demo.magic.mobile.service.RestartService";
}

Весь код работает нормально на моих устройствах motoG5 и MI Note5 Pro. но в устройствах MI note4 и MI4 служба и широковещание были убраны после удаления приложения из фона.

MotoG5 и другие устройства Logcat Вот так, когда я убиваю приложение.

2019-04-25 15:27:00.220 2345-3735/? W/ActivityManager: Scheduling restart of crashed service demo.magic.mobile/.service.ipService in 20942ms
2019-04-25 15:27:21.192 2345-2410/? I/ActivityManager: Start proc 23954:demo.magic.mobile:ipStack/u0a247 for service demo.magic.mobile/.service.ipService
2019-04-25 15:27:21.490 23954-23954/demo.magic.mobile:ipStack I/System.out: ipStack : onstart 

Logcat процесса приложения MI Note4 kill

2019-04-25 15:26:04.584 1604-2918/? I/ActivityManager: Start proc 10971:demo.magic.mobile:ipStack/u0a643 for service demo.magic.mobile/.service.ipService caller=demo.magic.mobile
2019-04-25 15:36:04.216 1604-2785/? I/ActivityManager: Start proc 19393:demo.magic.mobile:ipStack/u0a643 for service dailer.demo.magic.mobile/.service.ipService caller=demo.magic.mobile

Помощь будет оценена, спасибо заранее.

Ответы [ 2 ]

1 голос
/ 02 июля 2019

Наконец-то я получил идеальное решение.Я тестирую в oreo со всеми ОС, такими как кислород, цвет и miui.Я разрабатываю приложение VoIP, и в моем приложении одна служба sip продолжает работать после того, как приложение уничтожено или уничтожено пользователем.Еще одно, что пользовательское приложение всегда работает в фоновом режиме и оптимизирует заряд батареи в настройках телефона.

Я использую Alarm Manager For. Для того, чтобы мой сервис был активным, это лучше, чем планировщик заданий и снова вызвать сервис.Я реализую этот код в методе класса обслуживания oncreate ().

 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"
                android:process=":sipStack">
                <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>
1 голос
/ 25 апреля 2019

Используйте этот метод в классе обслуживания

@Override 
    public void onTaskRemoved(Intent rootIntent){
        Intent broadcastIntent = new Intent(ipManager.INTENT_SERVICE_RESTART);
        sendBroadcast(broadcastIntent);
    }
...