Androidで実行時にdeny権限を拒否すると= 6.0およびresume最近のメニューからアプリを実行すると、アプリプロセスが強制終了され、アプリは強制的に再起動しました。これは、セキュリティ上の問題を防ぐためであるとされています。
再開すると、アプリが最後のActivity
から再起動することは注目に値します。OSは、ユーザーが最後にアクセスしたActivity
を追跡しているようです。
残念ながら、これはビジネスロジックの流れを妨げるため、問題になります。この方法でユーザーがアプリに途中でアクセスすることを許可することはできません。
私の質問は、ユーザーがアプリを残したものではなく、アプリケーションの最初のActivity
からアプリを強制的に再起動する方法はありますか?
アプリケーションの再起動/プロセスの強制終了/権限の切り替えに関連するコールバックはありますか?
これは間違ったアプローチですか?もしそうなら、どのように?そして、正しいアプローチは何でしょうか?
この動作はもちろん以前に観察されています:
1。AndroidプレビューM:権限付与後にアクティビティが再作成されます
3。Android Marshmallow:実行中のアプリの権限の変更
これはどういう意味ですか?
主な活動:
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();
}
});
}
}
アクティビティ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;
}
}
}
}
アクティビティBのonRequestPermissionsResultからsplashActivity/HomeActivityを開始できます。アクティビティBのonResumeで権限を確認して、ActivityBが初めて呼び出されたときと再開されたときに権限ダイアログが表示されるようにします。
Activity
によって提供されたBundle
を使用して、onCreate
(再)作成を処理する必要があります。onSaveInstanceState
によって保存されます。詳細 ここ 。
以前の状態から回復し、UIをシームレスに復元するために必要なすべてをBundle
に渡します。 Activity
はさまざまな理由で再作成できます。権限のキャンセルはその1つにすぎず、画面の回転は別の理由です。1つを生き残ることができる限り、すべてを生き残ることができます。
誰かがまだこれに対する答えを探しているかどうかはわかりませんが、許可の拒否による再起動/再作成を示すフラグを待つのではなく、ロジックを逆にすることで解決します。アクティビティは別のアクティビティによって開始され、システムによって再作成されませんでした。したがって、FLAGが追加で提供されない場合は、アクティビティスタックを破棄し、最初のアクティビティを起動する必要があります。
それが誰かを助けることを願っています。