WebView এ ওয়েব অ্যাপস তৈরি করুন

ক্লায়েন্ট অ্যাপের অংশ হিসেবে একটি ওয়েব অ্যাপ্লিকেশন বা ওয়েব পেজ সরবরাহ করতে WebView ব্যবহার করুন। WebView ক্লাসটি অ্যান্ড্রয়েডের View ক্লাসের একটি বর্ধিত রূপ, যা আপনাকে আপনার অ্যাক্টিভিটি লেআউটের অংশ হিসেবে ওয়েব পেজ প্রদর্শন করতে দেয়। এতে একটি সম্পূর্ণ উন্নত ওয়েব ব্রাউজারের বৈশিষ্ট্য, যেমন নেভিগেশন কন্ট্রোল বা অ্যাড্রেস বার অন্তর্ভুক্ত নেই। ডিফল্টরূপে, WebView শুধুমাত্র একটি ওয়েব পেজ প্রদর্শন করে।

WebView আপনার অ্যাপে এমন সব তথ্য যোগ করতে সাহায্য করতে পারে যা আপডেট করার প্রয়োজন হতে পারে, যেমন ব্যবহারকারী চুক্তি বা ব্যবহারকারী নির্দেশিকা। আপনার অ্যান্ড্রয়েড অ্যাপের মধ্যে, আপনি একটি Activity তৈরি করতে পারেন যাতে একটি WebView থাকবে, এবং তারপর সেটি ব্যবহার করে আপনার অনলাইনে হোস্ট করা ডকুমেন্টটি প্রদর্শন করতে পারেন।

আপনার অ্যাপ যখন ব্যবহারকারীকে এমন ডেটা সরবরাহ করে যা পুনরুদ্ধার করার জন্য ইন্টারনেট সংযোগের প্রয়োজন হয়, যেমন ইমেল, তখন WebView সাহায্য করতে পারে। এই ক্ষেত্রে, আপনি দেখতে পারেন যে একটি নেটওয়ার্ক অনুরোধ করে, তারপর ডেটা পার্স করে এবং একটি অ্যান্ড্রয়েড লেআউটে রেন্ডার করার পরিবর্তে, আপনার অ্যান্ড্রয়েড অ্যাপে এমন একটি WebView তৈরি করা সহজ যা ব্যবহারকারীর সমস্ত ডেটা সহ একটি ওয়েব পেজ দেখায়। এর পরিবর্তে, আপনি অ্যান্ড্রয়েড-চালিত ডিভাইসগুলির জন্য বিশেষভাবে তৈরি একটি ওয়েব পেজ ডিজাইন করতে পারেন এবং তারপরে আপনার অ্যান্ড্রয়েড অ্যাপে একটি WebView প্রয়োগ করতে পারেন যা সেই ওয়েব পেজটি লোড করবে।

এই ডকুমেন্টটিতে বর্ণনা করা হয়েছে কীভাবে WebView দিয়ে কাজ শুরু করতে হয়, কীভাবে আপনার ওয়েব পেজ থেকে জাভাস্ক্রিপ্টকে আপনার অ্যান্ড্রয়েড অ্যাপের ক্লায়েন্ট-সাইড কোডের সাথে যুক্ত করতে হয়, কীভাবে পেজ নেভিগেশন পরিচালনা করতে হয় এবং WebView ব্যবহার করার সময় কীভাবে উইন্ডোগুলো ম্যানেজ করতে হয়।

অ্যান্ড্রয়েডের আগের সংস্করণগুলিতে ওয়েবভিউ নিয়ে কাজ করুন

আপনার অ্যাপটি যে ডিভাইসে চলছে, সেখানে WebView সাম্প্রতিক বৈশিষ্ট্যগুলো নিরাপদে ব্যবহার করার জন্য AndroidX Webkit লাইব্রেরিটি যোগ করুন। এটি একটি স্ট্যাটিক লাইব্রেরি যা আপনি আপনার অ্যাপ্লিকেশনে যোগ করে android.webkit সেইসব API ব্যবহার করতে পারেন, যেগুলো প্ল্যাটফর্মের আগের সংস্করণগুলোতে উপলব্ধ ছিল না।

