Cómo enviar notificación si el usuario inactivo durante 3 días

Estoy desarrollando una aplicación para Android y quiero enviar la notificación "We Miss You" al usuario si está inactivo por más de 3 días. Esto significa que si el usuario no abre nuestra aplicación durante 3 días quiero enviarles una notificación de "We Miss you" Como Deer Hunter y Temple Run envía Gracias 🙂

Desea establecer una alarma que inicie un servicio de corta duración una vez al día. Todo lo que hace el servicio es comprobar algo como una preferencia compartida por el último tiempo usado. Si ese tiempo tiene más de 3 días de antigüedad, el servicio envía una notificación. De cualquier manera, el servicio sale.

Como alternativa, su aplicación podría enviar una alarma, cada vez que se ejecuta, que se define para disparar en 3 días y se define para reemplazar cualquier alarma preexistente con el mismo ID. Esta alarma se definiría para abrir un servicio de corta duración que envía una notificación.

He aquí un ejemplo de código que demuestra el segundo enfoque. Como se escribe, sólo actualiza el tiempo de ejecución al arrancar. Si su aplicación es de larga duración, tendrá que llamar a recordRunTime() periódicamente. El método obsoleto getNotification() podría ser reemplazado por build() si el objeto Notification.Builder fue reemplazado por un NotificationCompat.Builder. Puede usar la línea comentada para delay para probar con un tiempo de retardo más corto.

MainActivity.java:

 package com.example.comeback; import android.app.Activity; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; import android.util.Log; import android.view.View; public class MainActivity extends Activity { private final static String TAG = "MainActivity"; public final static String PREFS = "PrefsFile"; private SharedPreferences settings = null; private SharedPreferences.Editor editor = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main_activity); // Save time of run: settings = getSharedPreferences(PREFS, MODE_PRIVATE); editor = settings.edit(); // First time running app? if (!settings.contains("lastRun")) enableNotification(null); else recordRunTime(); Log.v(TAG, "Starting CheckRecentRun service..."); startService(new Intent(this, CheckRecentRun.class)); } public void recordRunTime() { editor.putLong("lastRun", System.currentTimeMillis()); editor.commit(); } public void enableNotification(View v) { editor.putLong("lastRun", System.currentTimeMillis()); editor.putBoolean("enabled", true); editor.commit(); Log.v(TAG, "Notifications enabled"); } public void disableNotification(View v) { editor.putBoolean("enabled", false); editor.commit(); Log.v(TAG, "Notifications disabled"); } 

}

CheckRecentRun.java:

 package com.example.comeback; import android.app.AlarmManager; import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.app.Service; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.os.IBinder; import android.util.Log; public class CheckRecentRun extends Service { private final static String TAG = "CheckRecentPlay"; private static Long MILLISECS_PER_DAY = 86400000L; private static Long MILLISECS_PER_MIN = 60000L; // private static long delay = MILLISECS_PER_MIN * 3; // 3 minutes (for testing) private static long delay = MILLISECS_PER_DAY * 3; // 3 days @Override public void onCreate() { super.onCreate(); Log.v(TAG, "Service started"); SharedPreferences settings = getSharedPreferences(MainActivity.PREFS, MODE_PRIVATE); // Are notifications enabled? if (settings.getBoolean("enabled", true)) { // Is it time for a notification? if (settings.getLong("lastRun", Long.MAX_VALUE) < System.currentTimeMillis() - delay) sendNotification(); } else { Log.i(TAG, "Notifications are disabled"); } // Set an alarm for the next time this service should run: setAlarm(); Log.v(TAG, "Service stopped"); stopSelf(); } public void setAlarm() { Intent serviceIntent = new Intent(this, CheckRecentRun.class); PendingIntent pi = PendingIntent.getService(this, 131313, serviceIntent, PendingIntent.FLAG_CANCEL_CURRENT); AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE); am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + delay, pi); Log.v(TAG, "Alarm set"); } public void sendNotification() { Intent mainIntent = new Intent(this, MainActivity.class); @SuppressWarnings("deprecation") Notification noti = new Notification.Builder(this) .setAutoCancel(true) .setContentIntent(PendingIntent.getActivity(this, 131314, mainIntent, PendingIntent.FLAG_UPDATE_CURRENT)) .setContentTitle("We Miss You!") .setContentText("Please play our game again soon.") .setDefaults(Notification.DEFAULT_ALL) .setSmallIcon(R.drawable.ic_launcher) .setTicker("We Miss You! Please come back and play our game again soon.") .setWhen(System.currentTimeMillis()) .getNotification(); NotificationManager notificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE); notificationManager.notify(131315, noti); Log.v(TAG, "Notification sent"); } @Override public IBinder onBind(Intent intent) { return null; } } 

main_activity_layout:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="enableNotification" android:text="@string/enable" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="disableNotification" android:text="@string/disable" /> </LinearLayout> 

strings.xml:

 <?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">Come Back</string> <string name="enable">Enable Notifications</string> <string name="disable">Disable Notifications</string> </resources> 

AndroidManifest.com:

 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.comeback" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="11" android:targetSdkVersion="19" /> <uses-permission android:name="android.permission.VIBRATE" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.comeback.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <service android:name="com.example.comeback.CheckRecentRun" > </service> </application> </manifest> 

Usted podría tener algo como:

Cuando un usuario abre la aplicación, la registra en una base de datos en su sitio web y tiene un trabajo cron (o algún otro equivalente) para ejecutar todos los días a las 3pm hora y si la última fecha abierta de los usuarios es hace más de 3 días enviar la notificación .

O

Cuando un usuario abre la aplicación, la registra en una base de datos sqlite en su aplicación y configura un administrador de alarmas durante 3 días. Cada vez que la aplicación está abierta, la alarma se reinicia. Una vez transcurridos los 3 días, se crea una notificación.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.