安卓实现浏览器app

安卓给app提供了:

WebView:可以显示网页的组件,详见谷歌WebView文档

借助安卓的WebView,我们可以轻松的实现一个浏览器app。首先来看我们的布局文件activity_web.xml:

<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.sc.web.WebActivity">

    <com.google.android.material.appbar.AppBarLayout
        android:focusableInTouchMode="true"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <androidx.appcompat.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
            app:layout_scrollFlags="scroll|enterAlways|snap">

            <EditText
                android:id="@+id/url_edit_text"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:inputType="textUri"/>

        </androidx.appcompat.widget.Toolbar>

    </com.google.android.material.appbar.AppBarLayout>

    <WebView
        android:id="@+id/web_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior" />

</androidx.coordinatorlayout.widget.CoordinatorLayout>

界面上的主角就是我们的WebView,这里除了WebView,我们还使用了Toolbar来显示我们的网页链接,并提供网页跳转、前进、后退按钮。

接下来实现WebActivity:

class WebActivity : AppCompatActivity() {
    private lateinit var mWebView: WebView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_web)

        val toolbar = findViewById<Toolbar>(R.id.toolbar)
        setSupportActionBar(toolbar)
        supportActionBar?.apply {
            setDisplayHomeAsUpEnabled(true)
            setHomeAsUpIndicator(R.mipmap.ic_x)
            setDisplayShowTitleEnabled(false)
        }

        val urlEditText = findViewById<EditText>(R.id.url_edit_text)
        mWebView = findViewById(R.id.web_view)
        mWebView.settings.javaScriptEnabled = true
        mWebView.webViewClient = object : WebViewClient() {
            override fun onPageStarted(view: WebView, url: String, favicon: Bitmap?) {
                super.onPageStarted(view, url, favicon)
                urlEditText.setText(url)
            }
            override fun onPageFinished(view: WebView, url: String) {  // 这个也必须要,否则有时url不能正确显示
                super.onPageFinished(view, url)
                urlEditText.setText(url)
            }
        }

        val uri = intent.data
        if (uri == null) {  // 未指定url则默认进入百度页面
            mWebView.loadUrl("https://www.baidu.com/")
        } else {  // 进入指定的url页面
            mWebView.loadUrl(uri.toString())
        }

        val inputMethodManager = getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager
        // 点击WebView时隐藏输入法并取消对urlEditText的焦距
        mWebView.setOnTouchListener { v, event ->
            inputMethodManager.hideSoftInputFromWindow(urlEditText.applicationWindowToken, 0)
            urlEditText.clearFocus()
            false
        }
        // 点击输入法上的确认时隐藏输入法并跳转网页
        urlEditText.setOnEditorActionListener { textView, i, keyEvent ->
            inputMethodManager.hideSoftInputFromWindow(textView.applicationWindowToken, 0)
            mWebView.loadUrl(urlEditText.text.toString())
            false
        }
        // 处理点击下载文件的情况
        mWebView.setDownloadListener { url, userAgent, contentDisposition, mimetype, contentLength ->
            this@WebActivity.url = url
            this@WebActivity.contentLength = contentLength
            if (ContextCompat.checkSelfPermission(this@WebActivity, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                ActivityCompat.requestPermissions(this@WebActivity, arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE), REQUEST_CODE_DOWNLAOD)
            } else {
                download()
            }
        }
    }

    private var url: String? = null
    private var contentLength: Long = 0

    private fun download() {
        val intent = Intent(this, DownloadService::class.java)
        startService(intent)
        bindService(intent, object : ServiceConnection {
            override fun onServiceConnected(name: ComponentName, service: IBinder) {
                val downloadBinder = service as DownloadBinder
                downloadBinder.startDownload(url!!, contentLength)
                unbindService(this)
            }
            override fun onServiceDisconnected(name: ComponentName) { }
        }, BIND_AUTO_CREATE)
    }

    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {
        when (requestCode) {
            REQUEST_CODE_DOWNLAOD -> if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                download()
            } else {
                Toast.makeText(this, "You denied the permission", Toast.LENGTH_SHORT).show()
            }
        }
    }

    override fun onCreateOptionsMenu(menu: Menu): Boolean {
        menuInflater.inflate(R.menu.toolbar_web, menu)
        return true
    }

    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        when (item.itemId) {
            android.R.id.home -> finish()
            R.id.refresh -> mWebView.reload()
            R.id.go_back -> mWebView.goBack()
            R.id.go_forward -> mWebView.goForward()
        }
        return true
    }

    override fun onBackPressed() {
        if (mWebView.canGoBack()) {
            mWebView.goBack()
        } else {
            finish()
        }
    }

    companion object {

        private const val REQUEST_CODE_DOWNLAOD = 1

        fun actionStart(context: Context) {
            val intent = Intent(context, WebActivity::class.java)
            context.startActivity(intent)
        }
    }
}

在onCreate中首先调用WebView的loadUrl方法进入指定的url或者,如果Activity启动时没有指定url,则进入百度页面。

