如何在应用程序运行时处理吊销权限?

时间:2018-10-10 13:57:23

标签: android

我正在考虑以下问题: 用户使用该应用程序,将其置于后台,进入设备设置并撤消权限。

应用程序进程被终止,Activity堆栈被重新创建,但是我有一堆o Singletons现在已经死了,在正常的应用程序启动中,它们在启动屏幕上被初始化。

现在,最好的解决方案是终止当前进程a,重新启动整个应用程序,然后再次请求权限,因为没有一定的权限我就无法使用该应用程序,问题是:我应该如何做到这一点?

我想并且对我有用的唯一方法是检查我的应用程序中每个活动的onCreate中是否具有许可(并返回+重新启动应用程序)。我认为这似乎是一个丑陋的解决方案,所以我想问你如何处理这种情况。

4 个答案:

答案 0 :(得分:0)

您不能假设在Android上始终会看到闪屏。如果用户要使用后台,那么您会将您从最近的人带回来,您可能会在两个事件之间被杀死,并在内部活动中重新启动。您需要编写代码来检测并处理它-通过在每个活动的onCreate中重新创建单例,或者检查条件并重定向到启动屏幕以重新创建它们(如果在本地花费太长时间)。

答案 1 :(得分:0)

这就是通常应该避免在Android上出现单例的原因。如果没有,则在Application覆盖中初始化。 但是,要以不太麻烦的方式解决问题,可以使用

getApplicaton().registerActivityLifecycleCallbacks(yourCustomClass);

yourCustomClass负责检查权限状态并重新启动您的应用。

答案 2 :(得分:0)

考虑到我需要维护的应用程序存在许多错误的书面代码,单例需要执行请求才能进行初始化等等。我最终得到的解决方案如下:

1-我在“ BaseActivity”中创建了自己的抽象onCreate,称为onCreateSafely

2-我在“ BaseActivity”决赛中制作了onCreate,因此没有人可以覆盖它(这样做是为了迫使开发人员使用onCreateSafely)

3-在“ BaseActivity”的onCreate中,仅当授予我的权限并且单身感觉良好时,我才调用onCreateSafely。否则,如果这不是SplashScreen活动(初始化它们),我将调用finishAffinity并启动SplashScreen活动。

4-我在子活动中将onCreate的代码移到了onCreateSafely

#thanksgoogle

(如果我可以在撤消许可后使用一些标志来更改应用程序的行为(“完全重启”时会容易得多)

答案 3 :(得分:-1)

您可以创建一个执行此操作的基本活动类,然后使所有其他活动对其进行扩展。检查功能将在onResume中,因为在应用程序之间切换不会调用onCreate。并且根据权限的重要程度,您可以采取措施,例如退出应用程序。