web-dev-qa-db-ja.com

Android Marshmallowの動的アクセス許可の変更により、すべてのアプリケーションプロセスが強制終了される

観察:Androidアプリケーションの権限を手動で変更すると、このアプリケーションのすべてのプロセスが強制終了されました。

手順:[設定]-> [アプリ]に移動し、[アプリケーションと権限]を選択します。いずれかの権限を無効にします。デバイス:Android Marshmallow 6.0を実行しているNexus 6デバイス

ランチャーからアプリケーションを起動したところ、このアプリケーションの権限が変更される前の最上位のアクティビティが開始されました。これは、UIマルチタスクメニューからアプリケーションをスワイプしてアプリケーションプロセスを強制終了するときとは異なる動作です。その場合、ランチャーアクティビティが最初に作成されます。つまり、権限を変更した後にアプリケーションを起動すると、アプリケーションが正しく機能するために、起動するランチャーアクティビティに依存することはできません。

これは、すべてのAndroid 6.0+デバイス)の動的アクセス許可で予期される動作ですか?UIマルチタスクメニューからスワイプしてアプリケーションプロセスを強制終了したときと動作に違いがあるのはなぜですか?

27
user802467

つまり、権限を変更した後にアプリケーションを起動すると、アプリケーションが正しく機能するために、起動するランチャーアクティビティに依存することはできません。

それは何年も前からあった。たとえば、メモリ不足の状態が原因でプロセスが終了したが、ユーザーが最近(たとえば、過去30分以内)に行った場合、ユーザーが概要画面(「UIマルチタスクメニュー」)に戻り、アプリに戻ると、ユーザーが最後に行った(つまり、BACKスタックの一番上にあった)アクティビティの新しいインスタンスに制御が戻ります。

これは、すべてのAndroid 6.0+デバイス)の動的アクセス許可で予期される動作ですか?

はい。以前のすべてのAndroidデバイス、プロセスが終了したがタスクがまだ未解決で最近の場合)の予想される動作です。

アプリケーションプロセスがUIマルチタスクメニューからスワイプして強制終了されたときと動作に違いがあるのはなぜですか?

概要画面からタスクをスワイプすると、そのタスクが削除されます。したがって、ユーザーがアプリに戻って(ホーム画面のランチャーアイコンを介して)しようとしたときに、そのタスクを再利用することはできません。

15
CommonsWare

殺害の理論的根拠は次のようだと思います。それは並行性についてです。システムは、次の3つの可能なアプローチのいずれかを選択できます。

  1. サイレントで許可を取り消す。アプリには、これをチェックする方法がありません。「チェック」と「使用」の瞬間の間に取り消しが発生する可能性があるためです。

  2. アプリに通知する。この種の通知はアプリによって確認される必要があります。つまり、そのスレッドは無効化されたAPIにアクセスしなくなり、システムはAPIをオフにする可能性があります。これは優雅ですが、経験の浅いプログラマにとってプログラムするのは困難です。

  3. アプリを強制終了するには、次回の起動時に、権限が取り消されたことを正しく認識します。

2
beefeather