2024-09-01
Android/Java
00

目录

需求
Activity的跳转
使用Intent在Activity之间传递信息
@Nullable Intent data
startActivity(intent)
获取Intent数据
github

【每日练手】history:

【Android】【Java】【每日练手1】字符串的二维码生成器

需求

基于zxing开发一个android软件,一个按钮打开摄像头,摄像头的内容会显示到手机屏幕,然后以尽可能快的方式调用zxing对每一帧画面进行二维码扫码,如果扫描到了二维码,那就滴一声后跳转到二维码扫描结果界面,这个功能很像微信扫码。

Activity的跳转

源码:

java
package com.example.gen_qr_code; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import androidx.annotation.Nullable; import android.content.Intent; import android.widget.Button; import com.google.zxing.integration.android.IntentIntegrator; import com.google.zxing.integration.android.IntentResult; public class MainActivity extends AppCompatActivity { private Button scanButton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); scanButton = findViewById(R.id.scanButton); scanButton.setOnClickListener(v -> { // 打开摄像头并显示预览 IntentIntegrator integrator = new IntentIntegrator(MainActivity.this); integrator.setBeepEnabled(true); integrator.setCameraId(0); // 选择摄像头,0为后置摄像头,1为前置摄像头 integrator.setOrientationLocked(false); // 是否锁定屏幕方向 integrator.initiateScan(); }); } @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); // 处理扫描结果 IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data); if (result != null) { String contents = result.getContents(); if (contents != null && !contents.isEmpty()) { // 扫描成功,可以根据需要进行处理 Intent intent = new Intent(this, ScanResultActivity.class); intent.putExtra("scan_result", contents); startActivity(intent); } } } }

在这段代码里,这个IntentIntegrator库在内部开启了新的activity,扫描后结果给到@Nullable Intent data:

// 打开摄像头并显示预览 IntentIntegrator integrator = new IntentIntegrator(MainActivity.this); integrator.setBeepEnabled(true); integrator.setCameraId(0); // 选择摄像头,0为后置摄像头,1为前置摄像头 integrator.setOrientationLocked(false); // 是否锁定屏幕方向 integrator.initiateScan();

onActivityResult是一个回调方法,用于处理在Activity中启动其他Activity并等待返回结果的情况。当启动的Activity结束并返回结果时,系统会调用onActivityResult方法来接收返回的结果数据。

在给定的代码中,onActivityResult方法被重写并添加了自定义的处理逻辑。当调用initiateScan()方法启动扫描界面后,用户完成扫描并返回结果后,系统会调用onActivityResult方法,并将结果数据传递给该方法的参数中(requestCode、resultCode和data)。在该方法内部,通过IntentIntegrator.parseActivityResult方法解析扫描结果,并判断是否成功扫描到内容。如果扫描成功,则将结果数据传递给ScanResultActivity并启动该Activity显示扫描结果。

在这里插入图片描述

使用Intent在Activity之间传递信息

这段代码是在onActivityResult方法中,用于启动一个新的Activity(ScanResultActivity)来显示扫描结果。

解释如下:

创建一个新的Intent对象:Intent intent = new Intent(this, ScanResultActivity.class);

Intent是用于在不同组件之间传递数据的对象。这里创建了一个新的Intent对象,用于指定要启动的Activity和传递的数据。

this表示当前的上下文,即MainActivity。

添加额外的数据到Intent中:intent.putExtra("scan_result", contents);

putExtra方法用于将额外的数据添加到Intent中。这里将扫描结果数据存储在名为"scan_result"的键下。

contents是从扫描结果中获取的具体内容。

启动Activity:startActivity(intent);

startActivity方法用于启动指定的Activity,并传递之前创建的Intent对象作为参数。

这将导致系统启动ScanResultActivity并显示扫描结果。

通过以上代码,当扫描成功并获得内容后,MainActivity会创建一个带有扫描结果数据的Intent,然后使用该Intent启动ScanResultActivity,以便显示扫描结果给用户查看。

java
Intent intent = new Intent(this, ScanResultActivity.class); intent.putExtra("scan_result", contents); startActivity(intent);

@Nullable Intent data

@Nullable是一个注解,用于表示参数可以为空。在这个特定的代码中,@Nullable Intent data表示data参数可以为空。

在onActivityResult方法中,系统会传递扫描结果的数据给data参数。这里使用@Nullable注解是为了明确指出data参数可以为null,以应对在某些情况下没有返回数据的情况(例如用户取消了扫描操作)。

在方法体内部,代码通过使用IntentIntegrator.parseActivityResult方法来解析传递的数据,其中data参数被用来传递扫描结果。在后续的逻辑中,会对data参数进行判断,以确保在有有效的扫描结果时才进行进一步处理。

@Nullable Intent data表示data参数可以为空,用于接收从其他Activity返回的数据,这里用于接收扫描结果的数据。

startActivity(intent)

在一个Activity里启动另外一个Activity只有startActivity(intent)才可以?不是的。

除了使用startActivity(intent)方法之外,还有其他方法可以启动另一个Activity。以下是一些常用的方法:

startActivityForResult(intent, requestCode): 该方法用于启动一个Activity,并期望获取返回的结果。可以通过requestCode参数指定一个标识码,以便在返回结果时进行区分。在目标Activity中通过setResult(resultCode, data)方法设置返回结果,并通过finish()方法关闭目标Activity,然后在调用该方法的Activity中的onActivityResult()方法中获取返回的结果。

startActivityIfNeeded(intent): 该方法用于启动一个Activity,但只有在目标Activity不在前台时才会启动。如果目标Activity已经在前台运行,那么不会重新创建一个新的实例。

startActivityFromChild(child, intent, requestCode): 该方法用于在一个父Activity中启动子Activity。child参数指定要启动子Activity的子视图,requestCode参数用于获取返回结果。

startActivityFromFragment(fragment, intent, requestCode): 该方法用于在一个Fragment中启动一个Activity。fragment参数指定要启动Activity的Fragment,requestCode参数用于获取返回结果。

这些方法提供了不同的灵活性和用途,根据你的需求选择适合的方法来启动另一个Activity。

获取Intent数据

String scanResult = getIntent().getStringExtra("scan_result")

java
package com.example.gen_qr_code; import android.os.Bundle; import android.widget.TextView; import androidx.appcompat.app.AppCompatActivity; public class ScanResultActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_scan_result); TextView resultTextView = findViewById(R.id.resultTextView); String scanResult = getIntent().getStringExtra("scan_result"); resultTextView.setText(scanResult); TextView result_title = findViewById(R.id.result_title); result_title.setText("扫描结果:"); } }

github

https://github.com/xddun/android_scan_qrcode

如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:Dong

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!