Background service using alarm manager

Shanmugapriyan picture Shanmugapriyan · Nov 5, 2016 · Viewed 11.5k times · Source

I have followed below example code for implementing Periodic background service. Periodic task executes correctly If app on foreground on 1st time. If, I close application then Background service is not working.

https://github.com/codepath/android_guides/wiki/Starting-Background-Services#using-with-alarmmanager-for-periodic-tasks

1) BroadcastReceiver service for Bootcomplete

public class BootBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
    // Launch the specified service when this message is received
    Intent startServiceIntent = new Intent(context, MyTestService.class);
    context.startService(startServiceIntent);
}
}

2) BroadcastReceiver to start service

public class MyAlarmReceiver extends BroadcastReceiver {
public static final int REQUEST_CODE = 12345;

// Triggered by the Alarm periodically (starts the service to run task)
@Override
public void onReceive(Context context, Intent intent) {
    Intent i = new Intent(context, MyTestService.class);
    i.putExtra("foo", "bar");
    context.startService(i);
    Toast.makeText(context, "Welcome --------1", Toast.LENGTH_LONG).show();
}
}

3) IntenetService class: To execute my background task

public class MyTestService extends IntentService {


// Must create a default constructor
public MyTestService() {
    // Used to name the worker thread, important only for debugging.
    super("test-service");
}

@Override
public void onCreate() {
    super.onCreate(); // if you override onCreate(), make sure to call super().
}

@Override
protected void onHandleIntent(Intent intent) {
}   
}

4) Service is started from activity as

public class MainActivity extends AppCompatActivity {

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

// Setup a recurring alarm every half hour
public void scheduleAlarm() {
    // Construct an intent that will execute the AlarmReceiver
    Intent intent = new Intent(getApplicationContext(), MyAlarmReceiver.class);
    // Create a PendingIntent to be triggered when the alarm goes off
    final PendingIntent pIntent = PendingIntent.getBroadcast(this, MyAlarmReceiver.REQUEST_CODE,
            intent, PendingIntent.FLAG_UPDATE_CURRENT);
    // Setup periodic alarm every 5 seconds
    long firstMillis = System.currentTimeMillis(); // alarm is set right away
    AlarmManager alarm = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
    // First parameter is the type: ELAPSED_REALTIME, ELAPSED_REALTIME_WAKEUP, RTC_WAKEUP
    // Interval can be INTERVAL_FIFTEEN_MINUTES, INTERVAL_HALF_HOUR, INTERVAL_HOUR, INTERVAL_DAY
    alarm.setRepeating(AlarmManager.RTC_WAKEUP, firstMillis,
            30000, pIntent);
}
}

5) Manifest file

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

<permission
    android:name="test.org.help.permission.C2D_MESSAGE"
    android:protectionLevel="signature" />

<uses-permission android:name="au.com.KPS.companion.ACCESS_DATA" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.FLASHLIGHT" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="test.org.help.permission.UA_DATA" />
<!-- GCM requires a Google account. -->
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<!-- This app has permission to register with GCM and receive message -->
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-permission android:name="test.org.help.permission.C2D_MESSAGE" />

<uses-feature
    android:name="android.hardware.camera"
    android:required="false" />
<uses-feature
    android:name="android.hardware.camera.autofocus"
    android:required="false" />
<uses-feature
    android:name="android.hardware.camera.flash"
    android:required="false" />
<uses-feature android:name="android.hardware.screen.landscape" />

