即使应用关闭,也会在特定时间每天触发本地通知

时间:2016-05-20 07:39:36

标签: android alarmmanager android-notifications

即使我的应用未运行,我也必须每天在特定时间(比如说早上7点)向我的应用中的用户显示通知。(已关闭)

由于通知的内容是用户特定的,我无法使用(GCM)推送

我已经阅读了很多教程和答案但是我无法在应用关闭(不运行)时显示通知。

编辑:使用以下代码,我可以在我的应用运行时创建通知,如果我关闭我的应用通知正在显示

这是我的主要活动

public class MainActivity extends AppCompatActivity {
Button setAlarm;

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

    setAlarm = (Button) findViewById(R.id.set_alarm);
    setAlarm.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            NotificationEventReceiver.setupAlarm(getApplicationContext());
        }
    });
}
@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    setIntent(intent);
}
}

当我单击设置的警报按钮时,NotificationEventReciver将调用

public class NotificationEventReceiver extends WakefulBroadcastReceiver {
private static final String ACTION_START_NOTIFICATION_SERVICE = "ACTION_START_NOTIFICATION_SERVICE";
private static final String ACTION_DELETE_NOTIFICATION = "ACTION_DELETE_NOTIFICATION";


public static void setupAlarm(Context context) {
    AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(context, NotificationEventReceiver.class);
    PendingIntent alarmIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, getTriggerAt(new Date()), 2 * 60 * 1000, alarmIntent);

}
private static long getTriggerAt(Date now) {
    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(System.currentTimeMillis());
    calendar.set(Calendar.HOUR_OF_DAY, 17);
    calendar.set(Calendar.MINUTE, 10);
    System.err.println(now.getTime()+"----->"+ calendar.getTimeInMillis());
    return calendar.getTimeInMillis();
}

public static void cancelAlarm(Context context) {
    AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    PendingIntent alarmIntent = getStartPendingIntent(context);
    alarmManager.cancel(alarmIntent);
}


private static PendingIntent getStartPendingIntent(Context context) {
    Intent intent = new Intent(context, NotificationEventReceiver.class);
    intent.setAction(ACTION_START_NOTIFICATION_SERVICE);
    return PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
}

public static PendingIntent getDeleteIntent(Context context) {
    Intent intent = new Intent(context, NotificationEventReceiver.class);
    intent.setAction(ACTION_DELETE_NOTIFICATION);
    return PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
}

@Override
public void onReceive(Context context, Intent intent) {
    Intent serviceIntent =  NotificationIntentService.createIntentStartNotificationService(context);
    if (serviceIntent != null) {
        System.err.println("onReceive inside not null");
        // Start the service, keeping the device awake while it is launching.
        startWakefulService(context, serviceIntent);
    }
}
}

我的服务类将在闹钟响起时运行。

public class NotificationIntentService extends IntentService {

private static final int NOTIFICATION_ID = 1;
private static final String ACTION_START = "ACTION_START";
private static final String ACTION_DELETE = "ACTION_DELETE";

public NotificationIntentService() {
    super(NotificationIntentService.class.getSimpleName());
}

public static Intent createIntentStartNotificationService(Context context) {
    Intent intent = new Intent(context, NotificationIntentService.class);
    intent.setAction(ACTION_START);
    return intent;
}

@Override
protected void onHandleIntent(Intent intent) {
    System.err.println("onHandleIntent, started handling a notification event");
    try {
        String action = intent.getAction();
        if (ACTION_START.equals(action)) {
            System.err.println("enters the loop ACTION_START");
            processStartNotification();
        }
    } finally {
        WakefulBroadcastReceiver.completeWakefulIntent(intent);
    }
}


private void processStartNotification() {
    // Do something. For example, fetch fresh data from backend to create a rich notification?
    System.err.println("inside the notify method");
    Intent mainIntent = new Intent(this, MainActivity.class);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, NOTIFICATION_ID, mainIntent, PendingIntent.FLAG_UPDATE_CURRENT);

    final NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
    builder.setContentTitle("Scheduled Notification")
            .setAutoCancel(true)
            .setColor(getResources().getColor(R.color.colorAccent))
            .setContentText("This notification has been triggered by Notification Service")
            .setSmallIcon(R.drawable.ic_launcher);

    builder.setContentIntent(pendingIntent);

    final NotificationManager manager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);
    manager.notify(NOTIFICATION_ID, builder.build());
}
}

1 个答案:

答案 0 :(得分:4)

AlarmManager am = (AlarmManager) cont .getSystemService(cont.ALARM_SERVICE); Intent intent = new Intent(cont, MyReceiver.class); intent.setAction(MyReceiver.ACTION_ALARM_RECEIVER); boolean isWorking = (PendingIntent.getBroadcast(cont, 1001, intent, PendingIntent.FLAG_NO_CREATE) != null); if (isWorking) { // first cancel previous alarm Intent intent = new Intent(cont, MyReceiver.class);// the same as up intent.setAction(MyReceiver.ACTION_ALARM_RECEIVER);// the same as up PendingIntent pI = PendingIntent.getBroadcast(cont, 1001, intent, PendingIntent.FLAG_CANCEL_CURRENT);// the same as up am.cancel(pI);// important pI.cancel();// important } else { Intent intent1 = new Intent(cont, MyReceiver.class); intent1.setAction(MyReceiver.ACTION_ALARM_RECEIVER); PendingIntent pendingIntent = PendingIntent .getBroadcast(cont, 0, intent1, PendingIntent.FLAG_UPDATE_CURRENT); AlarmManager am = (AlarmManager) cont .getSystemService(cont.ALARM_SERVICE); am.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent); } 方法中尝试此操作 -

{{1}}

希望这有帮助! :)