Intereting Posts
Android Studio Gradle Build занимает более 5 минут Как отменить пробную подписку в консоли разработчика Google Play Backgutton в phonegap не регистрируется и не работает должным образом Android – проблемы с SSL в эмуляторе студии android, отлично работает на телефоне Android – масштабирование кнопки изображения Как обновить ListView, чтобы запросить его курсор, чтобы повторно заполнить его данные и их представления Как распечатывать значения во время отладки Как изменить цвет коммутатора Android-Ошибка: выполнение не выполнено для задачи ': app: transformClassesWithDexForRelease' Анимация меню опций Стиль вкладок Android ActionBar для Honeycomb Android. Как мне динамически установить имя пакета во время сборки для проекта с открытым исходным кодом? Не удается получить push-уведомление от Urban Airship Последствия Android Market / Google Play переименовываются для разработчиков В модуле BillingService необходимо изменить параметры для повышения безопасности?

Android: использование WebView вне контекста активности

Я пытаюсь достичь веб-скрепок с помощью фона IntentService, который периодически очищает веб-сайт без отображения вида на телефоне пользователя.

  • Поскольку я должен сделать вызов некоторого javascript на загруженной странице, я не могу использовать любые HttpGet и т. Д.
  • Поэтому я должен использовать экземпляр WebView, который может работать только в потоке пользовательского интерфейса.
  • Любые попытки запустить Activity, использующие WebView, приводят к представлению «Просмотр» на переднем плане телефонов (в соответствии с дизайном Android-операций Android)
  • Любые попытки использовать WebView вне контекста Activity приводили к ошибке, указывающей на то, что вы не можете использовать WebView для потока, отличного от UI.
  • По разным причинам сложности я не могу рассмотреть использование таких библиотек, как Rhino для веб-скрепок без пользовательского интерфейса.

Есть ли способ обойти эту проблему?

Solutions Collecting From Web of "Android: использование WebView вне контекста активности"

Вы можете отобразить веб-просмотр из службы. Приведенный ниже код создает окно, к которому имеет доступ ваш сервис. Окно не видно, поскольку размер равен 0 на 0.

public class ServiceWithWebView extends Service { @Override public void onCreate() { super.onCreate(); WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); params = new WindowManager.LayoutParams(WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY, WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE, PixelFormat.TRANSLUCENT); params.gravity = Gravity.TOP | Gravity.LEFT; params.x = 0; params.y = 0; params.width = 0; params.height = 0; LinearLayout view = new LinearLayout(this); view.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT)); WebView wv = new WebView(this); wv.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT)); view.addView(wv); wv.loadUrl("http://google.com"); windowManager.addView(view, params); } } 

Также для этого потребуется разрешение android.permission.SYSTEM_ALERT_WINDOW .

Исправьте меня, если я ошибаюсь, но правильный ответ на этот вопрос заключается в том, что нет возможности использовать WebView в фоновом режиме, в то время как пользователь делает другие вещи на телефоне, не прерывая пользователя посредством Activity.

Я применил предложения Randy и Code_Yoga: использование активности с «Theme.NoDisplay» для запуска фоновой службы с помощью WebView для выполнения определенной работы. Однако, несмотря на то, что вид не виден, переход на это действие для этой секунды для запуска служб прерывает пользователя (например, приостанавливает игру, в которую играли).

Полностью катастрофические новости для моего приложения, поэтому я все еще надеюсь, что кто-то даст мне способ использовать WebView, который не нуждается в Activity (или замене WebView, который может сделать то же самое)

Вы можете использовать это, чтобы скрыть действие

  <activity android:name="MyActivity" android:label="@string/app_name" android:theme="@android:style/Theme.NoDisplay"> 

Это предотвратит показ приложения. И тогда вы можете делать свои вещи в Управлении.

WebView не может существовать вне Activity или Fragment из-за того, что он является пользовательским интерфейсом. Однако это означает, что для создания WebView требуется только действие, а не обработка всех его запросов.

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

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

Решение было таким, но с Looper.getMainLooper ():

https://github.com/JonasCz/save-for-offline/blob/master/app/src/main/java/jonas/tool/saveForOffline/ScreenshotService.java

 @Override public void onCreate() { super.onCreate(); //HandlerThread thread = new HandlerThread("ScreenshotService", Process.THREAD_PRIORITY_BACKGROUND); //thread.start(); //mServiceHandler = new ServiceHandler(thread.getLooper()); // not working mServiceHandler = new ServiceHandler(Looper.getMainLooper()); // working } 

С помощью @JonasCz: https://stackoverflow.com/a/28234761/466363

Или заменить WebView, который может выполнить тот же <===, если вы не хотите показывать загруженную информацию в пользовательском интерфейсе, возможно, вы можете попытаться использовать HTTP для прямого вызова URL-адреса и обработать ответный ответ HTTP

Я знаю, что прошло полтора года, но теперь я столкнулся с той же проблемой. Я решил это в конечном итоге, запустив свой код Javascript внутри движка узла, который работает в моем приложении для Android. Это называется JXCore . Вы можете взглянуть. Кроме того, посмотрите на этот образец, который запускает Javascript без WebView. Я действительно хотел бы знать, что вы в конечном итоге использовали?

Почему бы вам не создать бэкэнд-сервис, который выполняет очистку?

А затем вы просто проводите опрос результатов из RESTful Webservice или даже используете промежуточное программное обеспечение для обмена сообщениями (например, ZeroMQ).

Может быть, более элегантный, если он подходит вашему прецеденту: пусть Служба сортировки отправит ваши сообщения Push Push через GCM 🙂