আপনার build.gradle ফাইলে এটি নিম্নরূপভাবে যোগ করুন:

কোটলিন

dependencies {
    implementation("androidx.webkit:webkit:1.8.0")
}

গ্রুভি

dependencies {
    implementation ("androidx.webkit:webkit:1.8.0")
}

আরও বিস্তারিত জানতে গিটহাবে WebView উদাহরণটি দেখুন।

আপনার অ্যাপে একটি ওয়েবভিউ যোগ করুন

আপনার অ্যাপে একটি WebView যোগ করতে, আপনি আপনার অ্যাক্টিভিটি লেআউটে <WebView> এলিমেন্টটি অন্তর্ভুক্ত করতে পারেন অথবা onCreate() ফাংশনে সম্পূর্ণ Activity উইন্ডোটিকে একটি WebView হিসেবে সেট করতে পারেন।

অ্যাক্টিভিটি লেআউটে একটি ওয়েবভিউ যোগ করুন

আপনার অ্যাপের লেআউটে একটি WebView যোগ করতে, আপনার অ্যাক্টিভিটির লেআউট XML ফাইলে নিম্নলিখিত কোডটি যোগ করুন:

<WebView
    android:id="@+id/webview"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
/>

WebView তে একটি ওয়েব পেজ লোড করতে loadUrl() ব্যবহার করুন, যেমনটি নিচের উদাহরণে দেখানো হয়েছে:

কোটলিন

val myWebView: WebView = findViewById(R.id.webview)
myWebView.loadUrl("http://www.example.com")

জাভা

WebView myWebView = (WebView) findViewById(R.id.webview);
myWebView.loadUrl("http://www.example.com");

onCreate() এ একটি WebView যোগ করুন

এর পরিবর্তে, কোনো অ্যাক্টিভিটির onCreate() মেথডে আপনার অ্যাপে একটি WebView যোগ করতে, নিম্নলিখিতের মতো লজিক ব্যবহার করুন:

কোটলিন

val myWebView = WebView(activityContext)
setContentView(myWebView)

জাভা

WebView myWebView = new WebView(activityContext);
setContentView(myWebView);

তারপর পৃষ্ঠাটি লোড করুন:

কোটলিন

myWebView.loadUrl("http://www.example.com")

জাভা

myWebView.loadUrl("https://www.example.com");

অথবা একটি HTML স্ট্রিং থেকে URL লোড করুন:

কোটলিন

// Create an unencoded HTML string, then convert the unencoded HTML string into
// bytes. Encode it with base64 and load the data.
val unencodedHtml =
     "<html><body>'%23' is the percent code for ‘#‘ </body></html>";
val encodedHtml = Base64.encodeToString(unencodedHtml.toByteArray(), Base64.NO_PADDING)
myWebView.loadData(encodedHtml, "text/html", "base64")

জাভা

// Create an unencoded HTML string, then convert the unencoded HTML string into
// bytes. Encode it with base64 and load the data.
String unencodedHtml =
     "<html><body>'%23' is the percent code for ‘#‘ </body></html>";
String encodedHtml = Base64.encodeToString(unencodedHtml.getBytes(),
        Base64.NO_PADDING);
myWebView.loadData(encodedHtml, "text/html", "base64");

আপনার অ্যাপের অবশ্যই ইন্টারনেট অ্যাক্সেস থাকতে হবে। ইন্টারনেট অ্যাক্সেস পেতে, আপনার ম্যানিফেস্ট ফাইলে INTERNET পারমিশনের জন্য অনুরোধ করুন, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

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

