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

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

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

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

Вы можете отобразить веб-просмотр из службы. Приведенный ниже код создает окно, к которому имеет доступ ваш сервис. Окно не видно, так как размер равен 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.

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

Полностью катастрофические новости для моего приложения, поэтому я все еще надеюсь, что кто-то даст мне способ использовать WebView, который не нуждается в Activity (или замене для 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 не может существовать вне Activity или Fragment из-за того, что он является пользовательским интерфейсом. Однако это означает, что для создания WebView требуется только действие, а не обработка всех его запросов.

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

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

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

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

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

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

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

Давайте будем гением компьютера.