কম্পিউটার টিউটোরিয়াল

Android-এ AlarmManager ব্যবহারের পদ্ধতি

ওভারভিউ

AlarmManager Android-এ সময়-ভিত্তিক টাস্ক শিডিউল করার জন্য একটি সিস্টেম সার্ভিস। এটি অ্যাপ বন্ধ থাকলে ও কাজ করতে পারে। এই টিউটোরিয়ালে TimePicker ব্যবহার করে আপডেট 알ার্ম সেট করার পদ্ধতি দেখানো হয়েছে।

প্রয়োজনীয় ধাপসমূহ

ধাপ ১: নতুন প্রজেক্ট তৈরি

Android Studio-এ File → New Project নির্বাচন করুন।

ধাপ ২: activity_main.xml লেআউট

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="8dp"
    tools:context=".MainActivity">
    <LinearLayout
        android:id="@+id/linearLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:orientation="vertical">
        <TimePicker
            android:id="@+id/timePicker"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
        <Button
            android:id="@+id/buttonAlarm"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text="Set Alarm" />
    </LinearLayout>
</RelativeLayout>

ধাপ ৩: MainActivity.kt বাস্তবায়ন

import android.app.AlarmManager
import android.app.PendingIntent
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.os.Build
import android.os.Bundle
import android.util.Log
import android.widget.Button
import android.widget.TimePicker
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import java.util.Calendar

class MainActivity : AppCompatActivity() {
    private lateinit var btnSetAlarm: Button
    private lateinit var timePicker: TimePicker
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        title = "AlarmManager Demo"
        
        timePicker = findViewById(R.id.timePicker)
        btnSetAlarm = findViewById(R.id.buttonAlarm)
        
        btnSetAlarm.setOnClickListener {
            val calendar = Calendar.getInstance()
            
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                calendar.set(
                    calendar.get(Calendar.YEAR),
                    calendar.get(Calendar.MONTH),
                    calendar.get(Calendar.DAY_OF_MONTH),
                    timePicker.hour,
                    timePicker.minute,
                    0
                )
            } else {
                calendar.set(
                    calendar.get(Calendar.YEAR),
                    calendar.get(Calendar.MONTH),
                    calendar.get(Calendar.DAY_OF_MONTH),
                    timePicker.currentHour,
                    timePicker.currentMinute,
                    0
                )
            }
            
            setAlarm(calendar.timeInMillis)
        }
    }
    
    private fun setAlarm(timeInMillis: Long) {
        val alarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager
        val intent = Intent(this, MyAlarm::class.java)
        val pendingIntent = PendingIntent.getBroadcast(
            this, 0, intent, 
            PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT
        )
        
        // প্রতিদিন পুনরাবৃত্তি হওয়া আলার্ম
        alarmManager.setRepeating(
            AlarmManager.RTC_WAKEUP,
            timeInMillis,
            AlarmManager.INTERVAL_DAY,
            pendingIntent
        )
        
        Toast.makeText(this, "Alarm is set", Toast.LENGTH_SHORT).show()
    }
    
    // BroadcastReceiver ইনার ক্লাস
    private class MyAlarm : BroadcastReceiver() {
        override fun onReceive(context: Context, intent: Intent) {
            Log.d("Alarm Bell", "Alarm just fired")
            // এখানে নোটিফিকেশন দেখানো বা অন্যান্য কাজ করা যায়
        }
    }
}

ধাপ ৪: AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
    package="com.example.alarmdemo">
    
    <uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" />
    <uses-permission android:name="android.permission.USE_EXACT_ALARM" />
    
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        
        <receiver android:name=".MainActivity$MyAlarm" android:exported="false" />
        
    </application>
</manifest>

গুরুত্বপূর্ণ নোটস

  • Android 12+ (API 31+): `SCHEDULE_EXACT_ALARM` বা `USE_EXACT_ALARM` পারমিশন প্রয়োজন
  • Doze Mode: ডিভাইস স্লিপ মোডে থাকলে `setExactAndAllowWhileIdle()` বা `setAndAllowWhileIdle()` ব্যবহার করুন
  • PendingIntent ফ্ল্যাগ: Android 12+ এ `FLAG_IMMUTABLE` বা `FLAG_MUTABLE` বাধ্যতামূলক
  • রিসিভার রেজিস্ট্রেশন: ম্যানিফেস্টে রিসিভার ডিক্লেয়ার করতে হবে

আধুনিক বিকল্প

নতুন অ্যাপগুলোর জন্য WorkManager বা AlarmManager.setExact() এর পরিবর্তে setWindow() ব্যবহার করা ভালো, কারণ সিস্টেম ব্যাটারি অপ্টিমাইজেশনের জন্য আলার্ম টাইম সামান্য শিফট করতে পারে।

  1. অ্যান্ড্রয়েডে Snackbar ব্যবহার করার পদ্ধতি

  2. অ্যান্ড্রয়েডে AlarmManager ব্যবহার করে সার্ভিস শুরু করার পদ্ধতি

  3. Android-এ AlarmManager ব্যবহার করার পদ্ধতি (Kotlin)

  4. Android-এ NavigationView ব্যবহার করে নেভিগেশন ড্রয়ার তৈরির পদ্ধতি