আপনি নিম্নলিখিত যেকোনো একটি পদ্ধতি অনুসরণ করে আপনার WebView কাস্টমাইজ করতে পারেন:

  • WebChromeClient ব্যবহার করে ফুলস্ক্রিন সাপোর্ট চালু করা হচ্ছে। যখন কোনো WebView এর হোস্ট অ্যাপের UI পরিবর্তন করার অনুমতির প্রয়োজন হয়, যেমন উইন্ডো তৈরি বা বন্ধ করা অথবা ব্যবহারকারীকে জাভাস্ক্রিপ্ট ডায়ালগ পাঠানো, তখনও এই ক্লাসটি কল করা হয়। এই প্রসঙ্গে ডিবাগিং সম্পর্কে আরও জানতে, “Debug web apps” পড়ুন।
  • WebViewClient ব্যবহার করে ফর্ম জমা দেওয়ার সময় ত্রুটি বা নেভিগেশনের মতো কন্টেন্ট রেন্ডারিংকে প্রভাবিত করে এমন ইভেন্টগুলি পরিচালনা করা হয়। আপনি URL লোডিং ইন্টারসেপ্ট করতেও এই সাবক্লাসটি ব্যবহার করতে পারেন।
  • WebSettings পরিবর্তন করে জাভাস্ক্রিপ্ট সক্রিয় করা।
  • জাভাস্ক্রিপ্ট ব্যবহার করে WebView তে ইনজেক্ট করা অ্যান্ড্রয়েড ফ্রেমওয়ার্ক অবজেক্টগুলো অ্যাক্সেস করা।

ওয়েবভিউতে জাভাস্ক্রিপ্ট ব্যবহার করুন

আপনি আপনার WebView তে যে ওয়েব পেজটি লোড করতে চান, সেটি যদি জাভাস্ক্রিপ্ট ব্যবহার করে, তবে আপনাকে অবশ্যই আপনার WebView জন্য জাভাস্ক্রিপ্ট সক্রিয় করতে হবে। জাভাস্ক্রিপ্ট সক্রিয় করার পর, আপনি আপনার অ্যাপ কোড এবং জাভাস্ক্রিপ্ট কোডের মধ্যে ইন্টারফেস তৈরি করতে পারবেন।

জাভাস্ক্রিপ্ট সক্ষম করুন

একটি WebView তে জাভাস্ক্রিপ্ট ডিফল্টরূপে নিষ্ক্রিয় থাকে। আপনি আপনার WebView সাথে সংযুক্ত WebSettings মাধ্যমে এটি সক্রিয় করতে পারেন। getSettings() ব্যবহার করে WebSettings সংগ্রহ করুন, তারপর setJavaScriptEnabled() ব্যবহার করে জাভাস্ক্রিপ্ট সক্রিয় করুন।

নিম্নলিখিত উদাহরণটি দেখুন:

কোটলিন

val myWebView: WebView = findViewById(R.id.webview)
myWebView.settings.javaScriptEnabled = true

জাভা

WebView myWebView = (WebView) findViewById(R.id.webview);
WebSettings webSettings = myWebView.getSettings();
webSettings.setJavaScriptEnabled(true);

WebSettings আরও বিভিন্ন ধরনের সেটিংসে অ্যাক্সেস দেয় যা আপনার কাজে লাগতে পারে। উদাহরণস্বরূপ, আপনি যদি এমন একটি ওয়েব অ্যাপ্লিকেশন তৈরি করেন যা বিশেষভাবে আপনার অ্যান্ড্রয়েড অ্যাপের WebView এর জন্য ডিজাইন করা হয়েছে, তাহলে আপনি setUserAgentString() ব্যবহার করে একটি কাস্টম ইউজার এজেন্ট স্ট্রিং সংজ্ঞায়িত করতে পারেন। এরপর, আপনার ওয়েব পেজের অনুরোধকারী ক্লায়েন্টটি যে আপনার অ্যান্ড্রয়েড অ্যাপ, তা যাচাই করার জন্য আপনি আপনার ওয়েব পেজে সেই কাস্টম ইউজার এজেন্টটি কোয়েরি করতে পারেন।

জাভাস্ক্রিপ্ট কোডকে অ্যান্ড্রয়েড কোডের সাথে সংযুক্ত করুন

আপনার অ্যান্ড্রয়েড অ্যাপের WebView এর জন্য বিশেষভাবে ডিজাইন করা একটি ওয়েব অ্যাপ্লিকেশন তৈরি করার সময়, আপনি আপনার জাভাস্ক্রিপ্ট কোড এবং ক্লায়েন্ট-সাইড অ্যান্ড্রয়েড কোডের মধ্যে ইন্টারফেস তৈরি করতে পারেন। উদাহরণস্বরূপ, জাভাস্ক্রিপ্টের alert() ফাংশন ব্যবহার না করে, আপনার জাভাস্ক্রিপ্ট কোড একটি Dialog প্রদর্শন করার জন্য আপনার অ্যান্ড্রয়েড কোডের কোনো মেথডকে কল করতে পারে।

