Archie.bpgc
Archie.bpgc

Reputation: 24012

Android: Status bar Notifications using a Service

In one of my Activities Activity_A i have overrode onResume() this way:

protected void onResume() {

super.onResume();
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
Intent i = new Intent(this, NotificationsService.class);
PendingIntent pi = PendingIntent.getService(this, 0, i, PendingIntent.FLAG_UPDATE_CURRENT);
am.cancel(pi);
am.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + 20000, 20000, pi);
}

To start a Notification after 20 secs and then repeat it every 20 secs.

But this is not working, i am not getting any Notification even after 5-10 mins.What am i missing.

NotificationService Class:

public class NotificationsService extends Service {

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

        handleIntent(intent);
        return START_NOT_STICKY;
    }

    private NotificationManager nm;
    private WakeLock mWakeLock;

    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        mWakeLock.release();
    }

    private void showNotification() {

        nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        Notification notification = new Notification(R.drawable.icon,
                "This is a Notification", System.currentTimeMillis());
        notification.flags = Notification.FLAG_AUTO_CANCEL;
        Intent i = new Intent(this, Activity_B.class);
        PendingIntent contentIntent = PendingIntent.getActivity(this, 0, i,
                PendingIntent.FLAG_UPDATE_CURRENT);
        notification.setLatestEventInfo(this, "New Notifications",
                "Notification Content", contentIntent);
        nm.notify(R.string.app_name, notification);
    }

    private class PollTask extends AsyncTask<Void, Void, Void> {

        @Override
        protected Void doInBackground(Void... params) {
            showNotification();
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {

            stopSelf();
        }
    }

    private void handleIntent(Intent intent) {

        PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE);
        mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
                "NotificationsService");
        mWakeLock.acquire();
        ConnectivityManager cm = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
        if (!cm.getBackgroundDataSetting()) {
            stopSelf();
            return;
        }
        new PollTask().execute();
    }
}

and my BroadcastService class to call this Notification is:

public class MyScheduleReceiver extends BroadcastReceiver {

    private static final long REPEAT_TIME = 60000;

    @Override
    public void onReceive(Context context, Intent intent) {
        AlarmManager service = (AlarmManager) context
                .getSystemService(Context.ALARM_SERVICE);
        Intent i = new Intent(context, NotificationsService.class);
        PendingIntent pending = PendingIntent.getService(context, 0, i,
                PendingIntent.FLAG_CANCEL_CURRENT);
        service.cancel(pending);
        service.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
                SystemClock.elapsedRealtime() + REPEAT_TIME, REPEAT_TIME, pending);
    }
}

and i have included this in the Manifest.xml as:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.Android.WiC_MobileApp"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="10"
        android:targetSdkVersion="14" />

    <uses-feature android:name="android.hardware.camera" />
    <uses-feature android:name="android.hardware.camera.autofocus" />

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

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@android:style/Theme.Light" >
        <activity
            android:name=".Activity_A"
            android:configChanges="orientation|keyboardHidden"
            android:label="@string/app_name"
            android:screenOrientation="portrait" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".Activity_B"
            android:configChanges="orientation|keyboardHidden"
            android:excludeFromRecents="true"
            android:label="@string/app_name"
            android:launchMode="singleTask"
            android:screenOrientation="portrait"
            android:taskAffinity="" />

        <service
            android:name="NotificationsService"
            android:icon="@drawable/icon"
            android:label="Notifications"
            android:process=":my_process" >
        </service>

        <receiver android:name=".MyScheduleReceiver" >
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>
    </application>

</manifest>

Thank You

Upvotes: 3

Views: 5633

Answers (2)

Archie.bpgc
Archie.bpgc

Reputation: 24012

The problem is with the Service name in the Manifest

<service
   android:name="NotificationsService"
   android:icon="@drawable/icon"
   android:label="Notifications">
</service>

The Service is not in the same package as the Activity was, hence changing it to the following worked.

<service
   android:name="com.android.myApp.Services.NotificationsService"
   android:icon="@drawable/icon"
   android:label="Notifications">
</service>

Upvotes: 0

Givi
Givi

Reputation: 3283

You should change PendingIntent.getService to PendingIntent.getActivity

Upvotes: 1

Related Questions