Тарифы Услуги Сим-карты

Как изменить браузер по умолчанию в Android. WebView - создай свой браузер Все закладки во всех браузерах

Изучать программирование под Андроид я начал не так давно. После того, как Eclips выдал мой первый Hello Word, сразу захотелось большего: возникло много планов и грандиозных идей. Одной такой идеей было написание своего Браузера. Думаю, у многих начинающих программистов возникало такое желание. Вот какие требования были мной поставлены и что получилось в итоге.

  • Программа должна открывать ссылки глобальной сети, свободно переходить по страничкам вперёд и назад;
  • Иметь возможность скачивать файлы и загружать обратно в сеть;
  • Создавать закладки и сохранять их;
  • Иметь возможность загружать ссылки, отправленные с других приложений;
  • Должна быть кнопка домашней страницы, меню с различными настройками и т.д.

В общем, полноценный браузер своими руками. Воплотим это в код.

Программа написана на основе стандартного webview, входящего в Android. В качестве стартовой страницы использую Яндекс, это дело вкуса. В качестве основного Activity будет MainActivity.

Первым делом задаём разметку xml файла -activity_main.xml. В качестве главного контейнера используем LinearLayout - в него заворачиваем ProgressBar для отображения процесса загрузки. Далее создаём ещё один контейнер LinearLayout - в него заворачиваем наш Webview и FrameLayout (его используем для растягивания воспроизводимого видео на весь экран).

Посмотреть код

LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity">

Начнём писать код в MainActivity

Полный код MainActivity.

Посмотреть полный код

