Il est connu que lorsque nous refusons autorisations lors de l'exécution dans Android 6.0 et reprise dans le menu récent, l'application est supprimée et l'application est redémarré de force. C'est prétendument dans le but d'empêcher tout snafus de sécurité:
Il est remarquable que, une fois repris, l'application redémarre depuis le dernier Activity
que nous avons laissé. L'OS garde apparemment une trace du dernier Activity
visité par l'utilisateur.
Malheureusement, cela pose un problème, car il interrompt le flux de la logique métier. L'utilisateur ne peut pas être autorisé à accéder à l'application en cours de cette manière.
Ma question est la suivante: y a-t-il un moyen de forcer l'application à redémarrer à partir de la première Activity
de l'application, au lieu de celle sur laquelle l'utilisateur l'a laissée?
Existe-t-il des rappels associés à une bascule application/redémarrage/arrêt/arrêt du processus?
Est-ce une approche erronée? Si c'est le cas, comment? Et quelle serait la bonne approche?
Ce comportement a bien sûr été observé auparavant:
1.Android Preview M: l'activité est recréée après l'octroi des autorisations
3.Android Marshmallow: les autorisations changent pour l'exécution de l'application
Est-ce que tu voulais dire ça?
Activité principale:
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();
}
});
}
}
Activité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;
}
}
}
}
Vous pouvez démarrer splashActivity/HomeActivity à partir de onRequestPermissionsResult of ActivityB.Vérifier l’autorisation dans onResume of ActivityB afin que la boîte de dialogue d’autorisations apparaisse lors de la première activation de ActivityB, ainsi que lors de sa reprise.
Vous devriez gérer Activity
(re) création en utilisant la Bundle
fournie par onCreate
, sauvegardée par onSaveInstanceState
, plus d'informations ici .
Transmettez dans la Bundle
tout ce dont vous avez besoin pour récupérer un état précédent et restaurer votre interface utilisateur de manière transparente. Votre Activity
peut être recréé pour plusieurs raisons. L'annulation des autorisations en est un exemple. La rotation d'écran en est un autre. Aussi longtemps que vous pouvez survivre à l'une d'elles, vous pouvez survivre à toutes.