<application
    android:name="test.org.help.KPSApp"
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:logo="@drawable/ic_actionbar_logo"
    android:theme="@style/AppTheme"
    tools:replace="android:icon, android:logo">

    <!-- Activities -->
    <activity
        android:name="test.org.help.ui.activity.SplashActivity"
        android:label="@string/app_name"
        android:screenOrientation="portrait"
        android:theme="@style/SplashTheme">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name=".ui.activity.JanRainLoginActivity"
        android:screenOrientation="portrait" />
    <activity
        android:name=".ui.activity.LinkListActivity"
        android:screenOrientation="portrait" />
    <activity
        android:name="test.org.help.ui.activity.KPSFragmentActivity"
        android:exported="true"
        android:screenOrientation="portrait"
        android:windowSoftInputMode="adjustResize"></activity>
    <activity
        android:name="test.org.help.ui.activity.NotificationDialogActivity"
        android:excludeFromRecents="true"
        android:label=""
        android:launchMode="singleInstance"
        android:noHistory="true"
        android:screenOrientation="portrait"
        android:taskAffinity=""
        android:theme="@style/AppTheme.Dialog.Notification"></activity>

    <receiver
        android:name="test.org.help.receivers.NotificationReceiver"
        tools:ignore="ExportedReceiver">
        <intent-filter>
            <action android:name="test.org.help.util.ACTION_SHOW_AGENDA" />
            <action android:name="test.org.help.util.ACTION_SNOOZE" />
            <action android:name="test.org.help.util.ACTION_DISMISS" />
            <action android:name="test.org.help.util.ACTION_SHOW_DIALOG" />

            <data android:scheme="KPS" />
            <data android:mimeType="text/plain" />
            <data android:pathPattern="au\.org\.KPS\.util/.*" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
    </receiver>

    <activity
        android:name="com.google.zxing.client.android.CaptureActivity"
        android:screenOrientation="landscape"
        android:theme="@android:style/Theme.Light.NoTitleBar"
        tools:replace="android:theme,android:screenOrientation"></activity>
    <activity
        android:name="test.org.help.ui.activity.AppTutorialActivity"
        android:screenOrientation="portrait"
        android:theme="@style/SplashTheme"></activity>
    <activity
        android:name="test.org.help.ui.activity.TermsAndConditionsActivity"
        android:label="@string/title_terms_and_conditions"
        android:screenOrientation="portrait"></activity>
    <activity
        android:name="test.org.help.ui.activity.WarningActivity"
        android:label="@string/title_Warning"
        android:screenOrientation="portrait"></activity>
    <activity
        android:name="test.org.help.ui.activity.DifferentUserWarningActivity"
        android:label="@string/title_Warning"
        android:screenOrientation="portrait"></activity>
    <activity
        android:name="test.org.help.ui.activity.AppWhatsNewActivity"
        android:label="@string/title_Warning"
        android:screenOrientation="portrait"></activity>

    <activity
        android:name=".ui.activity.UserUpgradeActivity"
        android:label="@string/title_upgrade"
        android:screenOrientation="portrait"></activity>

    <activity
        android:name="eu.janmuller.android.simplecropimage.CropImage"
        android:label=""
        android:screenOrientation="portrait"></activity>

    <!-- Facebook -->
    <meta-data
        android:name="com.facebook.sdk.ApplicationId"
        android:value="@string/facebook_app_id" />

    <!-- Services -->

    <receiver android:name="com.mobileapptracker.Tracker">
        <intent-filter>
            <action android:name="com.android.vending.INSTALL_REFERRER" />
        </intent-filter>
    </receiver>

    <service
        android:name="test.org.help.service.DBUpdateService"
        android:exported="false"
        android:label="@string/app_name">
        <intent-filter>
            <action android:name="test.org.help.service.DBUpdateService"></action>
        </intent-filter>
    </service>

    <receiver android:name="test.org.help.receivers.TimeChangeReceiver">
        <intent-filter>
            <action android:name="android.intent.action.TIMEZONE_CHANGED" />
        </intent-filter>
    </receiver>


    <activity
        android:name="com.janrain.android.engage.ui.JRFragmentHostActivity"
        android:configChanges="orientation|screenSize"
        android:screenOrientation="portrait"
        android:windowSoftInputMode="adjustResize|stateHidden" />
    <activity
        android:name="com.janrain.android.engage.ui.JRFragmentHostActivity$Fullscreen"
        android:configChanges="orientation|screenSize"
        android:screenOrientation="portrait"
        android:windowSoftInputMode="adjustResize|stateHidden" />

    <!--Hockey app crash report-->
    <meta-data
        android:name="net.hockeyapp.android.appIdentifier"
        android:value="@string/hockey_app_id" />

    <receiver android:name="test.org.help.syncmanager.Network.NetworkAvailability">
        <intent-filter>
            <action android:name=".android.action.broadcast" />
            <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
            <action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
        </intent-filter>
    </receiver>

    <activity
        android:name=".db.AndroidDatabaseManager"
        android:theme="@style/Theme.AppCompat.Light" /><!-- ATTENTION: This was auto-generated to add Google Play services to your project for
 App Indexing.  See https://g.co/AppIndexing/AndroidStudio for more information. -->
    <meta-data
        android:name="com.google.android.gms.version"
        android:value="@integer/google_play_services_version" />
    <service
        android:name=".syncmanager.auto.MyTestService"
        android:exported="false" />

    <receiver
        android:name=".syncmanager.auto.MyAlarmReceiver"
        android:process=":remote"></receiver>

    <receiver android:name=".syncmanager.auto.BootBroadcastReceiver">

    </receiver>
</application>

</manifest>

If, implement above as sample project as separate then, background service is executing fine always. But If try to integrate with my existing code then not working...

Edited: Found Solution It got resolved by adding full path android:name service in AndroidManifest.xml

<service
    android:name="test.org.help.syncmanager.auto.MyTestService"
    android:exported="false" />

Answer