Мой сервис работает с Android 7.1.1, но не с Android 9 - PullRequest
0 голосов
/ 26 марта 2019

Мое приложение использует фоновый сервис для прослушивания изменений положения GPS. Работает на андроиде 7.1.1 (даже если моя активность закрыта или экран выключен). Когда я попробовал его на Android 9 (с AVD), он работает только тогда, когда активность находится на переднем плане, в противном случае нет. Похоже, что служба закрыта, когда приложение закрыто. Для minSdkVersion установлено значение 23. Почему приложение работает по-разному в разных API? Android не гарантирует совместимость приложений на новых версиях ОС?

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        /**code to request permission*/

        startService(new Intent(this, EventControllerService.class));

    }
}

public final class EventControllerService extends Service {
    private final static int MIN_TIME_FOR_GPS_UPDATES = 1;
    private final static float MIN_METER_FOR_GPS_UPDATES = 10.0f;
    private static NotificationManager mNotificationManager;
    private final BroadcastReceiver receiverDNDChange = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            //work on receive
        }
    };
    private final EventControllerService self = this;
    private final LocationListener locationListener = new LocationListener() {
        @Override
        public void onLocationChanged(Location location) {            
            Toast.makeText(self, "DENTRO", Toast.LENGTH_LONG).show();
            try {
                //work to do on position change
            } catch (SecurityException ignored) {                
                stopSelf();
            }
        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
        }

        @Override
        public void onProviderEnabled(String provider) {
        }

        @Override
        public void onProviderDisabled(String provider) {
        }
    };

    @Override
    public void onCreate() {
        super.onCreate();        
        try {
            mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

            IntentFilter filter = new IntentFilter();
            filter.addAction(NotificationManager.ACTION_INTERRUPTION_FILTER_CHANGED);
            registerReceiver(receiverDNDChange, filter);

            LocationManager mLocationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
            mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, MIN_TIME_FOR_GPS_UPDATES, MIN_METER_FOR_GPS_UPDATES, locationListener);
        } catch (SecurityException ignored) {           
            stopSelf();
        }
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
}

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="marcomantovani.pcd.silentmap">

    <uses-permission android:name="android.permission.ACCESS_NOTIFICATION_POLICY" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />


    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme"
        tools:ignore="AllowBackup,GoogleAppIndexingWarning">
        <service android:name=".EventControllerService"/>
        <receiver android:name="marcomantovani.pcd.silentmap.AutoStart">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

Как я могу изменить код, чтобы избежать этой проблемы?

Ответы [ 2 ]

2 голосов
/ 26 марта 2019

Насколько я понимаю, вы читаете это: https://developer.android.com/about/versions/oreo/background

В Android 9 есть много изменений, связанных с фоновыми службами и, в частности, с GPS. Обратите внимание также на это (поэтому нацеливание на API23 не является решением):

По умолчанию эти изменения затрагивают только приложения, ориентированные на Android 8.0 (уровень API 26) или выше.Однако пользователи могут включить эти ограничения для любого приложения на экране «Настройки», даже если приложение предназначено для уровня API ниже 26. Возможно, вам придется обновить приложение, чтобы соответствовать новым ограничениям.

Что вы можете сделать прямо сейчас и как мы заставляем это работать в наших приложениях.Переведите ваш сервис в режим совместимости с Android 9. Я предлагаю использовать:

startForegroundService()

Сделайте так, чтобы ваш сервис работал на переднем плане.Это небольшое изменение.Просто поменяйте один флаг и запустите свой сервис таким образом.

Показывать уведомление о том, что ваше приложение работает (это будет поддерживать ваше приложение работающим, даже если пользователь покидает приложение, в противном случае - ОС Android ограничит ваш сервис)

Таргетинг API23 также является плохой идеей, посколькуиз этого:

Начиная с 1 августа 2019 года Google Play требует, чтобы новые приложения были ориентированы как минимум на Android 9.0 (уровень API 28), а обновления приложений предназначались для Android 9.0 с 1 ноября 2019 года.даты, новые приложения и обновления приложений должны быть ориентированы как минимум на Android 8.0 (уровень API 26).

TL; DR 1. Перенести службу на передний план 2. Создать простое уведомление, которое сообщит вашему пользователю, что приложениеработает 3. Запустите сервис с помощью startForeground ()

0 голосов
/ 26 марта 2019

Android неуклонно движется, чтобы ограничить доступ к приложению в фоновом режиме.Службы определения местоположения были ограничены в Android 8.

Ссылка: https://developer.android.com/about/versions/oreo/android-8.0-changes#abll

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...