撤销应用权限时应用重启,如何检测应用重启时机?
检测应用重启的可行方案
以下几种方法可以帮你检测应用因权限变更导致的重启:
通过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
相关产品推荐
相关产品推荐