আপনার জাভাস্ক্রিপ্ট এবং অ্যান্ড্রয়েড কোডের মধ্যে একটি নতুন ইন্টারফেস যুক্ত করতে, addJavascriptInterface() ফাংশনটি কল করুন। এক্ষেত্রে, আপনার জাভাস্ক্রিপ্টের সাথে যুক্ত করার জন্য একটি ক্লাস ইনস্ট্যান্স এবং একটি ইন্টারফেসের নাম পাস করুন, যে নামটি ব্যবহার করে আপনার জাভাস্ক্রিপ্ট ক্লাসটি অ্যাক্সেস করতে পারবে।

জাভাস্ক্রিপ্ট এবং নেটিভ কোডের মধ্যে যোগাযোগ, যার মধ্যে আরও আধুনিক ও সুরক্ষিত এপিআই অন্তর্ভুক্ত, সে সম্পর্কে আরও জানতে “Access native APIs with JSBridge” দেখুন।

উদাহরণস্বরূপ, আপনি আপনার অ্যান্ড্রয়েড অ্যাপে নিম্নলিখিত ক্লাসটি অন্তর্ভুক্ত করতে পারেন:

কোটলিন

/** Instantiate the interface and set the context.  */
class WebAppInterface(private val mContext: Context) {

    /** Show a toast from the web page.  */
    @JavascriptInterface
    fun showToast(toast: String) {
        Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show()
    }
}

জাভা

public class WebAppInterface {
    Context mContext;

    /** Instantiate the interface and set the context. */
    WebAppInterface(Context c) {
        mContext = c;
    }

    /** Show a toast from the web page. */
    @JavascriptInterface
    public void showToast(String toast) {
        Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show();
    }
}

এই উদাহরণে, WebAppInterface ক্লাসটি showToast() মেথড ব্যবহার করে ওয়েব পেজকে একটি Toast মেসেজ তৈরি করার সুযোগ দেয়।

আপনি addJavascriptInterface() ব্যবহার করে এই ক্লাসটিকে আপনার WebView তে চলমান জাভাস্ক্রিপ্টের সাথে যুক্ত করতে পারেন, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

কোটলিন

val webView: WebView = findViewById(R.id.webview)
webView.addJavascriptInterface(WebAppInterface(this), "Android")

জাভা

WebView webView = (WebView) findViewById(R.id.webview);
webView.addJavascriptInterface(new WebAppInterface(this), "Android");

এটি WebView তে চলমান জাভাস্ক্রিপ্টের জন্য Android নামে একটি ইন্টারফেস তৈরি করে। এই পর্যায়ে, আপনার ওয়েব অ্যাপ্লিকেশনটি WebAppInterface ক্লাসটি অ্যাক্সেস করতে পারে। উদাহরণস্বরূপ, এখানে কিছু HTML এবং জাভাস্ক্রিপ্ট দেওয়া হলো যা ব্যবহারকারী একটি বোতামে ট্যাপ করলে নতুন ইন্টারফেসটি ব্যবহার করে একটি টোস্ট মেসেজ তৈরি করে:

<input type="button" value="Say hello" onClick="showAndroidToast('Hello Android!')" />

<script type="text/javascript">
    function showAndroidToast(toast) {
        Android.showToast(toast);
    }
</script>

জাভাস্ক্রিপ্ট থেকে Android ইন্টারফেস ইনিশিয়ালাইজ করার কোনো প্রয়োজন নেই। WebView স্বয়ংক্রিয়ভাবে এটিকে আপনার ওয়েব পেজের জন্য উপলব্ধ করে তোলে। তাই, যখন কোনো ব্যবহারকারী বাটনটিতে ট্যাপ করেন, তখন showAndroidToast() ফাংশনটি Android ইন্টারফেস ব্যবহার করে WebAppInterface.showToast() মেথডটিকে কল করে।

পৃষ্ঠা নেভিগেশন পরিচালনা করুন

