2013-08-29 3 views
0

У меня есть два действия «зрителя», которые выполняют одну и ту же функцию, но один, унаследованный зритель, имеет лучшую поддержку старых 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(); 
} 

Он также перенаправляет результаты в случае необходимости. Это функционально, но немного неуклюже, поскольку активность покажет пустой экран в течение секунды.

Есть ли лучший способ выполнить одно и то же намерение с помощью двух разных действий, выбранных динамически?

ответ

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 
} 
+0

Первоначально это то, что я сделал, но он может справиться с намерениями. Например, браузер файлов, запрашивающий VIEW на изображении, сразу откроет просмотрщик, поэтому он должен быть немного более продвинутым, чем это, следовательно, посредником ViewerChooser. – Anthony

+0

Напишите два разных действия и вызовите один из необходимых API. Или используйте это в одном и том же намерении (класс), и всякий раз, когда вы что-то делаете, он работает с ОС. На самом деле я не могу сказать вам больше; вам просто нужно найти разумный способ использования этого кода для запуска вашего приложения в соответствии с версией ОС. –

0

Вы получаете пустой экран, так как вы используете активность, чтобы решить, какой другой деятельности, для запуска. Почему бы не попробовать зарегистрировать широковещательный приемник для намерения VIEW и запустить из него соответствующую активность.

+0

Звучит многообещающе. Я уйду на выходные, но я посмотрю на BroadcastReceivers, когда вернусь и обновлю вас. Благодарю. – Anthony

+0

BroadcastReceivers - это боль от новой безопасности. Пока приложение не будет открыто, они не зарегистрированы. – Anthony