روشن نگه داشتن صفحه نمایش

آموزش روشن نگه داشتن صفحه در برنامه نویسی اندروید
در این جلسه از سری مباحث آموزش برنامه نویسی اندروید قصد دارم نحوه روشن نگه داشتن صفحه نمایش دستگاه اندرویدی، هنگامی که برنامه ما در حال اجراست را بررسی کنم. این کار به دو روش تعریف در اکتیویتی و همچنین لایه XML قابل انجام است.

روشن نگه داشتن صفحه نمایش دستگاه اندرویدی

به نام خدا. گاهی اوقات لازم است در یک یا چند اکتیویتی، صفحه نمایش را تا زمانی که اکتیویتی در حال اجراست روشن نگه داریم. برای مثال هنگامی که کاربر درون خودرو از برنامه مسیریابی استفاده می‌کند، لازم است صفحه نمایش بدون لمس صفحه برای چند دقیقه روشن بماند. در اینجا به دو شیوه می‌توانیم در صفحات مشخصی از برنامه، صفحه نمایش را روشن نگه داشته و از خاموش شدن آن جلوگیری کنیم.

ساخت پروژه

قبل از هرچیز ابتدا طبق مبحث آموزش ساخت پروژه در اندروید استودیو یک پروژه اندرویدی با نام KeepScreenOn می‌سازم. اکتیویتی را از نوع Empty Activity و زبان را Java انتخاب کردم.
ابتدا روش لایه XML و سپس روش تعریف در اکتیویتی را بررسی می‌کنیم.

روشن نگه داشتن صفحه توسط ویژگی keepScreenOn در XML

ساده ترین روش، استفاده از ویژگی keepScreenOn در لایه XML اکتیویتی است. این ویژگی در view والد تعریف می‌شود و تا زمانی که اکتیویتی در حال اجرا باشد، صفحه نمایش در حالت روشن باقی می‌ماند:

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<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"
    android:keepScreenOn="true">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"/>

</LinearLayout>

در کد فوق، ویژگی android:keepScreenOn با مقدار true در layout تعریف شده است. با اجرای پروژه تا زمانی که اکتیویتی در حال اجراست، صفحه نمایش خاموش نخواهد شد.

روشن نگه داشتن صفحه توسط FLAG_KEEP_SCREEN_ON در اکتیویتی

روش قبل در عین سادگی یک ایراد هم دارد. اینکه به محض اجرای اکتیویتی و تا زمانی که این اکتیویتی در حال اجرا باشد، صفحه نمایش در حالت روشن باقی می‌ماند و امکان مدیریت آن وجود ندارد. در بعضی موارد ممکن است روشن ماندن صفحه را صرفا در شرایط خاص و یا بعد از انجام یک عمل، نیاز داشته باشیم. برای مثال در برنامه مسیریابی، تا زمانی که کاربر روی نقشه مبدا و مقصد را تعیین نکرده و مسیر مشخص نشده، نیاز به روشن ماندن صفحه نداریم. بنابراین اینجا روش XML مناسب ما نبوده و صرف باز شدن اکتیویتی مربوط به نقشه، دلیلی برای فعال نگه داشتن صفحه نمایش نیست. این قسمت را با یک مثال ساده در قالب یک دکمه سوئیچ (Switch Button) نشان می‌دهم:

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<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"
    android:gravity="center"
    tools:context=".MainActivity">

    <Switch
        android:id="@+id/switch_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    
</LinearLayout>

MainActivity.java

package ir.android_studio.keepscreenon;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.WindowManager;
import android.widget.CompoundButton;
import android.widget.Switch;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    private Switch screenSwitch;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        screenSwitch = findViewById(R.id.switch_btn);

        screenSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton compoundButton, boolean b) {

                if (b) {
                    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
                    Toast.makeText(MainActivity.this, " حالت روشن فعال شد", Toast.LENGTH_SHORT).show();
                } else {
                    getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
                    Toast.makeText(MainActivity.this, " حالت روشن غیر فعال شد", Toast.LENGTH_SHORT).show();
                }

            }
        });

    }
}

ابتدا ویژگی keepScreenOn را از لایه XML حذف و یک Switch Button به آن اضافه کردم. سپس در اکتیویتی درون متد onCheckedChanged دکمه سوئیچ، شرطی تعریف کردم که در صورت روشن شدن دکمه کد زیر اجرا شود:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

کلاس WindowManager.LayoutParams مدیریت صفحات در اندروید را بر عهده دارد. FLAG_KEEP_SCREEN_ON همانطور که از نام آن پیداست یک نشانه یا پرچم (Flag) برای روشن ماندن صفحه است. حالا وقتی این نشانه درون getWindow().addFlags() قرار گیرد حالت روشن ماندن صفحه برای این اکتیویتی فعال می‌شود.
برای غیر فعال کردن این حالت کافیست بجای addFlags() متد clearFlags() فراخوانی شود:

getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

مجدد پروژه را اجرا و هردو حالت فعال و غیر فعال بودن دکمه سوئیچ را تست کنید.

نکته: در شبیه سازهای اندرویدی مانند Genymotion در حالت پیش فرض، صفحه نمایش همیشه در حالت روشن قرار دارد. بنابراین برای مشاهده خروجی برنامه لازم است گزینه‌های Stay awake و Always stake awake در Developer Options غیر فعال شود:
غیر فعال کردن stay awake صفحه نمایش اندروید در Developer Options

مطالعه‌ی بیشتر:

https://developer.android.com/training/scheduling/wakelock
https://developer.android.com/reference/android/view/WindowManager.LayoutParams

توجه : سورس پروژه درون پوشه Exercises قرار دارد

دانلود نسخه PDF این آموزش به همراه سورس پروژه
تعداد صفحات : ۶
حجم : ۱ مگابایت
قیمت : رایگان
دانلود رایگان با حجم ۱ مگابایت لینک کمکی
این مطلب چقدر برایتان مفید بود؟ لطفا امتیاز دهید
دوره آموزش برنامه نویسی اندروید
دوره آموزش برنامه نویسی اندروید

آموزش‌ها در دو دسته «پایه» و «تکمیلی» منتشر می‌شوند.
آموزش‌های پایه شامل مباحث اصلی و آموزش‌های تکمیلی مطالبی است که می‌بایست در کنار مطالب اصلی از آنها استفاده کنیم.
شما با دریافت این دوره به تمامی آموزش‌های غیر رایگان و رایگان موجود در وب سایت دسترسی دارید که تخفیفی برای آموزش‌های غیر رایگان نیز درنظر گرفته شده. این پکیج به دو صورت دانلودی و ارسال پستی ارائه می‌گردد.
با خرید این دوره، به تمامی آموزش‌های غیر رایگانی که در آینده منتشر می‌شود نیز به صورت رایگان دسترسی خواهید داشت!

یک دیدگاه بنویسید

پرسش‌های زیر تایید و پاسخ داده نخواهد شد:
۱ : جزء موارد پاسخ داده شده در مطلب "مشکلات و پرسش های رایج" باشد
۲ : سوال قبلا توسط کاربران در دیدگاهها مطرح و پاسخ داده شده باشد
۳ : سوال خارج از مبحث آموزشی موجود در این صفحه باشد

پاسخی بگذارید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

کد امنیتی *