Видимая задержка между обратным вызовом разрешений и предоставленными разрешениями

Итак, это приложение Lollipop (5.0) с загрузочным приемником. Приемник загрузки запускает действие (SplashActivity.class). Цель SplashActivity - получить все необходимые разрешения перед запуском MainActivity.class.

public class SplashActivity extends Activity {

private static boolean bPermission = false;
private static final int MY_PERMISSIONS_REQUEST = 100;
private static final String[] allRequestedPermissions = new String[] {
        Manifest.permission.READ_CONTACTS,
        Manifest.permission.SEND_SMS,
        Manifest.permission.CALL_PHONE
};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if (getIntent().hasExtra("PERMISSION_FOR_SERVICE")) {
        bPermission = true;
    }
    if (!checkAllRequestedPermissions()) {
        ActivityCompat.requestPermissions(this, allRequestedPermissions, MY_PERMISSIONS_REQUEST);
    }
    else {
        startMainActivity();
    }
}

private boolean checkAllRequestedPermissions() {
    for (String permission : allRequestedPermissions) {
        if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
            return false;
        }
    }
    return true;
}

private boolean isServiceRunning(Class<?> serviceClass) {
    ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
    for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
        if (serviceClass.getName().equals(service.service.getClassName())) {
            return true;
        }
    }
    return false;
}

@Override
public void onRequestPermissionsResult(int requestCode,
                                       String permissions[], int[] grantResults) {
    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST: {
            if (checkAllRequestedPermissions()) {
                    startMainActivity();
            }
            else {
                finish();
            }
            return;
        }

        // other 'case' lines to check for other
        // permissions this app might request
    }
}

private void startMainActivity() {
    Intent intent = new Intent(this, MainActivity.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);
    if (bPermission) {
        intent.putExtra("PERMISSION_FOR_SERVICE","_");
    }
    startActivity(intent);
}

}

Что в конечном итоге происходит после всей проверки и запроса разрешений (если вы прокрутите вниз), так это то, что он запускает MainActivity.

Проблема в том, что я бы предпочел, чтобы он не запускал MainActivity в случае, когда bPermission == true. Если bPermission == true, предпочел бы следующее поведение:

private void startMainActivity() {
    if (bPermission) {
        startService(new Intent(this, SchedulerService.class));
        finish();
    }
    else {
        Intent intent = new Intent(this, MainActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);

        intent.putExtra("PERMISSION_FOR_SERVICE", "_");
        startActivity(intent);
    }

}

Но это приводит к сбою приложения. Есть идеи, что может быть не так? Спасибо заранее

ПОСТАНОВИЛИ: У моего сервиса была зависимость, о которой не было известно. Инициализация зависимости перед запуском службы исправлена! Спасибо @mike m. !!

Посмотрите на трассировка стека, чтобы определить причину сбоя.

Mike M. 17.12.2018 03:40

Проверяем, ловит ли отладчик при запуске ..

mike morris 17.12.2018 03:43

Не зашел так далеко: он говорит о нулевом указателе на SchedulerService

mike morris 17.12.2018 03:45

Где происходит Исключение? В Service?

Mike M. 17.12.2018 03:47

Процесс: com.better_computer.habitaid, PID: 6810 java.lang.RuntimeException: невозможно создать экземпляр службы com.better_computer.habitaid.scheduler.SchedulerService: java.lang.NullPointerException: попытаться вызвать виртуальный метод android.os.Looper android. content.Context.getMainLooper () 'для ссылки на нулевой объект в android.app.ActivityThread.handleCreateService (ActivityThrea‌ d.java:3088)

mike morris 17.12.2018 03:51

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

Mike M. 17.12.2018 03:55

Похоже, вы создаете экземпляр этого DatabaseHelper в инициализаторе поля в вашем Service. То есть у вас есть что-то вроде private DatabaseHelper helper = new DatabaseHelper(this); вне любого метода класса в SchedulerService. Вы не можете использовать Service в качестве Context, поскольку Context еще не был установлен в экземпляре Service. Переместите этот экземпляр в метод; например, onCreate().

Mike M. 17.12.2018 04:08

Вот и все, просто нужно было инициализировать DatabaseHelper перед запуском службы !! :-D :) БОЛЬШОЕ СПАСИБО!

mike morris 17.12.2018 04:11
0
8
24
1

Ответы 1

РЕШЕНО: у моей службы была зависимость, о которой не было известно. Инициализация зависимости перед запуском службы исправлена! Спасибо @Mike M. !!

Другие вопросы по теме