Import java.io.File; import android.R.menu; import android.annotation.SuppressLint; import android.app.ActionBar; import android.app.Activity; import android.app.AlertDialog; import android.app.DownloadManager; import android.app.DownloadManager.Request; import android.app.KeyguardManager; import android.app.SearchManager; import android.content.BroadcastReceiver; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.IntentFilter; import android.content.SharedPreferences; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.os.Parcelable; import android.os.PowerManager; import android.preference.PreferenceManager; import android.provider.MediaStore; import android.util.Log; import android.view.KeyEvent; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.WindowManager; import android.webkit.ConsoleMessage; import android.webkit.DownloadListener; import android.webkit.ValueCallback; import android.webkit.WebBackForwardList; import android.webkit.WebChromeClient; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.FrameLayout; import android.widget.SearchView; import android.widget.Toast; import android.graphics.Bitmap; import android.webkit.URLUtil; public class MainActivity extends Activity { //Логическая переменная для статуса соединения Boolean isInternetPresent = false; ConnectionDetector cd; private WebChromeClient.CustomViewCallback mFullscreenViewCallback; private FrameLayout mFullScreenContainer; private View mFullScreenView; private WebView mWebView; String urload; int cache = 1; SharedPreferences sPref; final Activity activity = this; public Uri imageUri; private static final int FILECHOOSER_RESULTCODE = 2888; private ValueCallback mUploadMessage; private Uri mCapturedImageURI = null; private DownloadManager downloadManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //Создаем пример класса connection detector: cd = new ConnectionDetector(getApplicationContext()); // создаём кнопу home final ActionBar actionBar = getActionBar(); actionBar.setHomeButtonEnabled(true); actionBar.setDisplayHomeAsUpEnabled(true); // ловим intent что файл загружен и оповещаем BroadcastReceiver receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) { loadEnd(); } } }; // ловим intent что файл загружен registerReceiver(receiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE)); mWebView = (WebView) findViewById(R.id.web_view); mFullScreenContainer = (FrameLayout) findViewById(R.id.fullscreen_container); mWebView.setWebChromeClient(mWebChromeClient); mWebView.loadUrl("http://yandex.ru"); handleIntent(getIntent()); class HelloWebViewClient extends WebViewClient { @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { super.onPageStarted(view, url, favicon); findViewById(R.id.progress1).setVisibility(View.VISIBLE); setTitle(url); urload=mWebView.getUrl(); ConnectingToInternet (); } @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); // запускаем ссылки на маркет Uri uri = Uri.parse(url); if (uri.getScheme().equals("market")) { Intent i = new Intent(android.content.Intent.ACTION_VIEW); i.setData(uri); i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(i); mWebView.canGoBack(); { mWebView.goBack(); } } // запускаем email if (uri.getScheme().equals("mailto")) { Intent i = new Intent(android.content.Intent.ACTION_SEND); i.setType("text/html"); i.putExtra(Intent.EXTRA_SUBJECT, "Введите тему"); i.putExtra(Intent.EXTRA_TEXT, "Введите текст"); i.putExtra(Intent.EXTRA_EMAIL, new String{url}); startActivity(i); mWebView.canGoBack(); { mWebView.goBack(); } } // запускаем звонилку if (uri.getScheme().equals("tel")) { Intent i = new Intent(android.content.Intent.ACTION_DIAL); i.setData(uri); startActivity(i); mWebView.canGoBack(); { mWebView.goBack(); } } // запускаем лoкцию if (uri.getScheme().equals("geo")) { Intent i = new Intent(android.content.Intent.ACTION_VIEW); i.setData(uri); startActivity(i); mWebView.canGoBack(); { mWebView.goBack(); } } return true; } @Override public void onPageFinished(WebView view, String url) { findViewById(R.id.progress1).setVisibility(View.GONE); } @Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { ConnectingToInternet (); mWebView.loadUrl("file:///android_asset/error.png"); } } mWebView.setWebViewClient(new HelloWebViewClient()); // загрузка файлов на устройство mWebView.setDownloadListener(new DownloadListener() { @Override public void onDownloadStart(final String url, String userAgent, String contentDisposition, String mimetype, long contentLength) { final String fileName = URLUtil.guessFileName(url, contentDisposition, mimetype); final AlertDialog.Builder downloadDialog = new AlertDialog.Builder(MainActivity.this); downloadDialog.setTitle("Менеджер загрузок"); downloadDialog.setMessage("Загрузить этот файл в папку Donwload ?" + "n" + mimetype + "n" + url); downloadDialog.setPositiveButton("Да", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialogInterface, int i) { doDownload(url, fileName); dialogInterface.dismiss(); } }); downloadDialog.setNegativeButton("Нет", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialogInterface, int i) { } }); downloadDialog.show(); } }); } // **************************************** //***************************************** //***************************************** public void ConnectingToInternet (){ //Получаем статус Интернет соединения isInternetPresent = cd.ConnectingToInternet(); //Проверяем Интернет статус: if (isInternetPresent) { //Интернет соединение есть //делаем HTTP запросы: } else { //Интернет соединения нет Toast.makeText(this, " Интернет отвалился!!!", Toast.LENGTH_SHORT).show(); } } @SuppressLint("SetJavaScriptEnabled") @Override // настройки public void onResume(){ super.onResume(); SharedPreferences sPref = PreferenceManager.getDefaultSharedPreferences(this); if (sPref.getBoolean("img", false)) { mWebView.getSettings().setLoadsImagesAutomatically(false); } else { mWebView.getSettings().setLoadsImagesAutomatically(true); } if (sPref.getBoolean("js", false)) { mWebView.getSettings().setJavaScriptEnabled(false); } else { mWebView.getSettings().setJavaScriptEnabled(true); } if (sPref.getBoolean("cache", false)) { cache = 2; } else { cache = 1; } } // пишем закладку public void saveBm(String urlPage1, String urlTitle1) { Intent intent = new Intent(this, SaveBmActivity.class); intent.putExtra("urlTitle", urlTitle1); intent.putExtra("urlPage", urlPage1); startActivity(intent); } public void pref() { // настройки Intent intent = new Intent(this, PreferencesActivity.class); startActivity(intent); } // чистим кэш и историю private void clCache(){ clearCache(activity); mWebView.clearCache(true); mWebView.clearHistory(); Toast.makeText(this, "Кеш и История очищены", Toast.LENGTH_SHORT).show(); } @Override protected void onUserLeaveHint() { super.onUserLeaveHint(); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) {// кнопка назад if ((keyCode == KeyEvent.KEYCODE_BACK)) { mWebView.canGoBack(); { mWebView.goBack(); } return true; } return super.onKeyDown(keyCode, event); } // ловим url запустившей программы private boolean handleIntent(Intent intent) { String action = intent.getAction(); if (Intent.ACTION_VIEW.equals(action)) { String url = intent.getDataString(); Toast.makeText(this, url, Toast.LENGTH_SHORT).show(); mWebView.loadUrl(url);// грузим страницу return true; } return false; } // менеджер загрузки private void doDownload(String url,String fileName) { Uri uriOriginal = Uri.parse(url); try { Toast.makeText(MainActivity.this, "Downloading " + fileName, Toast.LENGTH_LONG).show(); Request request = new DownloadManager.Request(Uri.parse(url)); request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, fileName); final DownloadManager dm = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE); dm.enqueue(request); } catch (Exception e) { Toast.makeText(this, "Ошибка", Toast.LENGTH_SHORT).show(); Log.e("", "Problem downloading: " + uriOriginal, e); } } // тянем видео на весь экран private final WebChromeClient mWebChromeClient = new WebChromeClient() { @Override @SuppressWarnings("deprecation") public void onShowCustomView(View view, int requestedOrientation, CustomViewCallback callback) { onShowCustomView(view, callback); } @Override public void onShowCustomView(View view, CustomViewCallback callback) { if (mFullScreenView != null) { callback.onCustomViewHidden(); return; } mFullScreenView = view; mWebView.setVisibility(View.GONE); mFullScreenContainer.setVisibility(View.VISIBLE); mFullScreenContainer.addView(view); mFullscreenViewCallback = callback; } @Override public void onHideCustomView() { super.onHideCustomView(); if (mFullScreenView == null) { return; } mWebView.setVisibility(View.VISIBLE); mFullScreenView.setVisibility(View.GONE); mFullScreenContainer.setVisibility(View.GONE); mFullScreenContainer.removeView(mFullScreenView); mFullscreenViewCallback.onCustomViewHidden(); mFullScreenView = null; } // ********************************************* грузим файлы в сеть // openFileChooser for Android 3.0+ public void openFileChooser(ValueCallback uploadMsg, String acceptType) { // Сообщение об обновлении mUploadMessage = uploadMsg; try { // Создать AndroidExampleFolder в sdcard File imageStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) , "AndroidExampleFolder"); if (!imageStorageDir.exists()) { // Создать AndroidExampleFolder в sdcard imageStorageDir.mkdirs(); } // Создать камеру захваченное изображение путь к файлу и имя File file = new File(imageStorageDir + File.separator + "IMG_" + String.valueOf(System.currentTimeMillis()) + ".jpg"); mCapturedImageURI = Uri.fromFile(file); // Камера захвата изображения intent final Intent captureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); captureIntent.putExtra(MediaStore.EXTRA_OUTPUT, mCapturedImageURI); Intent i = new Intent(Intent.ACTION_GET_CONTENT); i.addCategory(Intent.CATEGORY_OPENABLE); i.setType("image/*"); // Создать файл селектора intent Intent chooserIntent = Intent.createChooser(i, "Image Chooser"); // Установить камеры намерении выбора файлов chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS , new Parcelable{captureIntent}); // На выбор изображения обхода метода onactivityresult вызов метода активности startActivityForResult(chooserIntent, FILECHOOSER_RESULTCODE); } catch (Exception e) { Toast.makeText(getBaseContext(), "Exception:" + e, Toast.LENGTH_LONG).show(); } } // openFileChooser for Android < 3.0 @SuppressWarnings("unused") public void openFileChooser(ValueCallback uploadMsg) { openFileChooser(uploadMsg, ""); } // @SuppressWarnings("unused") public void openFileChooser(ValueCallback uploadMsg, String acceptType, String capture) { openFileChooser(uploadMsg, acceptType); } public boolean onConsoleMessage(ConsoleMessage cm) { onConsoleMessage(cm.message(), cm.lineNumber(), cm.sourceId()); return true; } public void onConsoleMessage(String message, int lineNumber, String sourceID) { //Log.d("androidruntime", "Show console messages, Used for debugging: " + message); }; };// End setWebChromeClient // Получаем результат @SuppressWarnings("unused") private Object data; @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (data == null) { return; } String urlPage2 = data.getStringExtra("urlPage2"); mWebView.loadUrl(urlPage2); if (requestCode == FILECHOOSER_RESULTCODE) { if (null == this.mUploadMessage) { return; } Uri result = null; try { if (resultCode != RESULT_OK) { result = null; } else { // извлечь из собственной переменной, если намерение состоит в нуль result = data == null ? mCapturedImageURI: data.getData(); } } catch (Exception e) { Toast.makeText(getApplicationContext(), "activity:" + e, Toast.LENGTH_LONG).show(); } mUploadMessage.onReceiveValue(result); mUploadMessage = null; } } //***************************** public void loadEnd () { Toast.makeText(this, "Файл Загружен в папку Donwload", Toast.LENGTH_SHORT).show(); } // меню @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } // ******************************************************* @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home:// кнопка home mWebView.loadUrl("http://yandex.ru"); return true; case R.id.item1:// назад mWebView.canGoBack(); { mWebView.goBack(); } return true; case R.id.item2: // вперёд mWebView.canGoForward(); { mWebView.goForward(); } return true; case R.id.item3: // перезагрузка mWebView.reload(); { mWebView.reload(); } return true; case R.id.item4:// чистим кеш mWebView.clearCache(true); clearCache(activity); Toast.makeText(this, "Кэш чист.", Toast.LENGTH_SHORT).show(); return true; case R.id.item5: mWebView.clearHistory();// чистим историю Toast.makeText(this, "История чиста.", Toast.LENGTH_SHORT).show(); return true; case R.id.item6: saveBm(mWebView.getUrl(), mWebView.getTitle());// пишим закладку return true; case R.id.item7:// панель закладок Intent intent1 = new Intent(this, SaveBmActivity.class); startActivityForResult(intent1, 1); return true; case R.id.item8: // стоп загрузка mWebView.stopLoading(); return true; case R.id.item9: pref();// настройки return true; case R.id.item10: // пока пусто return true; case R.id.item11:// выход if (cache == 2) { clCache(); } finish(); return true; default: return super.onOptionsItemSelected(item); } } @SuppressWarnings("deprecation") @Override public void onDestroy() { super.onDestroy(); mWebView.stopLoading(); mWebView.clearCache(true); mWebView.clearView(); mWebView.freeMemory(); mWebView.destroy(); mWebView = null; } // чистим кеш void clearCache(Context context) { clearCacheFolder(context.getCacheDir()); } void clearCacheFolder(final File dir) { if (dir!= null && dir.isDirectory()) { try { for (File child:dir.listFiles()) { //рекурсивно чистим сначала каталоги if (child.isDirectory()) clearCacheFolder(child); else //потом собственно файлы child.delete(); } } catch(Exception e) { } } } }

Проект можно скачать


В этом уроке:

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

На прошлом уроке мы увидели, что если вызвать 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


xmlns:android =
android:layout_width ="fill_parent"
android:layout_height ="fill_parent"
android:orientation ="vertical" >

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

Кодим MainActivity.java:

package

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 ) {

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

Создадим второе Activity. Сначала layout-файл browser.xml :


xmlns:android ="http://schemas.android.com/apk/res/android"

android:layout_height ="match_parent"
android:orientation ="vertical" >
android:id ="@+id/webView"
android:layout_width ="match_parent"
android:layout_height ="match_parent" >

На экране компонент 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 ) ;
Uri data = getIntent () .getData () ;
webView.loadUrl (data.toString ()) ;
}
}