যখন ব্যবহারকারী আপনার WebView তে থাকা কোনো ওয়েব পেজের লিঙ্কে ট্যাপ করেন, তখন ডিফল্টরূপে অ্যান্ড্রয়েড একটি অ্যাপ চালু করে যা ইউআরএল (URL) পরিচালনা করে। সাধারণত, ডিফল্ট ওয়েব ব্রাউজারটি খোলে এবং গন্তব্য ইউআরএলটি লোড করে। তবে, আপনি আপনার WebView জন্য এই আচরণটি পরিবর্তন করতে পারেন, যাতে লিঙ্কগুলো আপনার WebView মধ্যেই খোলে। এরপর আপনি ব্যবহারকারীকে তাদের ওয়েব পেজের ইতিহাসে সামনে ও পেছনে যাওয়ার সুযোগ দিতে পারেন, যা আপনার WebView দ্বারা সংরক্ষিত থাকে।

ব্যবহারকারীর ট্যাপ করা লিঙ্কগুলো খোলার জন্য, setWebViewClient() ব্যবহার করে আপনার WebView জন্য একটি WebViewClient প্রদান করুন। ব্যবহারকারীর ট্যাপ করা সমস্ত লিঙ্ক আপনার WebView তে লোড হয়। ক্লিক করা লিঙ্কটি কোথায় লোড হবে তার উপর যদি আপনি আরও বেশি নিয়ন্ত্রণ চান, তবে shouldOverrideUrlLoading() মেথডটিকে ওভাররাইড করে আপনার নিজস্ব একটি WebViewClient তৈরি করুন। নিম্নলিখিত উদাহরণটি ধরে নেয় যে MyWebViewClient হলো Activity এর একটি ইনার ক্লাস।

কোটলিন

private class MyWebViewClient : WebViewClient() {

    override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean {
        if (Uri.parse(url).host == "www.example.com") {
            // This is your website, so don't override. Let your WebView load
            // the page.
            return false
        }
        // Otherwise, the link isn't for a page on your site, so launch another
        // Activity that handles URLs.
        Intent(Intent.ACTION_VIEW, Uri.parse(url)).apply {
            startActivity(this)
        }
        return true
    }
}

জাভা

private class MyWebViewClient extends WebViewClient {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
        if ("www.example.com".equals(request.getUrl().getHost())) {
      // This is your website, so don't override. Let your WebView load the
      // page.
      return false;
    }
    // Otherwise, the link isn't for a page on your site, so launch another
    // Activity that handles URLs.
    Intent intent = new Intent(Intent.ACTION_VIEW, request.getUrl());
    startActivity(intent);
    return true;
  }
}

এরপর WebView এর জন্য এই নতুন WebViewClient এর একটি ইনস্ট্যান্স তৈরি করুন:

কোটলিন

val myWebView: WebView = findViewById(R.id.webview)
myWebView.webViewClient = MyWebViewClient()

জাভা

WebView myWebView = (WebView) findViewById(R.id.webview);
myWebView.setWebViewClient(new MyWebViewClient());

এখন যখন ব্যবহারকারী কোনো লিঙ্কে ট্যাপ করেন, তখন সিস্টেম shouldOverrideUrlLoading() মেথডটিকে কল করে, যা পূর্ববর্তী উদাহরণে সংজ্ঞায়িত একটি নির্দিষ্ট ডোমেনের সাথে URL হোস্টটি মেলে কিনা তা পরীক্ষা করে। যদি এটি মিলে যায়, তাহলে মেথডটি false রিটার্ন করে এবং URL লোডিং ওভাররাইড করে না। এটি WebView স্বাভাবিকভাবে URL লোড করতে দেয়। যদি URL হোস্টটি না মেলে, তাহলে URL হ্যান্ডেল করার জন্য ডিফল্ট Activity চালু করতে একটি Intent তৈরি করা হয়, যা ব্যবহারকারীর ডিফল্ট ওয়েব ব্রাউজারে রিজলভ হয়।

কাস্টম ইউআরএল পরিচালনা করুন

