Принудительное применение для перезапуска с первой активности (когда разрешение отклонено)

Известно, что когда мы запрещаем разрешения во время выполнения в Android 6.0 и возобновить приложение из последнего меню, процесс приложения убит и приложение принудительно перезапущен. Это, как утверждается, для предотвращения любого безопасного сна:

введите описание изображения здесь

Замечательно, что при возобновлении, приложение перезапускается с последнего Activity, мы его оставили. OS, по-видимому, отслеживает последний Activity пользователь, посетивший.

К сожалению, это проблема, так как она нарушает поток бизнес-логики. Таким образом, пользователю недоступно доступ к приложению в середине пути.

Мой вопрос в том, есть ли способ заставить приложение перезапуститься с первого Activity приложения, а не на того, на котором он оставил его?

Есть ли какие-либо обратные вызовы, связанные с перезагрузкой/обработкой процессов/разрешениями?

Это неправильный подход? Если да, то как? И какой будет правильный подход?

Это поведение, конечно, наблюдалось до:

1. Android Preview M: активность воссоздается после разрешения

2. Приложение становится убитым после включения/выключения разрешений из настроек на Android M nexus 6

3. Android Marshmallow: изменение разрешений для запуска приложения

4. Все права доступа моего приложения отменены после нажатия "Reset настроек приложения" .

5. Разрешение Android 6 - сбой при переключении разрешения в настройке и возврат в приложение p >

Ответы

Ответ 1

Значит ли это это?

MainActivity:

public class MainActivity extends AppCompatActivity {

TextView txt;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    txt = (TextView)findViewById(R.id.txt);

    txt.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            Intent intent = new Intent(MainActivity.this, ActivityB.class);
            intent.putExtra("from","MainActivity");
            startActivity(intent);
            finish();
        }
    });
}
}

ActivityB:

    public class ActivityB extends AppCompatActivity {

String intentTxt="";
final int MY_PERMISSIONS_REQUEST_PHONE_CALL = 1;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_b);
    intentTxt = getIntent().getStringExtra("from");
}


@Override
protected void onResume() {
    super.onResume();
    if(intentTxt.equals("MainActivity")) {
        if (ContextCompat.checkSelfPermission(ActivityB.this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

            ActivityCompat.requestPermissions(ActivityB.this, new String[]{android.Manifest.permission.CALL_PHONE},
                    MY_PERMISSIONS_REQUEST_PHONE_CALL);
        }
    }
        intentTxt = "";
}

@Override
public void onRequestPermissionsResult(int requestCode,
                                       String permissions[], int[] grantResults) {
    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST_PHONE_CALL: {
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + "32434"));
                startActivity(intent);

            } else {

                Intent intent = new Intent(ActivityB.this,MainActivity.class);
                startActivity(intent);
                finish();
            }
            return;
        }
    }
}
}

Вы можете запустить splashActivity/HomeActivity из onRequestPermissionsResult of ActivityB.Проверьте разрешение в onResume ActivityB, чтобы появилось диалоговое окно разрешения при первом вызове ActivityB, а также при возобновлении.

Ответ 2

Вы должны обрабатывать Activity (пере) создание, используя Bundle, предоставленный onCreate, сохраненный onSaveInstanceState, больше информации здесь.

Передайте Bundle все, что вам нужно для того, чтобы восстановить прежнее состояние и полностью восстановить свой пользовательский интерфейс. Ваш Activity может быть воссоздан по многим причинам, отмена разрешений - только одна из них, поворот экрана - другая, поэтому, пока вы можете выжить, вы можете пережить все из них.

Ответ 3

Я не знаю, ищет ли кто-нибудь еще ответ на этот вопрос, но я решил бы, изменив логику, вместо ожидания флага, указывающего на перезапуск/воссоздание из-за отказа в разрешении, передайте флаг, указывающий, что Активность была запущена другой Активностью и не воссоздана системой. Таким образом, если FLAG не входит в дополнительные функции, то стек действий должен быть уничтожен, а первая активность запущена.

Надеюсь, это кому-нибудь поможет.