You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

撤销应用权限时应用重启,如何检测应用重启时机?

检测应用重启的可行方案

以下几种方法可以帮你检测应用因权限变更导致的重启:

  • 通过SharedPreferences记录启动时间戳
    在自定义Application的onCreate()方法中,每次启动时读取上次保存的启动时间,对比当前时间。如果时间差在合理范围内(比如10秒以内,排除正常冷启动的间隔),即可判定是权限变更触发的重启。每次启动都要更新时间戳。
    示例代码:

    public class MyApplication extends Application {
        @Override
        public void onCreate() {
            super.onCreate();
            SharedPreferences sp = getSharedPreferences("app_restart_check", MODE_PRIVATE);
            long lastLaunchTime = sp.getLong("last_launch_timestamp", 0);
            long currentTime = System.currentTimeMillis();
    
            // 时间差小于10秒,判定为权限变更导致的重启
            if (lastLaunchTime != 0 && currentTime - lastLaunchTime < 10000) {
                Log.d("RestartDetect", "应用因权限变更触发重启");
                // 这里可以执行重启后的逻辑
            }
    
            // 更新本次启动时间戳
            sp.edit().putLong("last_launch_timestamp", currentTime).apply();
        }
    }
    

    记得在AndroidManifest.xml中注册这个自定义Application类。

  • 监听Android 12+的系统重启广播
    Android 12及以上系统提供了ACTION_APPLICATION_RESTARTED广播,当应用被系统强制重启时会发送该广播。你可以通过动态注册广播接收器来监听:

    public class MainActivity extends AppCompatActivity {
        private BroadcastReceiver restartReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                if (Intent.ACTION_APPLICATION_RESTARTED.equals(intent.getAction())) {
                    Log.d("RestartDetect", "应用被系统重启");
                }
            }
        };
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            IntentFilter filter = new IntentFilter(Intent.ACTION_APPLICATION_RESTARTED);
            registerReceiver(restartReceiver, filter);
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            unregisterReceiver(restartReceiver);
        }
    }
    
  • 通过ActivityManager分析启动历史
    借助ActivityManager获取应用的近期任务信息,结合权限变更的时间点判断是否为重启场景。不过这个方法需要GET_TASKS权限,且在Android 11及以上版本中权限受限,需谨慎使用:

    ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
    List<ActivityManager.RecentTaskInfo> recentTasks = activityManager.getRecentTasks(1, 0);
    if (recentTasks != null && !recentTasks.isEmpty()) {
        ActivityManager.RecentTaskInfo taskInfo = recentTasks.get(0);
        // 结合权限变更记录,判断任务启动是否为重启导致
    }
    

内容的提问来源于stack exchange,提问作者NDC00

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 06:23:32