কাস্টম ইউআরএল স্কিম ব্যবহারকারী রিসোর্স অনুরোধ করার ও লিঙ্ক রিজলভ করার ক্ষেত্রে WebView কিছু বিধিনিষেধ প্রয়োগ করে। উদাহরণস্বরূপ, যদি আপনি shouldOverrideUrlLoading() বা shouldInterceptRequest() এর মতো কলব্যাক ইমপ্লিমেন্ট করেন, তাহলে WebView শুধুমাত্র বৈধ ইউআরএলগুলোর জন্যই সেগুলোকে কল করে।

উদাহরণস্বরূপ, WebView এই ধরনের লিঙ্কের জন্য আপনার shouldOverrideUrlLoading() মেথডটি কল নাও করতে পারে:

<a href="showProfile">Show Profile</a>

পূর্ববর্তী উদাহরণে দেখানোটির মতো অবৈধ URL-গুলো WebView তে অসামঞ্জস্যপূর্ণভাবে পরিচালনা করা হয়, তাই আমরা এর পরিবর্তে একটি সুগঠিত URL ব্যবহার করার পরামর্শ দিই। আপনি একটি কাস্টম স্কিম অথবা আপনার প্রতিষ্ঠানের নিয়ন্ত্রণাধীন কোনো ডোমেইনের জন্য একটি HTTPS URL ব্যবহার করতে পারেন।

আগের উদাহরণের মতো লিঙ্কে একটি সাধারণ স্ট্রিং ব্যবহার করার পরিবর্তে, আপনি নিম্নলিখিতের মতো একটি কাস্টম স্কিম ব্যবহার করতে পারেন:

<a href="example-app:showProfile">Show Profile</a>

এরপর আপনি আপনার shouldOverrideUrlLoading() মেথডে এই URL-টি এইভাবে হ্যান্ডেল করতে পারেন:

কোটলিন

// The URL scheme must be non-hierarchical, meaning no trailing slashes.
const val APP_SCHEME = "example-app:"

override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean {
    return if (url?.startsWith(APP_SCHEME) == true) {
        urlData = URLDecoder.decode(url.substring(APP_SCHEME.length), "UTF-8")
        respondToData(urlData)
        true
    } else {
        false
    }
}

জাভা

// The URL scheme must be non-hierarchical, meaning no trailing slashes.
private static final String APP_SCHEME = "example-app:";

@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
    if (url.startsWith(APP_SCHEME)) {
        urlData = URLDecoder.decode(url.substring(APP_SCHEME.length()), "UTF-8");
        respondToData(urlData);
        return true;
    }
    return false;
}

shouldOverrideUrlLoading() এপিআইটি মূলত নির্দিষ্ট ইউআরএল-এর জন্য ইন্টেন্ট চালু করার উদ্দেশ্যে তৈরি। এটি প্রয়োগ করার সময়, WebView দ্বারা পরিচালিত ইউআরএলগুলোর জন্য false রিটার্ন করতে ভুলবেন না। তবে, আপনি শুধু ইন্টেন্ট চালু করার মধ্যেই সীমাবদ্ধ নন। পূর্ববর্তী কোড স্যাম্পলগুলোতে আপনি ইন্টেন্ট চালু করার পরিবর্তে যেকোনো কাস্টম আচরণ ব্যবহার করতে পারেন।

যখন আপনার WebView ইউআরএল লোডিং ওভাররাইড করে, তখন এটি স্বয়ংক্রিয়ভাবে ভিজিট করা ওয়েব পেজগুলোর একটি ইতিহাস তৈরি করে। আপনি goBack() এবং goForward() ব্যবহার করে এই ইতিহাসের মধ্যে সামনে ও পেছনে যেতে পারেন।

উদাহরণস্বরূপ, নিচে দেখানো হলো কিভাবে আপনার Activity ডিভাইসের ব্যাক বাটন ব্যবহার করে পেছনে যেতে পারে:

কোটলিন

override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
    // Check whether the key event is the Back button and if there's history.
    if (keyCode == KeyEvent.KEYCODE_BACK && myWebView.canGoBack()) {
        myWebView.goBack()
        return true
    }
    // If it isn't the Back button or there isn't web page history, bubble up to
    // the default system behavior. Probably exit the activity.
    return super.onKeyDown(keyCode, event)
}

