每分钟创建一次通知

问题描述 投票:0回答:1

我想每分钟创建一次通知,我每隔48小时从另一个关于通知的问题中提取代码,但应用程序正在运行,并且通知不会被创建。我究竟做错了什么?显示通知:

public class ShowNotification extends Service {

    private final static String TAG = "ShowNotification";

    @Override
    public void onCreate() {
        super.onCreate();

        Intent mainIntent = new Intent(this, MainActivity.class);

        NotificationManager notificationManager
                = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);

        Notification noti = new NotificationCompat.Builder(this)
                .setAutoCancel(true)
                .setContentIntent(PendingIntent.getActivity(this, 0, mainIntent,
                        PendingIntent.FLAG_UPDATE_CURRENT))
                .setContentTitle("New SMS " + System.currentTimeMillis())
                .setContentText("Hello")
                .setDefaults(Notification.DEFAULT_ALL)
                .setSmallIcon(R.drawable.ic_email_white_24dp)
                .setTicker("ticker message")
                .setWhen(System.currentTimeMillis())
                .build();

        notificationManager.notify(0, noti);

        Log.i(TAG, "Notification created");
    }

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

主要内容:

context = MainActivity.this;
        Intent notificationIntent = new Intent(context, ShowNotification.class);
        PendingIntent contentIntent = PendingIntent.getService(context, 0, notificationIntent,
                PendingIntent.FLAG_CANCEL_CURRENT);

        AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        am.cancel(contentIntent);
        am.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()
                , 1000*60, contentIntent);
android android-notifications android-alarms
1个回答
1
投票

情侣建议:

  1. 使用IntentService实现通知触发代码。如果您使用的是android studio,则可以使用非常简单的向导进行制作。只需右键单击包>新建>服务>服务(意图服务)。将通知触发代码放在handle操作方法中。这需要在清单中声明。
  2. 定义一个BroadcastReceiver,最好是在一个不同的文件中,该文件调用静态方法在其onReceive()中启动intent服务。这也可以在向导中的new> others> BroadcastReciever中使用。这也需要在清单中声明。
  3. 创建一个静态方法来初始化警报(我把它放在IntentService本身中)并从主活动中调用它。
  4. 就像现在一样,您为通知提供相同的ID(0)。这只会替换原始通知,而不是创建新通知。

以下代码可能有所帮助:(我使用向导构建它,因此如果它们不准确,请忽略自动生成的注释)

IntentService:

import android.app.AlarmManager;
import android.app.IntentService;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.content.Context;
import android.support.v7.app.NotificationCompat;


import java.util.Calendar;

/**
 * An {@link IntentService} subclass for handling asynchronous task requests in
 * a service on a separate handler thread.
 * <p/>
 * helper methods.
 */
public class NotificationIntentService extends IntentService {
    // TODO: Rename actions, choose action names that describe tasks that this
    // IntentService can perform, e.g. ACTION_FETCH_NEW_ITEMS
    private static final String ACTION_FIRENOTIF = "com.example.alarmnotif.action.FOO";

    public NotificationIntentService() {
        super("NotificationIntentService");
    }
    public static void initAlarm(Context context) {
        Calendar updateTime = Calendar.getInstance();
        Intent downloader = new Intent(context, AlarmReceiver.class);
        PendingIntent recurringSync = PendingIntent.getBroadcast(context,
                0, downloader, PendingIntent.FLAG_CANCEL_CURRENT);

        AlarmManager alarms = (AlarmManager) context.getSystemService(
                Context.ALARM_SERVICE);
        alarms.setInexactRepeating(AlarmManager.RTC_WAKEUP,
                updateTime.getTimeInMillis(),
                60000, recurringSync);
    }

    /**
     * Starts this service to perform action FireNotif with the given parameters. If
     * the service is already performing a task this action will be queued.
     *
     * @see IntentService
     */
    public static void startActionFireNotif(Context context) {
        Intent intent = new Intent(context, NotificationIntentService.class);
        intent.setAction(ACTION_FIRENOTIF);
        context.startService(intent);
    }


    @Override
    protected void onHandleIntent(Intent intent) {
        if (intent != null) {
            final String action = intent.getAction();
            if (ACTION_FIRENOTIF.equals(action)) {
                handleActionFireNotif();
            }
        }
    }

    /**
     * Handle actionFireNotif in the provided background thread with the provided
     * parameters.
     */
    private void handleActionFireNotif() {
        Intent mainIntent = new Intent(this, MainActivity.class);

        NotificationManager notificationManager
                = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);

        Notification noti = new NotificationCompat.Builder(this)
                .setAutoCancel(true)
                .setContentIntent(PendingIntent.getActivity(this, 0, mainIntent,
                        PendingIntent.FLAG_UPDATE_CURRENT))
                .setContentTitle("New SMS " + System.currentTimeMillis())
                .setContentText("Hello")
                .setDefaults(Notification.DEFAULT_ALL)
                .setSmallIcon(R.drawable.ic_email_white_24dp)
                .setTicker("ticker message")
                .setWhen(System.currentTimeMillis())
                .build();

        notificationManager.notify(0, noti);

    }


}

AlarmReciever:

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class AlarmReceiver extends BroadcastReceiver {
    public AlarmReceiver() {
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        NotificationIntentService.startActionFireNotif(context);
    }
}

将以下内容添加到清单中:

    <service
        android:name=".alarmnotif.NotificationIntentService"
        android:exported="false" />

    <receiver
        android:name=".alarmnotif.AlarmReceiver"
        android:enabled="true"
        android:exported="false"></receiver>
© www.soinside.com 2019 - 2024. All rights reserved.