Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Android

วิธีเริ่ม Service ด้วย AlarmManager ใน Android

ภาพรวม

ตัวอย่างนี้สาธิตวิธีการใช้ AlarmManager เพื่อเริ่ม Service ในเวลาที่กำหนด (เช่น อีก 3 วินาที) และยกเลิกได้

ขั้นตอนที่ 1: สร้างโปรเจกต์ใหม่

เปิด Android Studio → File → New Project → กรอกรายละเอียดที่จำเป็น

ขั้นตอนที่ 2: จัดทำ Layout (res/layout/activity_main.xml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16sp"
    android:orientation="vertical"
    android:gravity="center_horizontal">

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/btnStartService"
        android:text="เริ่ม Service Alarm"
        android:layout_marginTop="30dp" />

    <Button
        android:id="@+id/btnStopService"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:text="ยกเลิก Service" />

</LinearLayout>

ขั้นตอนที่ 3: เขียนโค้ด MainActivity (src/MainActivity.java)

package app.com.sample;

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import java.util.Calendar;

public class MainActivity extends AppCompatActivity {
    Button btnStart, btnStop;
    PendingIntent pendingIntent;

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

        btnStart = findViewById(R.id.btnStartService);
        btnStop = findViewById(R.id.btnStopService);

        btnStart.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent myIntent = new Intent(MainActivity.this, MyAlarmService.class);
                pendingIntent = PendingIntent.getService(MainActivity.this, 0, myIntent,
                        PendingIntent.FLAG_IMMUTABLE); // API 23+

                AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
                Calendar calendar = Calendar.getInstance();
                calendar.setTimeInMillis(System.currentTimeMillis());
                calendar.add(Calendar.SECOND, 3); // 3 วินาทีจากตอนนี้

                assert alarmManager != null;
                alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
                Toast.makeText(MainActivity.this, "กำลังเริ่ม Service Alarm", Toast.LENGTH_LONG).show();
            }
        });

        btnStop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
                assert alarmManager != null;
                alarmManager.cancel(pendingIntent);
                Toast.makeText(MainActivity.this, "ยกเลิก Service แล้ว", Toast.LENGTH_LONG).show();
            }
        });
    }
}

ขั้นตอนที่ 4: สร้าง Service Class (MyAlarmService.java)

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.widget.Toast;

public class MyAlarmService extends Service {

    @Override
    public void onCreate() {
        super.onCreate();
        Toast.makeText(this, "MyAlarmService.onCreate()", Toast.LENGTH_LONG).show();
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        Toast.makeText(this, "MyAlarmService.onBind()", Toast.LENGTH_LONG).show();
        return null;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Toast.makeText(this, "MyAlarmService.onDestroy()", Toast.LENGTH_LONG).show();
    }

    @Override
    public void onStart(Intent intent, int startId) {
        super.onStart(intent, startId);
        Toast.makeText(this, "MyAlarmService.onStart()", Toast.LENGTH_LONG).show();
    }

    @Override
    public boolean onUnbind(Intent intent) {
        Toast.makeText(this, "MyAlarmService.onUnbind()", Toast.LENGTH_LONG).show();
        return super.onUnbind(intent);
    }
}

ขั้นตอนที่ 5: กำหนดค่า AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
    package="app.com.sample">

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

        <!-- ลงทะเบียน Service -->
        <service android:name=".MyAlarmService" />

    </application>
</manifest>

ประเภท AlarmManager

ประเภท คำอธิบาย
RTC_WAKEUP ปลุกอุปกรณ์จากโหมดนอน เพื่อรัน Intent ตรงเวลา
RTC รันตอนอุปกรณ์ตื่นอยู่แล้ว (ไม่ปลุก)
ELAPSED_REALTIME_WAKEUP ใช้เวลาตั้งแต่บูท (SystemClock.elapsedRealtime()) + ปลุกอุปกรณ์
ELAPSED_REALTIME ใช้เวลาตั้งแต่บูท ไม่ปลุกอุปกรณ์

การทดสอบ

รันแอป กด "เริ่ม Service Alarm\" รอ 3 วินาที จะเห็น Toast จาก Service ทำงาน กด "ยกเลิก Service\" จะยกเลิกได้

วิธีเริ่ม Service ด้วย AlarmManager ใน Android


วิธีเริ่ม Service ด้วย AlarmManager ใน Android


วิธีเริ่ม Service ด้วย AlarmManager ใน Android


วิธีเริ่ม Service ด้วย AlarmManager ใน Android

หมายเหตุ: Android 6+ (Doze Mode) และ Android 8+ (Background Execution Limits) จำกัด AlarmManager ให้ใช้ setExactAndAllowWhileIdle() หรือ setAlarmClock() สำหรับงานที่ต้องแม่นยำ และควรใช้ WorkManager สำหรับงานเบื้องหลังทั่วไป