জাভা

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    // Check whether the key event is the Back button and if there's history.
    if ((keyCode == KeyEvent.KEYCODE_BACK) && myWebView.canGoBack()) {
        myWebView.goBack();
        return true;
    }
    // If it isn't the Back button or there's no web page history, bubble up to
    // the default system behavior. Probably exit the activity.
    return super.onKeyDown(keyCode, event);
}

আপনার অ্যাপ যদি AndroidX AppCompat 1.6.0+ ব্যবহার করে, তাহলে আপনি পূর্ববর্তী কোড স্নিপেটটিকে আরও সরল করতে পারেন:

কোটলিন

onBackPressedDispatcher.addCallback {
    // Check whether there's history.
    if (myWebView.canGoBack()) {
        myWebView.goBack()
    }
}

জাভা

onBackPressedDispatcher.addCallback {
    // Check whether there's history.
    if (myWebView.canGoBack()) {
        myWebView.goBack();
    }
}

` canGoBack() ` মেথডটি `true` রিটার্ন করে যদি ব্যবহারকারীর দেখার মতো কোনো ওয়েব পেজের ইতিহাস থাকে। একইভাবে, সামনে এগোনোর ইতিহাস আছে কিনা তা পরীক্ষা করার জন্য আপনি canGoForward() ব্যবহার করতে পারেন। আপনি যদি এই পরীক্ষাটি না করেন, তাহলে ব্যবহারকারী ইতিহাসের শেষে পৌঁছানোর পর ` goBack() এবং goForward() কিছুই করবে না।

ডিভাইস কনফিগারেশন পরিবর্তনগুলি পরিচালনা করুন

রানটাইমের সময়, ডিভাইসের কনফিগারেশন পরিবর্তিত হলে অ্যাক্টিভিটির অবস্থার পরিবর্তন ঘটে, যেমন যখন ব্যবহারকারীরা ডিভাইসটি ঘোরান বা একটি ইনপুট মেথড এডিটর (IME) বন্ধ করেন। এই পরিবর্তনগুলোর কারণে একটি WebView অবজেক্টের অ্যাক্টিভিটি ধ্বংস হয়ে যায় এবং একটি নতুন অ্যাক্টিভিটি তৈরি হয়, যা একটি নতুন WebView অবজেক্টও তৈরি করে এবং ধ্বংস হয়ে যাওয়া অবজেক্টটির URL লোড করে। আপনার অ্যাক্টিভিটির ডিফল্ট আচরণ পরিবর্তন করতে, আপনি আপনার ম্যানিফেস্টে orientation পরিবর্তন কীভাবে পরিচালনা করা হয় তা পরিবর্তন করতে পারেন। রানটাইমের সময় কনফিগারেশন পরিবর্তন পরিচালনা সম্পর্কে আরও জানতে, "কনফিগারেশন পরিবর্তন পরিচালনা" পড়ুন।

উইন্ডোজ পরিচালনা করুন

ডিফল্টরূপে, নতুন উইন্ডো খোলার অনুরোধ উপেক্ষা করা হয়। জাভাস্ক্রিপ্ট দ্বারা খোলা হোক বা কোনো লিঙ্কের টার্গেট অ্যাট্রিবিউটের মাধ্যমে খোলা হোক, এই নিয়মটি প্রযোজ্য। একাধিক উইন্ডো খোলার ক্ষেত্রে নিজস্ব আচরণ নিশ্চিত করতে আপনি আপনার WebChromeClient কাস্টমাইজ করতে পারেন।

আপনার অ্যাপকে আরও সুরক্ষিত রাখতে, পপআপ এবং নতুন উইন্ডো খোলা বন্ধ রাখাই সবচেয়ে ভালো। এই আচরণটি প্রয়োগ করার সবচেয়ে নিরাপদ উপায় হলো setSupportMultipleWindows() ফাংশনে "true" পাস করা, কিন্তু onCreateWindow() মেথডটিকে ওভাররাইড না করা, যার উপর setSupportMultipleWindows() ফাংশনটি নির্ভরশীল। এই লজিকটি এমন কোনো পেজকে লোড হতে বাধা দেয়, যার লিঙ্কে target="_blank" ব্যবহার করা হয়েছে।