Статьи

Урок 32. Пишемо простий браузер

У цьому уроці:

- пишемо простий браузер

На минулому уроці ми побачили, що якщо викликати Intent з action = ACTION_VIEW і data = Uri- об'єкт з http-адреси, то запускається браузер і відображає вміст сторінки з цього http-адресою. Ми можемо самостійно зробити найпростіший браузер, який буде реагувати на такий Intent і просто відобразить сторінку. Для цього треба налаштувати Intent Filter і використовувати компонент WebView.

На першому вікні у нас буде кнопка, яка відправляє Intent. На другому екрані буде WebView.

Створимо проект:

Project name: P0321_SimpleBrowser
Build Target: Android 2.3.3
Application name: SimpleBrowser
Package name: ru.startandroid.develop.p0321simplebrowser
Create Activity: MainActivity

малюємо main.xml

<? Xml version = "1.0" encoding = "utf-8"?> <LinearLayout xmlns: android = "http://schemas.android.com/apk/res/android" android: layout_width = "fill_parent" android: layout_height = "fill_parent" android: orientation = "vertical"> <Button android: id = "@ + id / btnWeb" android: layout_width = "wrap_content" android: layout_height = "wrap_content" android: text = "web"> </ Button > </ LinearLayout>

На екрані просто кнопка

Кодима MainActivity.java:

package ru.startandroid.develop.p0321simplebrowser; import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; public class MainActivity extends Activity {/ ** Called when the activity is first created. * / @Override public void onCreate (Bundle savedInstanceState) {super.onCreate (savedInstanceState); setContentView (R.layout.main); (FindViewById (R.id.btnWeb)). SetOnClickListener (new OnClickListener () {@Override public void onClick (View v) {startActivity (new Intent (Intent.ACTION_VIEW, Uri.parse ( "http: //www.ya. ru ")));}}); }}

Код трохи незвичний. Зверніть увагу я ніде не описую об'єкт класу Button. Метод findViewById повертає View, і це View підтримує метод setOnClickListener, який я викликаю. А в методі setOnClickListener я створюю об'єкт, який реалізує інтерфейс OnClickListener і в ньому пишу код в onClick. Також я створюю об'єкт Intent не окремо, а прямо в методі startActivity. Коду менше вийшло, ніж зазвичай. Може бути вам підійде такий варіант.

Отже, ми після натискання на кнопку запускаємо Intent, який означає, що ми хочемо переглянути сайт http://www.ya.ru .

Створимо другий Activity. Спочатку layout-файл browser.xml:

<? Xml version = "1.0" encoding = "utf-8"?> <LinearLayout xmlns: android = "http://schemas.android.com/apk/res/android" android: layout_width = "match_parent" android: layout_height = "match_parent" android: orientation = "vertical"> <WebView android: id = "@ + id / webView" android: layout_width = "match_parent" android: layout_height = "match_parent"> </ WebView> </ LinearLayout>

На екрані компонент WebView.

Створюємо BrowserActivity.java:

package ru.startandroid.develop.p0321simplebrowser; import android.app.Activity; import android.net.Uri; import android.os.Bundle; import android.webkit.WebView; public class BrowserActivity extends Activity {@Override protected void onCreate (Bundle savedInstanceState) {super.onCreate (savedInstanceState); setContentView (R.layout.browser); WebView webView = (WebView) findViewById (R.id.webView); webView.setWebViewClient (new WebViewClient ()); Uri data = getIntent (). GetData (); webView.loadUrl (data.toString ()); }}

Визначаємо WebView, читаємо data з Intent і передаємо рядок в WebView.

Тепер пропишемо Activity в маніфесті. До нього нам треба буде додати Intent Filter, в ньому вказати action = ACTION_VIEW. А для data ми бачимо кілька параметрів, використовуємо Scheme = http.

А для data ми бачимо кілька параметрів, використовуємо Scheme = http

Це означає, що Uri об'єкт в Intent повинен містити http-адреса.

Не забуваємо про Category = Default. Label для BrowserActivity вкажіть, наприклад, MyBrowser.

Також в маніфесті треба додати Uses Permission = android.permission.INTERNET на вкладці Permissions. Щоб система дала додатком доступ в інтернет.

Все збережемо і запустимо додаток. Тиснемо кнопку і бачимо вибір: система пропонує нам на вибір системний браузер і наш, тільки що зроблений. Тобто Intent c запитом на перегляд http-адреси знайшов в системі два Activity, які в своїх Intent Filter заявили, що вміють відображати http-адреси.

Тобто  Intent c запитом на перегляд http-адреси знайшов в системі два Activity, які в своїх Intent Filter заявили, що вміють відображати http-адреси

Вибираємо наше MyBrowser і бачимо сторінку.

Ми побачили, що Activity в наших додатках можуть обробляти не тільки наші придумані action, а й системні. І, тим самим, створювати альтернативу системним додатків.

Але, як ви розумієте, ми запросто могли в нашому Activity не використовувати WebView і не показувати сторінку. Можна було використовувати TextView і в ньому просто відобразити у вигляді тексту адреса з data. Або накодо http-запит, який скачав би цю сторінку і відобразив її html-вміст. Ми могли взагалі забити на http-адреса і показати якусь картинку ліву або просто темний екран.

Тобто для Activity можна створити Intent Filter, який буде повідомляти системі, що додаток вміє щось, але, при цьому, всередині Activity буде якась дурниця. Це вже питання программерскую етики, здорового глузду і адекватності)

Повний код маніфест-файлу:

<? Xml version = "1.0" encoding = "utf-8"?> <Manifest xmlns: android = "http://schemas.android.com/apk/res/android" package = "ru.startandroid.develop.p0321simplebrowser "android: versionCode =" 1 "android: versionName =" 1.0 "> <uses-sdk android: minSdkVersion =" 10 "> </ uses-sdk> <uses-permission android: name =" android.permission.INTERNET "> </ uses-permission> <application android: icon = "@ drawable / ic_launcher" android: label = "@ string / app_name"> <activity android: label = "@ string / app_name" android: name = ". MainActivity"> <intent-filter> <action android: name = "android.intent.action.MAIN"> </ action> <category android: name = "android.intent.category.LAUNCHER"> </ category> </ intent-filter > </ activity> <activity android: label = "MyBrowser" android: name = "BrowserActivity"> <intent-filter> <action android: name = "android.intent.action.VIEW"> </ action> <data android : scheme = "http"> </ data> <category android: name = "android.intent.category.DEFAULT"> </ category> </ intent-filter> </ activity> </ application> </ manifest>

На наступному уроці:

- зберігання даних за допомогою Preferences

Приєднуйтесь до нас в Telegram:

- в каналі StartAndroid публікуються посилання на нові статті з сайту startandroid.ru і цікаві матеріали з Хабра, medium.com і т.п.

- в чатах вирішуємо ці запитання і проблеми з різних тем: Android , Kotlin , RxJava , Dagger , тестування

- ну і якщо просто хочеться поговорити з колегами по розробці, тобто чат флудильня

- новий чат Performance для обговорення проблем продуктивності та для ваших побажань за змістом курсу по цій темі


Encoding = "utf-8"?
Encoding = "utf-8"?
Encoding = "utf-8"?

Новости