动态活动选择器

时间:2013-08-29 11:25:40

标签: android android-intent android-activity

我有两个执行相同功能的“查看器”活动,但其中一个(旧版查看器)对旧版API有更好的支持。如果用户遇到问题,用户可以在设置中切换到旧版查看器。

有两种方法可以打开查看器,通过启动画廊活动的启动器,或通过直接转到相应查看器的VIEW意图。

由于可以直接从外部应用程序调用查看器,因此需要有逻辑来决定要显示哪个查看器。我是以“ViewerChooser”活动的形式这样做的。

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    Intent viewer = new Intent();
    SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this);
    if (!settings.contains(FullSettingsActivity.KEY_UseLegacyViewer))
    {
        SharedPreferences.Editor editor = settings.edit();
        editor.putBoolean(FullSettingsActivity.KEY_UseLegacyViewer, !Util.hasHoneycomb());
    }

    if(settings.getBoolean(FullSettingsActivity.KEY_UseLegacyViewer, false))
    {
        viewer.setClass(this, LegacyViewerActivity.class);
    }
    else
    {
        viewer.setClass(this, ImageViewerActivity.class);
    }

    viewer.setData(getIntent().getData());
    startActivityForResult(viewer, REQUEST_VIEWER);
}

/**
 * Simply forward on the result
 */
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    setResult(resultCode, data);
    finish();
}

如果需要,它还会将结果转发回去。这是功能性的,但有点笨拙,因为活动将瞬间显示一个空白屏幕。

有没有更好的方法来完成动态选择的两个不同活动处理相同的意图?

2 个答案:

答案 0 :(得分:0)

您可以使用onClick方法或用于启动活动的任何方法执行此操作:

int currentapiVersion = android.os.Build.VERSION.SDK_INT;
if (currentapiVersion >= android.os.Build.VERSION_CODES.FROYO){
    // Do something for froyo and above versions
} else{
    // do something for phones running an SDK before froyo
}

答案 1 :(得分:0)

您将获得空白屏幕,因为您正在使用“活动”来决定要运行哪个“其他活动”。为什么不尝试为VIEW意图注册广播接收器并从那里启动相应的活动。