Определяем WebView , читаем data из Intent и передаем строку в WebView .

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

Это значит, что Uri объект в Intent должен содержать http-адрес.

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

Также в манифесте надо добавить Uses Permission = android.permission.INTERNET на вкладке Permissions . Чтобы система дала приложению доступ в интернет.


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


Выбираем наше MyBrowser и видим страницу.


Мы увидели, что Activity в наших приложениях могут обрабатывать не только наши придуманные action, но и системные . И, тем самым, создавать альтернативу системным приложениям.

Но, как вы понимаете, мы запросто могли в нашем Activity не использовать WebView и не показывать страницу. Можно было использовать TextView и в нем просто отобразить в виде текста адрес из data. Или накодить http-запрос, который скачал бы эту страницу и отобразил ее html-содержимое. Мы могли вообще забить на http-адрес и показать какую-нибудь картинку левую или просто темный экран.

Т.е. для Activity можно создать Intent Filter, который будет сообщать системе, что приложение умеет что-то, но, при этом, внутри Activity будет какая-нибудь ерунда. Это уже вопросы программерской этики, здравого смысла и адекватности)

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


"http://schemas.android.com/apk/res/android" package ="ru.startandroid.develop.p0321simplebrowser" android:versionCode ="1" android:versionName ="1.0" >






