Android程序一个因requestPermission导致不停onResume(不停打印Timeline: Activity_launch_request time)的问题

自己写的一个Android测试程序,在真机上面调试的时候,发现按钮有时候无法点击,通过日志发现点击事件确实没有触发,而不是点击处理逻辑卡顿;再多次调试,发现系统在不停地打印Timeline: Timeline: Activity_launch_request time。通过搜索,根据文章

 Android问题新增 

分析为onResume不停调用导致。添加日志发现确实在不停触发onResume。分析onResume中代码如下:

 override fun onResume() {
        super.onResume()

        ActivityCompat.requestPermissions(this, mutableListOf(Manifest.permission.READ_PHONE_STATE
                ,Manifest.permission.READ_CONTACTS,Manifest.permission.READ_CALL_LOG
                ,Manifest.permission.WRITE_CONTACTS,Manifest.permission.CALL_PHONE
                ,Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE).toTypedArray(), 1);

    }

即在onResume中请求权限。问题即在该处:由于没有判断是否已经获取到权限,而直接请求权限,系统会吊起权限询问对话框,页面onPause,对话框中会检测是否用于所有申请的权限,如果有那么直接关闭(时间很快,用户无法感知这个对话框),页面onResume,然后死循环重复执行申请权限,导致整个页面卡顿。

改进方法为:

一、申请权限时,先检测是否用于该权限,没有再申请;

二、如果这个页面是首页,可以在onCreate中直接申请权限,只会执行一次。

方法一为推进方法。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要编写一个 Android 应用程序来检测 U 盘的插入,您需要使用 USB 设备 API。以下是一些基本步骤: 1. 在 AndroidManifest.xml 文件添加必要的权限: ```xml <uses-permission android:name="android.permission.USB_PERMISSION" /> ``` 2. 在您的 Activity 注册 USB 设备事件: ```java private static final String ACTION_USB_PERMISSION = "com.example.USB_PERMISSION"; private PendingIntent mPermissionIntent; private UsbManager mUsbManager; // 在 onCreate() 方法初始化 UsbManager 和 PendingIntent @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mUsbManager = (UsbManager) getSystemService(Context.USB_SERVICE); mPermissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0); } // 在 onResume() 方法注册 USB 设备事件 @Override protected void onResume() { super.onResume(); IntentFilter filter = new IntentFilter(); filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED); filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED); registerReceiver(mUsbReceiver, filter); } // 在 onPause() 方法取消注册 USB 设备事件 @Override protected void onPause() { super.onPause(); unregisterReceiver(mUsbReceiver); } // USB 设备事件接收器 private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) { // U 盘插入 UsbDevice device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); if (device != null) { if (mUsbManager.hasPermission(device)) { // 已经有权限 // 可以在这里执行读写 U 盘的操作 } else { // 没有权限,申请权限 mUsbManager.requestPermission(device, mPermissionIntent); } } } else if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)) { // U 盘拔出 UsbDevice device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); if (device != null) { // 可以在这里执行关闭 U 盘的操作 } } } }; ``` 上述代码,我们使用 BroadcastReceiver 来接收 USB 设备事件。当 U 盘被插入时,我们检查是否有权限读写 U 盘。如果没有权限,我们向用户请求权限。当 U 盘被拔出时,我们可以执行必要的清理操作。 这只是一个简单的示例代码,实际上还需要更多的代码来读写 U 盘数据。您可以查看 Android 官方文档以获取更多信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值