Menu

Jalankan Layanan Android di latar belakang dengan waktu setiap N detik


Dalam konteks eksperimen yang saya jalankan, itu diperlukan untuk menjalankan layanan latar belakang yang seharusnya berjalan setiap 15 detik dan tidak berhenti bahkan jika perangkat sedang menganggur. Meskipun persyaratan ini mungkin tampak tidak banyak bagi seseorang yang memiliki pengetahuan tentang pengembangan Android, ternyata hal ini tidak sepele seperti yang diperkirakan semula! Setelah googling tentang hal itu, Anda akan menemukan banyak cara berbeda untuk menjalankan layanan di latar belakang setiap beberapa detik, seperti menyetel alarm berulang! Pada dasarnya ada dua masalah yang ditemukan dengan cara-cara ini, pertama adalah bahwa mereka tidak selalu tepat. Ambil contoh alarm berulang, ternyata setelah beberapa waktu itu tidak lagi menghormati 15 detik tetapi berjalan pada jumlah waktu sewenang-wenang yang ditentukan oleh sistem android.

Jadi seperti yang dapat Anda bayangkan dalam artikel ini, saya menyajikan kepada Anda solusi yang berfungsi dengan andal sesuai dengan persyaratan yang kami tetapkan.

Sebelum melanjutkan, saya ingin menekankan bahwa solusi ini TIDAK boleh disertakan dalam aplikasi yang mengarah ke pasar karena mungkin akan berdampak negatif pada baterai dan pengalaman pengguna. Cara yang diusulkan untuk hal seperti itu dilakukan untuk aplikasi pasar adalah melalui Work Manager .

Idenya adalah sebagai berikut: alih-alih membuat alarm berulang yang tidak mematuhi batas 15 detik, kami membuat exact alarm that is allowed with the idle state . Triknya adalah setiap kali alarm berbunyi, kita setel lagi 15 detik kemudian! Kami sekarang akan membuat layanan latar belakang yang berjalan setiap 15 detik dan bersulang untuk kami!

Mari kita lihat sumber kelas yang membuat alarm:

package com.hadipurwanto.app;

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class AlarmReceiver extends BroadcastReceiver
{
    @Override
    public void onReceive(Context context, Intent intent)
    {
        Intent in = new Intent(context, MakeMyToast.class);
        context.startService(in);
        setAlarm(context);
    }

    public void setAlarm(Context context)
    {
        AlarmManager am =( AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
        Intent i = new Intent(context, AlarmReceiver.class);
        PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);
        assert am != null;
        am.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, (System.currentTimeMillis()/1000L + 15L) *1000L, pi); //Next alarm in 15s
    }
}

Ini adalah kelasnya AlarmReceiver. Metodenya setAlarm adalah yang benar-benar menyetel alarm agar terjadi dalam 15 detik, yang ketika dipicu, onReceive metode tersebut membuat Intent baru untuk kelas MakyMyToast dan menyetel ulang alarm sehingga akan berjalan lagi setelah 15 detik. Proses ini berulang tanpa akhir.

Kelas MakeMyToast adalah contoh layanan yang kita jalankan yang hanya bersulang setiap kali dijalankan. Yuk simak dibawah ini:

package com.hadipurwanto.app;

import android.app.Service;
import android.content.Intent;
import android.os.HandlerThread;
import android.os.IBinder;
import android.os.Process;
import android.util.Log;
import android.widget.Toast;



public class MakeMyToast extends Service {

    // This method run only one time. At the first time of service created and running
    @Override
    public void onCreate() {
        HandlerThread thread = new HandlerThread("ServiceStartArguments",
                Process.THREAD_PRIORITY_BACKGROUND);
        thread.start();
        Log.d("onCreate()", "After service created");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        //Here is the source of the TOASTS :D
        Toast.makeText(this, "Freshly Made toast!", Toast.LENGTH_SHORT).show();
        
        return START_STICKY;
    }

    @Override
    public IBinder onBind(Intent intent) {
        // We don't provide binding
        return null;
    }

}

The onStartCommand metode adalah di mana Toast sedang dihasilkan. Perhatikan START_STICKY di sana, karena ia memberitahu Sistem Android untuk membuat ulang layanan jika kehabisan memori dan perlu mengosongkan sebagian. Dengan cara ini layanan tetap aktif!

Terakhir kelas MainActivity :

package com.hadipurwanto.app;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

    private static final int STORAGE_PERMISSION_CODE = 1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        AlarmReceiver alarm = new AlarmReceiver();
        alarm.setAlarm(this);
    }
}

Semuanya sederhana di sini, buat AlarmReceiver dan panggil setAlarm sehingga loop tanpa akhir kita dapat dimulai.

Akhirnya untuk menyelesaikan daftar berikut, Anda akan menemukan androidmanifest di mana layanan dan penerima dideklarasikan

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.erev0s.keepthetoastscomming">

    <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 android:name="com.hadipurwanto.app.MakeMyToast" android:process=":remote"></service>
        <receiver android:name="com.hadipurwanto.app.AlarmReceiver" android:process=":remote" />
    </application>

</manifest>

Saya harap artikel ini akan membantu seseorang dan menghemat waktu ketika Anda mencoba membuat ulang skenario serupa. Harap perhatikan juga seperti yang disebutkan di awal bahwa metode ini tidak seharusnya digunakan untuk aplikasi yang bermaksud masuk ke pasar karena pengalaman pengguna mungkin tidak ideal.

5 1 vote
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments