Soru & Cevap

BOOT_COMPLETED i nasıl çalıştıracağımı bulamadım. ...

09.12.2019 - 07:46

Gün içinde 3 adet bildirim gönderen bir uygulama yaptım. Ancak telefon kapanıp açıldığında yada yeniden başlatıldığında AlarmManager ile kurduğum alarmlar iptal oluyor. Ben telefon açıldığında alarmları yeniden kurmak istiyorum ancak bir türlü yapamadım. Sizce sebebi ne olabilir.

AlarmService çalışıyor uygulama içinden çalıştırıyorum hiç bir sorun olmuyor.

AndroidManifest.XML

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

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

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:networkSecurityConfig="@xml/network_security_config"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <activity android:name=".InstallActivity" />
        <activity android:name=".SendItemActivity" />
        <activity android:name=".SettingsActivity" />
        <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=".BootReceiver" android:enabled="true" android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.REBOOT"/>
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
            </intent-filter>
        </receiver>
        <receiver android:name=".AlarmReceiver" android:enabled="true" android:exported="true" />

        <service android:name=".GetItemService" android:enabled="true" android:exported="true" />
        <service android:name=".SetAlarmService" android:enabled="true" android:exported="true" />
    </application>

</manifest>

BootReceiver

class BootReceiver : BroadcastReceiver(){
    override fun onReceive(context: Context, intent: Intent) {

        if(Intent.ACTION_BOOT_COMPLETED == intent.action){

                val nIntent = Intent(context, SetAlarmService::class.java)
                context.startService(nIntent)

        }

    }
}

SetAlarmService

class SetAlarmService : Service() {
    override fun onBind(intent: Intent?): IBinder? {
        return null
    }

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        AswFunctions().setAlarm(applicationContext)
        return super.onStartCommand(intent, flags, startId)
    }
}

 

11 Görüntülenme

1 Cevap

Sitedeki sorulara cevap verebilmek için giriş yapın ya da üye olun.

Profile picture for user f.erenyucal
f.erenyucal
18.02.2023 - 03:10

Merhabalar Furkan. Sorununuz, BOOT_COMPLETED olayını alıp almadığınızda olabilir. Bu olayı almak için izin vermeniz gerekir. AndroidManifest.xml dosyanızda, <uses-permission> etiketi altında RECEIVE_BOOT_COMPLETED iznini eklediğinizden emin olun

Ayrıca, BOOT_COMPLETED işlemi biraz yavaş olabilir. Yani, SetAlarmService sınıfının hemen çalıştığından emin olmak için, BootReceiver sınıfında biraz gecikme ekleyebilirsiniz. Örneğin, 5 saniye beklemek için şu kodu ekleyebilirsiniz

 

class BootReceiver : BroadcastReceiver(){
    override fun onReceive(context: Context, intent: Intent) {

        if(Intent.ACTION_BOOT_COMPLETED == intent.action){

            Handler(Looper.getMainLooper()).postDelayed({
                val nIntent = Intent(context, SetAlarmService::class.java)
                context.startService(nIntent)
            }, 5000) // 5 saniye beklet

        }

    }
}

 

Ayrıca, startService() yöntemini çağırmak yerine startForegroundService() yöntemini kullanmanızı öneririm. startForegroundService() yöntemi, hizmetin ön planda çalıştığını belirten bir bildirim gösterir. Bu, uygulamanın kullanıcının farkında olmadan arka planda çalışmasını önleyebilir ve kullanıcının işletim sistemi tarafından sonlandırılmasına neden olan batarya tasarrufu veya performans sorunlarını önleyebilir

Örneğin, SetAlarmService sınıfındaki onStartCommand() yöntemini aşağıdaki gibi güncelleyebilirsiniz

 

override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
    val notification = NotificationCompat.Builder(this, CHANNEL_ID)
            .setContentTitle(getString(R.string.notification_title))
            .setContentText(getString(R.string.notification_content))
            .setSmallIcon(R.drawable.ic_notification)
            .build()

    startForeground(1, notification)

    AswFunctions().setAlarm(applicationContext)

    return START_STICKY
}

Teşekkürler