摘要调用Android Intents

时间:2017-03-20 23:10:45

标签: android

所以我已经到了我的Android活动和片段变得有点混乱的地步。我想应用一些好的编码实践。但是,每当我想出一个好的SOLID设计时,Android就会受阻!

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

我想移动这个"拍照"编码到一个单独的界面。我们称之为PhotoTaker。然后我想要一个名为AndroidPhotoTaker的类,它将实现此接口以启动正确的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注入正确的上下文。

我的问题是我不能像在片段中那样调用startActivityForResult()。因此我不再需要onActivityResult()回调来处理结果。我唯一能找到的是_context.startActivity(),但这看起来并不合适。

并且没有回调 - 我希望将来可以从这些意图中获得任何额外的数据。

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

1 个答案:

答案 0 :(得分:1)

在我看来,抽象掉calback处理使得编码远远不够复杂:你必须实现自己的 Activity-Baseclass捕获android对onActivityResult()的调用并将这些调用转发给您自定义的 您的托管活动必须实现的IOnActivityResult接口。

除此之外,您可以使用静态方法创建一个帮助器类,以创建和分析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;
            ...

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

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);
        }
    }
}

调用活动不需要知道参数如何传播。只需要拨打FotoGalleryActivity.showActivity(getActivity(), getFilter(), null, ID_GALLERY);

即可