如果希望其它app要打开浏览器显示指定url时可以跳转到我们的浏览器,可以在AndroidManifest.xml中为我们的WebActivity加上intent-filter:

        <activity
            android:name="com.sc.web.WebActivity"
            android:icon="@drawable/ic_web"
            android:label="@string/web"
            android:launchMode="singleTask"
            android:taskAffinity="com.sc.web"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />

                <data android:scheme="http" />
                <data android:scheme="https" />
            </intent-filter>
        </activity>

就这样实现了一个简单的浏览器app。

源代码地址:https://github.com/SSSxCCC/SCApp

总结

安卓借助WebView可以轻松实现一个浏览器

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用Android Studio开发浏览器应用程序。您可以使用WebView控件来显示网页内容,并使用Java代码来实现浏览器的基本功能,如导航、书签、历史记录等。此外,您还可以使用第三方库来增强应用程序的功能,例如添加广告拦截、自动填充表单等功能。开发浏览器应用程序需要一定的编程经验和技能,但是使用Android Studio可以简化开发过程并提高效率。 ### 回答2: Android Studio是谷歌公司开发的一款专业的 Android应用开发IDE,拥有丰富的可视化界面和强大的编码功能,支持Java和Kotlin等多种编程语言,帮助开发者快速构建高质量且具有良好交互性的Android应用。本文将介绍如何使用Android Studio开发一个简单浏览器应用。 1. 创建项目 首先,在Android Studio中创建一个新的Android项目,设置必要的项目名称和包名。然后,选择空白Activity作为起点,确保快速创建一个可以运行的Android应用程序并能进行调试。 2. UI设计 接下来,设计浏览器的用户界面。引入WebView控件是浏览器功能的核心,可以展示可视化网页界面并实现与用户的交互。将一个WebView控件添加到MainActivity布局中,使其占据整个屏幕区域。 3. 实现WebView控制器 WebView控制器是浏览器的控制中心,用于管理WebView控件。 使用WebViewClient对象将WebView控件引入主题中,以便在应用程序运行时url变化时展示WebView。 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); WebView myWebView = (WebView) findViewById(R.id.webview); myWebView.setWebViewClient(new WebViewClient()); myWebView.loadUrl("http://www.google.com"); } 此外,设置WebSettings来控制WebView控件和JavaScript交互。通常,WebSettings对象可以使用WebView控制器update()方法在 onResume()中更新,以便在浏览器中加载网络资源。 4. 实现浏览器功能 现在,可以增加浏览器功能来让用户通过WebView控件浏览指定的url。直接为布局中的EditText控件添加一个OnEditorActionListener对象,以截获用户的浏览请求。 private WebView myWebView; private EditText urlEditText; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); myWebView = (WebView) findViewById(R.id.webview); myWebView.setWebViewClient(new WebViewClient()) urlEditText = (EditText) findViewById(R.id.url); urlEditText.setOnEditorActionListener(new TextView.OnEditorActionListener() { @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { if (actionId == EditorInfo.IME_ACTION_GO) { myWebView.loadUrl(urlEditText.getText().toString()); return true; } return false; } }); // init the url bar with a default web site urlEditText.setText("http://www.google.com"); } 此外,浏览器还可以增加后退和前进按钮,这跟WebView控制器通过调用goBack()和goForward()方法实现,代码如下: @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && myWebView.canGoBack()) { myWebView.goBack(); return true; } return super.onKeyDown(keyCode, event); } @Override public boolean onKeyUp(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_FORWARD && myWebView.canGoForward()) { myWebView.goForward(); return true; } return super.onKeyUp(keyCode, event); } 这些代码片段的细节涉及到处理运行时许多边缘情况和错误,但它们说明了Android Studio如何开发浏览器和处理交互事件,运用这些技术可以构建更高级也更实用的Web浏览器应用程序。 ### 回答3: Android系统提供了强大的API和开发工具,使得开发者可以自由地创建浏览器应用。Android Studio是Android平台上的强大开发环境,它提供了许多功能和控件,可以帮助快速创建浏览器应用。 首先,开发者需要创建一个新的Android Studio项目,选择“空白活动”模板。在项目的res/layout目录下,创建一个新的XML文件,用于浏览器主页的布局。可以使用LinearLayout和WebView控件来处理界面布局。 接下来,需要处理WebView的设置。开发者需要在MainActivity中创建一个WebView实例,并配置WebView的设置。例如,设置WebView的缩放控件、启用JavaScript、设置缓存等等。此外,还需要设置WebView的Client,以便在WebView中加载网页时能够响应用户操作。 另外,还需要处理浏览器导航栏等用户交互界面。开发者可以使用Android内置的Toolbar控件来完成导航栏的布局。同时,在MainActivity中创建一个菜单来处理用户对浏览器的控制操作,例如前进、后退、刷新等。 最后,在MainActivity中处理用户输入。当用户输入网址时,开发者需要使用WebView控件来加载相应的网页。可以在onCreateOptionsMenu()中创建一个搜索框,用于接收用户的输入网址。同时,在onOptionsItemSelected()中处理搜索框中的输入内容,并使用WebView加载相应的网页。 总的来说,Android Studio提供了很多控件和API,可以帮助快速创建浏览器应用。开发者可以自由地定制UI、处理用户输入和响应用户操作,创建出功能强大的浏览器应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值