У меня есть два действия «зрителя», которые выполняют одну и ту же функцию, но один, унаследованный зритель, имеет лучшую поддержку старых API. Пользователь может переключиться на устаревший просмотрщик в настройках, если у них есть проблемы.Dynamic Activity Chooser
Существует два способа открыть средство просмотра, либо через панель запуска, открывающую активность галереи, либо через цель 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();
}
Он также перенаправляет результаты в случае необходимости. Это функционально, но немного неуклюже, поскольку активность покажет пустой экран в течение секунды.
Есть ли лучший способ выполнить одно и то же намерение с помощью двух разных действий, выбранных динамически?
Первоначально это то, что я сделал, но он может справиться с намерениями. Например, браузер файлов, запрашивающий VIEW на изображении, сразу откроет просмотрщик, поэтому он должен быть немного более продвинутым, чем это, следовательно, посредником ViewerChooser. – Anthony
Напишите два разных действия и вызовите один из необходимых API. Или используйте это в одном и том же намерении (класс), и всякий раз, когда вы что-то делаете, он работает с ОС. На самом деле я не могу сказать вам больше; вам просто нужно найти разумный способ использования этого кода для запуска вашего приложения в соответствии с версией ОС. –