gpt4 book ai didi

android - 抽象对 Android Intent 的调用

转载 作者:太空狗 更新时间:2023-10-29 13:53:22 24 4
gpt4 key购买 nike

所以我已经到了我的 Android Activity 和 fragment 变得有点困惑的地步。我想应用一些好的编码实践。然而,每次我想出一个好的 SOLID 设计时,Android 都会挡路!

作为一个具体示例,我有一个允许用户更新其详细信息(姓名、电子邮件等)的 fragment 。它还允许他们拍照用作个人资料照片。

我想将这个“拍照”代码移到一个单独的界面中。我们称它为 PhotoTaker。然后我想要一个名为 AndroidPhotoTaker 的类,它将实现此接口(interface)以启动正确的 Intent 并返回所拍摄照片的文件名。

public interface PhotoTaker {
Uri capturePhoto();
}

public class AndroidPhotoTaker implements PhotoTaker {
private Context _context;

@Inject
public AndroidPhotoTaker(Context context) {
_context = context;
}

@Override
public Uri capturePhoto() {
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (takePictureIntent.resolveActivity(_context.getPackageManager()) != null) {
File photoFile = new File("some/path/to/a/file");

Uri photoUri = FileProvider.getUriForFile(_context, _context.getApplicationContext().getPackageName() + ".provider", photoFile);
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
_context.startActivity(takePictureIntent);
return photoUri;
}

return null;
}
}

假设通过 Dagger2 注入(inject)了正确的上下文。

我的问题是我无法再像在 fragment 中那样调用 startActivityForResult()。因此我不再有 onActivityResult() 回调来处理结果。我唯一真正能找到的是 _context.startActivity(),但这似乎不对。

而且没有回调——我希望将来能够从这些 Intent 中获取任何额外数据。

其他人是如何解决这个问题的?这里的一般解决方案是什么?即人们如何抽象出具有回调的 Android Intent 调用?

最佳答案

在我看来,抽象出回调处理会使编码过于复杂:您必须实现自己的捕获 android 对 onActivityResult() 调用并将这些调用转发给您自定义的 Activity-Baseclass您的托管 Activity 必须实现的 IOnActivityResult 接口(interface)。

除此之外,您还可以创建一个带有静态方法的辅助类来创建和分析 Intents。

public class MyPhotoTakerClientActivity extends Activity {

private void onTakePhotoClicked() {
Intent takePictureIntent = PhotoTakerHelper.createIntent("some/path/where/to/store/the/resultfile.jpg");
if (PhotoTakerHelper.canProcess(this, takePictureIntent)) {
startActivityForResult(takePictureIntent, TakePhotoID);
} else {
... error processing
}
}

protected void onActivityResult(final int requestCode,
final int resultCode, final Intent intent) {
super.onActivityResult(requestCode, resultCode, intent);

switch (requestCode) {
case TakePhotoID :
Uri uri = PhotoTakerHelper.getPhotoUri(intent);
showPhoto(uri);
break;
...

在我的应用程序中,所有 Activity 都有一个静态方法 showActivity,它接收可以从调用 Activity 传递到子 Activity 的所有参数:

public class FotoGalleryActivity extends Activity {
public static void showActivity(Activity context, GalleryFilterParameter filter,
QueryParameter query, int requestCode) {
Intent intent = new Intent(context, FotoGalleryActivity.class);

if (filter != null) {
intent.putExtra(EXTRA_FILTER, filter.toString());
}

if (query != null) {
intent.putExtra(EXTRA_QUERY, query.toReParseableString());
}

if (requestCode != 0) {
context.startActivityForResult(intent, requestCode);
} else {
context.startActivity(intent);
}
}
}

调用 Activity 不需要知道参数是如何传输的。它只需要调用 FotoGalleryActivity.showActivity(getActivity(), getFilter(), null, ID_GALLERY);

关于android - 抽象对 Android Intent 的调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42915630/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com