"android.intent.category.LAUNCHER" >






"android.intent.category.DEFAULT" >



На следующем уроке:

Хранение данных с помощью Preferences

Мы уже начали полноценно обеспечивать себя личным софтом, вспомните наши чудесные калькулятор и конвертер. И в этом уроке мы научимся создавать простой браузер, с помощью которого будет бороздить просторы интернета. Согласитесь, серфить сеть на своем собственном браузере - это в разы приятнее чем делать это на Opera или Chrome (вряд ли удобнее, но приятнее:)). Создаем новый проект, названия традиционно выбирайте сами. Лично я вообще не создаю каждый раз все с нуля, а просто открываю, что есть, и зачищаю весь код до исходного состояния Blank Activity. Делайте, как вам удобней.

Итак, кратко очертим объем и специфику последующей работы. Нам нужно создать элемент , в котором будет все происходить, написать код, создающий наш личный Веб-обозреватель, обустроить его базовыми функциями, прописать разрешение на использование Internet нашим приложением в файле манифеста, и написать обработчик нажатия аппаратной кнопки "Назад" на устройстве (то есть, что будет происходить в нашем браузере при нажатии на эту кнопку).

Начнем. Открываем файл activity_main.xml . Создаем там один единственный элемент , которого нам вполне достаточно для реализации веб-обозревателя:

