Excel1
Excel1

Reputation: 567

Send a notification when the app is closed

How is it possible to send a notification programmatically, when the App got completely closed?

Example: The User closed the App, also in the Android Taskmanager, and waits. The App should send a notification after X Seconds or when the App check for Updates.

I tried to work with these code examples but:

If you can, try to explain it at an example, because beginners (like me) can easier learn it this way.

Upvotes: 30

Views: 53463

Answers (4)

K. H. Tam
K. H. Tam

Reputation: 41

Following the answer from Nikhil Gupta and referring to the website provided by Bondolin in the comments, adding the attribute android:process=":remote" to the receiver allowed me to post a notification even when the app is completely closed.

<receiver
    android:name = ".utils.AlarmReceiver"
    android:process=":remote" >  <!-- this line is important -->
</receiver>

And the rest of the code is basically the same. An important thing to note is that the class AlarmReceiver should not contain any reference to the MainActivity, since when the app is closed, the MainActivity class is not instantiated. NullPointerException will be thrown if you attempt to reference MainActivity in the AlarmReceiver class when the app is closed.

Upvotes: 1

Nikhil Gupta
Nikhil Gupta

Reputation: 881

You can use alarm manager to do this [Not tested on latest Android versions and releases and is a pretty old answer]. Follow below steps :

  1. Use alarmmanager to create an alarm of after X seconds.

    Intent intent = new Intent(this, AlarmReceiver.class); intent.putExtra("NotificationText", "some text"); PendingIntent pendingIntent = PendingIntent.getBroadcast(this, ledgerId, intent, PendingIntent.FLAG_UPDATE_CURRENT); AlarmManager alarmManager = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE); alarmManager.set(AlarmManager.RTC_WAKEUP, 'X seconds in milliseconds', pendingIntent);

  2. Use a AlarmBroadCast receiver in your app.

Declare in manifest file :

<receiver android:name=".utils.AlarmReceiver">
    <intent-filter>
        <action android:name="android.media.action.DISPLAY_NOTIFICATION" />

        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</receiver>
  1. In the broadcast receiver's on receive, you can create the notification.

    public class AlarmReceiver extends BroadcastReceiver {

     @Override
     public void onReceive(Context context, Intent intent) {
         // create notification here
     }
    

    }

Upvotes: 8

Vaibhav Kadam
Vaibhav Kadam

Reputation: 699

You can use this service all you need to do is Start this service onStop() in your activity lifecycle. With this code: startService(new Intent(this, NotificationService.class)); then you can create a new Java Class and paste this code in it:

public class NotificationService extends Service {

    Timer timer;
    TimerTask timerTask;
    String TAG = "Timers";
    int Your_X_SECS = 5;


    @Override
    public IBinder onBind(Intent arg0) {
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.e(TAG, "onStartCommand");
        super.onStartCommand(intent, flags, startId);

        startTimer();

        return START_STICKY;
    }


    @Override
    public void onCreate() {
        Log.e(TAG, "onCreate");


    }

    @Override
    public void onDestroy() {
        Log.e(TAG, "onDestroy");
        stoptimertask();
        super.onDestroy();


    }

    //we are going to use a handler to be able to run in our TimerTask
    final Handler handler = new Handler();


    public void startTimer() {
        //set a new Timer
        timer = new Timer();

        //initialize the TimerTask's job
        initializeTimerTask();

        //schedule the timer, after the first 5000ms the TimerTask will run every 10000ms
        timer.schedule(timerTask, 5000, Your_X_SECS * 1000); //
        //timer.schedule(timerTask, 5000,1000); //
    }

    public void stoptimertask() {
        //stop the timer, if it's not already null
        if (timer != null) {
            timer.cancel();
            timer = null;
        }
    }

    public void initializeTimerTask() {

        timerTask = new TimerTask() {
            public void run() {

                //use a handler to run a toast that shows the current timestamp
                handler.post(new Runnable() {
                    public void run() {

                        //TODO CALL NOTIFICATION FUNC
                        YOURNOTIFICATIONFUNCTION();

                    }
                });
            }
        };
    }
}

After this you only need to combine the service with the manifest.xml:

<service
            android:name=".NotificationService"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="your.app.domain.NotificationService" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </service>

Upvotes: 18

Adarsh
Adarsh

Reputation: 310

You can check active apps using service and display notification if activity is not running.

Upvotes: 0

Related Questions