Android не обнаруживает маяк в фоновом режиме

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

public class BeaconApplication extends Application implements BootstrapNotifier{

private static final String TAG = "BeaconApplication";
private RegionBootstrap regionBootstrap;
private BackgroundPowerSaver backgroundPowerSaver;
private boolean haveDetectedBeaconsSinceBoot = false;
private MainActivity mainActivity = null;

@Override
public void onCreate() {
    super.onCreate();
    BeaconManager beaconManager = org.altbeacon.beacon.BeaconManager.getInstanceForApplication(this);
    beaconManager.getBeaconParsers().add(new BeaconParser().
            setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24,d:25-25"));
    beaconManager.setBackgroundScanPeriod(5000l); // 5 secs
    beaconManager.setForegroundScanPeriod(5000l); // 5 secs
    Log.d(TAG, "setting up background monitoring for beacons and power saving");
    Region region = new Region("backgroundRegion",
            Identifier.parse("fda50693-a4e2-4fb1-afcf-c6eb07647825"), Identifier.parse("10004"), Identifier.parse("54480"));
    regionBootstrap = new RegionBootstrap(this, region);

}

@Override
public void didEnterRegion(Region region) {
    Log.d(TAG, "did enter region. UniqueId: "+ region.getId1());
    if (!haveDetectedBeaconsSinceBoot) {
        Log.d(TAG, "auto launching MainActivity");
        sendNotification();

        haveDetectedBeaconsSinceBoot = true;
    } else {
        if (mainActivity != null) {
            mainActivity.logToDisplay("I see a beacon again" );
        } else {
            Log.d(TAG, "Sending notification.");
            sendNotification();
        }


 }

}



@Override
public void didExitRegion(Region region) {
    if (mainActivity != null) {
        mainActivity.logToDisplay("I no longer see a beacon.");
    }
}

@Override
public void didDetermineStateForRegion(int i, Region region) {
    if (mainActivity != null) {
        mainActivity.logToDisplay("I have just switched from seeing/not seeing beacons: " + i);
    }
}

private void sendNotification() {
    NotificationCompat.Builder builder =
            new NotificationCompat.Builder(this)
                    .setContentTitle("Welcome to beacon zone")
                    .setContentText("You are in a beacon zone.")
                    .setSmallIcon(R.mipmap.ic_launcher);

    TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
    stackBuilder.addNextIntent(new Intent(this, MainActivity.class));
    PendingIntent resultPendingIntent =
            stackBuilder.getPendingIntent(
                    0,
                    PendingIntent.FLAG_UPDATE_CURRENT
            );
    builder.setContentIntent(resultPendingIntent);
    Uri alarmSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    builder.setSound(alarmSound);
    builder.setAutoCancel(true);
    Notification notification = builder.build();
    notification.flags = Notification.DEFAULT_LIGHTS;
    notification.flags = Notification.FLAG_AUTO_CANCEL;
    notification.flags = Notification.FLAG_ONLY_ALERT_ONCE;
    NotificationManager notificationManager =
            (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);
    notificationManager.notify(1, notification);
}

public void setMonitoringActivity(MainActivity activity) {
    this.mainActivity = activity;
}
}

И вот мой файл манифеста

<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

<application
    android:name=".BeaconApplication"
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name=".MainActivity"
        android:label="@string/app_name"
        android:theme="@style/AppTheme"
        android:launchMode="singleInstance" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

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

</application>

person Suresh Kumar    schedule 18.09.2015    source источник
comment
Не знаю, почему этот вопрос получил минус. Что не так с этим вопросом?   -  person Suresh Kumar    schedule 18.09.2015
comment
Когда вы говорите «убить», вы имеете в виду смахивание с экрана из списка недавних задач или принудительную остановку в настройках приложения? Какая это модель устройства и версия ОС?   -  person davidgyoung    schedule 21.09.2015
comment
Привет, @davidgyoung, я имею в виду смахнуть это с экрана из списка недавних задач. Я использую Samsung Galaxy Note II - GT-N7100.   -  person Suresh Kumar    schedule 21.09.2015


Ответы (1)


Некоторые пользователи сообщают, что некоторые устройства Samsung запрещают функциональность приложений, если вы закрываете приложение из переключателя задач, пока оно не будет перезапущено вручную. Стандартное поведение Android заключается в том, что удаление приложения из переключателя задач разрешает автоматический перезапуск, но удаление приложения с принудительной остановкой в ​​настройках не позволяет автоматически перезапустить. Кажется, что в некоторых сборках Samsung смахивание с помощью переключателя задач приводит к нестандартной принудительной остановке, а не к обычной операции остановки, как это предписано Android.

Существует проблема с отслеживанием в библиотеке Android Beacon. Содержит ссылку на специальное тестовое приложение, которое вы можете создать и использовать, чтобы охарактеризовать, как эта функциональность работает на вашем устройстве. Следование инструкциям в этом выпуске и сообщение о результатах было бы очень полезно для выяснения того, что происходит. Хорошо это или плохо, но фрагментированная природа Android означает, что каждое устройство ведет себя немного по-разному и должно быть охарактеризовано отдельно.

В дополнение к выполнению вышеперечисленного было бы полезно знать версию операционной системы и номер сборки на конкретном устройстве, на котором возникла эта проблема.

person davidgyoung    schedule 21.09.2015