< WebView xmlns: android= "http://schemas.android.com/apk/res/android" android: layout_height= "match_parent" android: layout_width= "match_parent" android: id= "@+id/web" />

Окно разметки будет выглядеть так:

После этого давайте сразу разберемся с файлом AndroidManifest.xml . Открываем его и добавляем туда две строчки, одна - это разрешение для приложения использовать Интернет, другая - изменение стиля приложения, а точнее сокрытие панели "Title" приложения (панели с заголовком приложения) с той целью, чтобы предоставить окну браузера больше пространства для отображения страниц.

Пишем строку разрешения использовать интернет до открытия тега ...:

< uses- permission android: name= "android.permission.INTERNET" / >

Теперь добавим к строке настройки нашего Activity команду для скрытия заголовка (нижняя строка, выделенная жирным, это также находиться в AndroidManifest.xml ):

< activity android: name= ".MainActivity" android: label= android: theme= "@android:style/Theme.NoTitleBar" >

Теперь переходим к самой важной и ответственной части работы - написанию java кода. Открываем файл MainActivity.java и пишем так следующее (объяснения даны в коде после знаков //, кто не заметил):

package home.myapplication ; import android.app.Activity ; import android.app.AlertDialog ; import android.content.ContentValues ; import android.content.Intent ; import android.database.Cursor ; import android.database.sqlite.SQLiteDatabase ; import android.database.sqlite.SQLiteOpenHelper ; import android.support.v7.app.ActionBarActivity ; import android.os.Bundle ; import android.util.Log ; import android.view.KeyEvent ; import android.view.Menu ; import android.view.MenuItem ; import android.view.View ; import android.webkit.WebView ; import android.webkit.WebViewClient ; import android.widget.Button ; import android.widget.EditText ; import android.widget.RadioButton ; import android.widget.TextView ; public class MainActivity extends Activity { // Объявляем переменную типа WebView private WebView mWeb; // Создаем класс типа Веб-обозреватель (WebViewClient), которому настраиваем // по умолчанию разрешение обрабатывать все ссылки внутри этого класса, // не обращаясь к сторонним программам: private class WebViewer extends WebViewClient { (WebView view , String url ) { view. loadUrl(url); return true ; } } public void onCreate (Bundle savedInstanceState ) { super. onCreate(savedInstanceState); setContentView(R . layout. activity_main); // Привязываем объявленную переменную типа WebView к созданному нами // элементу WebView в файле activity_main.xml: mWeb= (WebView )findViewById(R . id. web); // Подключаем для этого элемента поддержку Java скриптов: mWeb. getSettings(). setJavaScriptEnabled(true ); // Настраиваем страницу, которая будет загружать при запуске, можете ввести любую: mWeb. loadUrl("http://developeroleg.ucoz.ru/" ); // Настраиваем обозреватель для нашего элемента WebView, подключаем созданный нами выше // Веб-клиент, с помощью которого будет проходить просмотр страниц: mWeb. setWebViewClient(new WebViewer ()); } // Пишем код обработки нажатия кнопки назад на устройстве, что позволит нам при нажатии // на кнопку "Назад" перейти к предыдущей странице, а не просто закрывать приложения. // Оно будет закрываться кнопкой "Назад" лишь в том случае, если мы находимся на стартовой // странице, которую указали выше: @Override public void onBackPressed () { if (mWeb. canGoBack()) { mWeb. goBack();} else { super. onBackPressed(); } } }

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