Android Results API

开发过程中,我们经常需要从当前活动启动另一个活动获取一些数据,比如从图库选择图片,读取通讯录,拍照等,以前我们通常都是使用startActivityForResult去启动一个Activity,但是现在发现它过时了,官方推荐使用Activity Results API,下面我们看一下它的使用方式。

1、导入依赖

implementation 'androidx.activity:activity:1.2.0-beta01'
implementation 'androidx.fragment:fragment:1.3.0-beta01'

2、构建启动器

构建启动器,注册,注册接口处理返回结果。

ActivityResultLauncher<Intent> content = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(),
        new ActivityResultCallback<ActivityResult>() {
            @Override
            public void onActivityResult(ActivityResult result) {
                // 获取返回结果和返回的resultCode
                Intent data = result.getData();
                int resultCode = result.getResultCode();
                // 获取结果数据就可以做其他的逻辑了
                // data.getStringExtra("name");
            }
        });

注意我们这里的写法,需要启动活动,所以第一个参数是ActivityResultContracts.StartActivityForResult(),

如果是其他动作,找ActivityResultContracts下对应的类,比如权限申请,打开文件等等操作。

ActivityResultContracts.GetContent

ActivityResultContracts.openDocument

ActivityResultContracts.RequestPermission

ActivityResultContracts.PickContact

根据需要,我们还可以定义自己的协议类,继承自ActivityResultContracts类,而上面所提供的这些类也是这样实现的,比如PickContact这个类

public static final class PickContact extends ActivityResultContract<Void, Uri>{
    
}

ActivityReultLauncher:启动器,是一个泛型类,根据我们想要启动的Activity传入相应类型,如果不确定类型,可以随便传入一个,在确定ActivityResultContract类型之后再根据提示更改即可,启动器通过launch方法进行跳转。

ActivityResultContract:协议,它定义了传递的数据的类型和如何传递。

ActivityResultCallback:结果回调接口。

在合适的地方通过launch方法去启动一个活动,比如点击按钮等,当结果返回时会自动调用注册的回调函数。

content.launch(new Intent(this,MainActivity2.class));

那Activity中如何返回结果呢?使用方法和以前一样的

            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity2.this,MainActivity.class);
                intent.putExtra("name","我来自activity2");
                setResult(Activity.RESULT_OK,intent);
                finish();
            }

3、其他用法

查询联系人信息

ActivityResultLauncher<Void> contacts = registerForActivityResult(new ActivityResultContracts.PickContact(),
        new ActivityResultCallback<Uri>() {
            @Override
            public void onActivityResult(Uri result) {
                if (result!=null){
                    Cursor cursor = getContentResolver().query(result,null,null,null,null);
                    if (cursor.moveToFirst()){
                            String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
                        Log.d(TAG, "onActivityResult: "+name);
                    }
                }
            }
        });

启动

contacts.launch(null);

申请权限

ActivityResultLauncher<String> permission = registerForActivityResult(new ActivityResultContracts.RequestPermission(),
        new ActivityResultCallback<Boolean>() {
            @Override
            public void onActivityResult(Boolean result) {
                if (result){
                    Toast.makeText(MainActivity.this, "申请权限成功", Toast.LENGTH_SHORT).show();
                }else {
                    Toast.makeText(MainActivity.this, "申请权限失败", Toast.LENGTH_SHORT).show();
                }
            }
        });

启动器传入需要申请的权限名称

permission.launch(Manifest.permission.READ_CONTACTS);

拍张照

ActivityResultLauncher<Void> takePicture = registerForActivityResult(new ActivityResultContracts.TakePicturePreview(),
        new ActivityResultCallback<Bitmap>() {
            @Override
            public void onActivityResult(Bitmap result) {
                if (result!=null){
                    binding.imageView.setImageBitmap(result);
                }
            }
        });

启动

takePicture.launch(null);

4、注意事项

ActivityResultLauncher必需在activity的onCreate()方法或fragment的onCreate()、onAttach()前先注册,然后在需要调用的地方调用launch方法。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 5.0(API 21)之前的版本中,可以通过WifiInfo类的getFrequency()方法获取当前连接的Wi-Fi的频率信息。但是在Android 5.0及以上版本中,getFrequency()方法已经被废弃,需要使用其他的方式来获取Wi-Fi的频率信息。 以下是在Android 5.0之前获取Wi-Fi频率的示例代码: ```java WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); WifiInfo wifiInfo = wifiManager.getConnectionInfo(); int frequency = wifiInfo.getFrequency(); // 获取频率 ``` 如果要在Android 5.0及以上版本中获取Wi-Fi频率信息,可以使用WifiManager类的getWifiState()方法和WifiInfo类的getLinkSpeed()方法来计算。以下是示例代码: ```java WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); WifiInfo wifiInfo = wifiManager.getConnectionInfo(); int linkSpeed = wifiInfo.getLinkSpeed(); // 获取连接速度 int frequency = 0; if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) { frequency = wifiInfo.getFrequency(); } else { int wifiState = wifiManager.getWifiState(); if (wifiState == WifiManager.WIFI_STATE_ENABLED) { List<ScanResult> scanResults = wifiManager.getScanResults(); for (ScanResult scanResult : scanResults) { if (scanResult.BSSID.equals(wifiInfo.getBSSID())) { frequency = scanResult.frequency; break; } } } } int channelNumber = getChannelNumber(frequency); // 计算信道号 ``` 其中,getChannelNumber()方法用于计算Wi-Fi的信道号,示例代码如下: ```java private int getChannelNumber(int frequency) { int channelNumber = 0; if (frequency >= 2412 && frequency <= 2484) { channelNumber = (frequency - 2412) / 5 + 1; } else if (frequency >= 5170 && frequency <= 5825) { channelNumber = (frequency - 5170) / 5 + 34; } return channelNumber; } ``` 需要注意的是,计算信道号的方法只适用于2.4GHz和5GHz频段。如果是其他频段,需要根据实际情况进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值