webentwicklung-frage-antwort-db.com.de

Neustart der Anwendung von der ersten Aktivität aus erzwingen (wenn eine Berechtigung verweigert wird)

Es ist bekannt, dass, wenn wirverweigernBerechtigungen zur Laufzeit in Android 6.0 undfortsetzendie App aus dem letzten Menü, der App-Prozess ist getötet und die App istzwangsweise neu gestartet. Dies ist angeblich, um jegliche Sicherheitslücken zu schließen:

 enter image description here

Es ist bemerkenswert, dass nach dem Fortsetzendie App wird von dem letzten Activityneu gestartet, auf dem wir sie belassen habenDas Betriebssystem verfolgt anscheinend den letzten Activityname__, den der Benutzer besucht hat.

Leider ist dies ein Problem, da es den Fluss der Geschäftslogik unterbricht. Auf diese Weise kann der Benutzer nicht auf die App zugreifen.

Meine Frage ist, gibt es eine Möglichkeit, den Neustart der App vom ersten Activityder Anwendung aus zu erzwingen, anstatt von dem, auf dem der Benutzer sie belassen hat?

Gibt es Rückrufe im Zusammenhang mit einem Neustart der Anwendung/Prozessabbruch/Berechtigungsumschaltung?

Ist das ein falscher Ansatz? Wenn das so ist, wie? Und was wäre der richtige Ansatz?

Dieses Verhalten wurde natürlich schon einmal beobachtet:

1. Android Preview M: Aktivität wird nach Erteilung der Erlaubnis neu erstellt

2. Die Anwendung wird beendet, nachdem die Berechtigungen für die Einstellungen in Android M nexus 6 aktiviert/deaktiviert wurden.

3. Android Marshmallow: Berechtigungsänderung zum Ausführen der App

4. Alle Berechtigungen meiner App werden widerrufen, nachdem Sie auf "App-Einstellungen zurücksetzen" geklickt haben.

5. Android 6-Berechtigung - Abstürze beim Umschalten der Berechtigung in der Einstellung und Rückkehr zur App

19
Y.S.

Meinten Sie das?

Hauptaktivität:

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();
        }
    });
}
}

Aktivität B:

    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;
        }
    }
}
}

Sie können splashActivity/HomeActivity von onRequestPermissionsResult of ActivityB aus starten. Überprüfen Sie die Berechtigung in onResume of ActivityB, sodass das Dialogfeld für Berechtigungen angezeigt wird, wenn ActivityB zum ersten Mal aufgerufen wird und auch, wenn es fortgesetzt wird.

1
Anand Joshi

Sie sollten Activity (re) creation mit der von Bundle bereitgestellten onCreate handhaben, die von onSaveInstanceState gespeichert wurde. Weitere Informationen finden Sie hier .

Übergeben Sie die Bundle, die Sie benötigen, um einen früheren Zustand wiederherzustellen und Ihre Benutzeroberfläche nahtlos wiederherzustellen. Ihre Activity kann aus vielen Gründen neu erstellt werden. Die Aufhebung von Berechtigungen ist nur eine davon. Die Bildschirmrotation ist eine andere. Solange Sie eine überleben können, können Sie alle überleben.

0
mFeinstein