为什么首先执行运行时权限调用后的代码?

时间:2016-10-24 20:07:02

标签: android permissions location locationmanager oncreate

在我的onCreate()方法中,我显示了在权限选择对话框出现之前正在执行的Toast,即使我先请求权限。为什么吐司首先出现?

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

    provider = locationManager.getBestProvider(new Criteria(), false);


    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED)
    {

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, MY_PERMISSIONS_REQUEST_CODE);
        }


    }

    Toast.makeText(MainActivity.this, "oncreate", Toast.LENGTH_SHORT).show();




}

1 个答案:

答案 0 :(得分:3)

您调用的requestPermissions方法以异步方式运行,因此一旦该调用转到新线程并返回到主线程,则Toast可能会出现在对话框之前。它只取决于在后台完成了多少工作以及哪个线程更快。

有关权限和异步部分的详细信息,请查看此处的文档:https://developer.android.com/training/permissions/requesting.html#perm-request

  

此方法异步运行:它立即返回,在用户响应对话框后,系统调用应用程序的回调方法并将结果传递给app传递给requestPermissions的相同请求代码( )。