2013-02-09 3 views
1

У меня есть процедура обновления (подключается к серверу и ищет более новую версию), которая запускается onCreate при первом моем действии. Если есть обновление, пользователю предоставляется диалоговое окно, если обновление не является обязательным, и спрашивает, хотите ли они загрузить обновление.Диалоговое окно отображения из android.app.application

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

Я мог бы создать синглтон, который знает, если проверка уже выполнена или что-то подобное, но предпочла бы сделать проверку вне активности, поскольку она просто не подходит для правильного места.

Проблема у меня есть, если я поместил ее в android.app.application, тогда у меня нет активности для создания диалога. Я мог бы создать активность загрузчика только для этого, а затем запустить основное действие после этого, но это тоже не кажется идеальным.

Что было бы хорошим способом справиться с этим сценарием?

ответ

2

Вы не можете запустить мероприятие из контекста приложения, к сожалению, это просто невозможно. Вам нужно будет сделать это с

android:theme="@android:style/Theme.Dialog" 

в теге действия в вашем AndroidManifest.xml. В этом упражнении вы должны определить довольно простой макет, чтобы он выглядел так же хорошо, как диалог (или нет, если вы хотите, чтобы он выглядел как что-то еще).

Другим вариантом является вашей первой установкой активности BroadcastReceiver и затем контекст приложения

sendBroadcast(new Intent("MyUniqueID")); 

в пределах OnReceive способа BroadcastReceiver отображения диалогового окна с контекстом деятельности.

+0

Правильно ли я это понимаю? Я должен выполнить checkForUpdate() внутри контекста приложения. Это создаст AsyncTask для подключения к серверу и проверки обновления, а затем в onPostExecute, если обновление существует, запустите новое действие с помощью sendBroadcast, используя контакт приложения. Это действие будет перенесено на мою основную деятельность и предоставит пользователю диалог (из-за форматирования активности). В этом упражнении, если они нажмут «update», затем откройте новую AsynTask, чтобы загрузить обновление. Тогда активность Dialog умрет, но я мог бы сделать обновление во втором AsyncTask –

+0

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

+0

@Mark Фактически вы не запускаете новую активность, если обновление существует, вы просто отправляете широковещательную передачу в свою деятельность, чтобы контекст активности отображал диалог. 2 метода, которые я написал выше, не должны использоваться вместе, вы должны использовать один метод или другой. – bclymer

0

crdnilfan дал хороший answer.and, если вы хотите сделать это в вашем MainActivity, то вы можете сохранить активность Lifecycle в надлежащем порядке, как описано here , и если вы хотите ограничить звонить onCreate() всякий раз, когда вы поворачиваете устройство, вам можно указать configChanges,

 <activity 
     android:name="com.example.temp.MainActivity" 
     android:configChanges="orientation" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 

Надеюсь, это будет полезно!

Смежные вопросы