web-dev-qa-db-ja.com

アプリケーションを最初のアクティビティから強制的に再起動します(権限が拒否された場合)

Androidで実行時にdeny権限を拒否すると= 6.0およびresume最近のメニューからアプリを実行すると、アプリプロセスが強制終了され、アプリは強制的に再起動しました。これは、セキュリティ上の問題を防ぐためであるとされています。

enter image description here

再開すると、アプリが最後のActivityから再起動することは注目に値します。OSは、ユーザーが最後にアクセスしたActivityを追跡しているようです。

残念ながら、これはビジネスロジックの流れを妨げるため、問題になります。この方法でユーザーがアプリに途中でアクセスすることを許可することはできません。

私の質問は、ユーザーがアプリを残したものではなく、アプリケーションの最初のActivityからアプリを強制的に再起動する方法はありますか?

アプリケーションの再起動/プロセスの強制終了/権限の切り替えに関連するコールバックはありますか?

これは間違ったアプローチですか?もしそうなら、どのように?そして、正しいアプローチは何でしょうか?

この動作はもちろん以前に観察されています:

1。AndroidプレビューM:権限付与後にアクティビティが再作成されます

2。Android Mネクサス6

3。Android Marshmallow:実行中のアプリの権限の変更

4。「アプリの設定をリセット」を押すと、アプリのすべての権限が取り消されます

5。Android 6の権限-設定で権限を切り替えてアプリに戻るとクラッシュします

23
Y.S

これはどういう意味ですか?

主な活動:

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が初めて呼び出されたときと再開されたときに権限ダイアログが表示されるようにします。

1
Anand Joshi

Activityによって提供されたBundleを使用して、onCreate(再)作成を処理する必要があります。onSaveInstanceStateによって保存されます。詳細 ここ

以前の状態から回復し、UIをシームレスに復元するために必要なすべてをBundleに渡します。 Activityはさまざまな理由で再作成できます。権限のキャンセルはその1つにすぎず、画面の回転は別の理由です。1つを生き残ることができる限り、すべてを生き残ることができます。

0
mFeinstein

誰かがまだこれに対する答えを探しているかどうかはわかりませんが、許可の拒否による再起動/再作成を示すフラグを待つのではなく、ロジックを逆にすることで解決します。アクティビティは別のアクティビティによって開始され、システムによって再作成されませんでした。したがって、FLAGが追加で提供されない場合は、アクティビティスタックを破棄し、最初のアクティビティを起動する必要があります。

それが誰かを助けることを願っています。

0
phsa